2009-01-28 6 views
9

Я работал с диалектом Лиспа, но также изучал некоторые Haskell. Они имеют некоторое сходство, но основное отличие в Common Lisp состоит в том, что вам не нужно определять тип для каждой функции, аргумента и т. Д., Тогда как в Haskell вы это делаете. Кроме того, Haskell - это в основном скомпилированный язык. Запустите компилятор для генерации исполняемого файла.Используется как для статических сильных типизированных языков, таких как Haskell, так и для динамических (сильных) языков, таких как Common LIsp

Мой вопрос в том, существуют ли различные приложения или приложения, где язык, такой как Haskell, может иметь больше смысла, чем более динамичный язык, такой как Common Lisp. Например, кажется, что Lisp можно использовать для более детального программирования, например, при создании веб-сайтов или графических интерфейсов, где Haskell можно использовать, когда проверки времени компиляции более необходимы, например, при построении серверов TCP/IP или парсеров кода.

Популярные Lisp приложения: Emacs

Популярные Haskell приложения: мопсов Darcs

Согласны ли вы, и есть какие-либо исследования по этому вопросу?

ответ

14

Языки программирования - это инструменты для мышления. Вы можете выразить любую программу на любом языке, если вы готовы достаточно усердно работать. Главное значение, обеспечиваемое одним языком программирования над другим, - это то, насколько он помогает вам думать о проблемах по-разному.

Например, Haskell - это язык, который подчеркивает мысль о вашей проблеме с точки зрения типов. Если есть удобный способ выразить свою проблему с точки зрения типов данных Haskell, вы, вероятно, обнаружите, что это удобный язык для написания вашей программы.

Сильные стороны Лиспа (которые многочисленны) лежат в его динамическом характере и его гомоконичность (то есть программы Lisp очень легко представлять и манипулировать как данные Lisp). Lisp - это «программируемый язык программирования». Если ваша программа наиболее легко выражается на новом языке, например, Lisp делает это очень легко. Lisp (и другие динамические языки) хорошо подходят, если описание проблемы относится к данным, тип которых плохо указан или может измениться по мере развития.

Выбор языка часто является таким же эстетическим решением, как и все. Если ваши требования к проекту не ограничивают вас конкретными языками для совместимости, зависимости или причин производительности, вы также можете выбрать тот, который вы считаете лучшим.

5

Вы открываете несколько банок очень извращенных червей. Во-первых, все сильно против слабо типизированных языков. Во-вторых, функциональный и императивный язык может.

(На самом деле, мне очень интересно: на «диалект Лиспа» вы имеете в виду Clojure любой шанс, потому что это в значительной степени функциональным и ближе в некотором смысле к Haskell?).

Хорошо, так. Во-первых, вы можете написать практически любую программу практически в любом нормальном языке, с большим или меньшим усилием. Предполагаемое преимущество для сильной типизации заключается в том, что во время компиляции можно обнаружить большой класс ошибок. С другой стороны, легче вводить код с более типом языков. Common Lisp интересен тем, что это динамический язык с возможностью объявления и использования более сильных типов, что дает подсказки компилятора CL о том, как оптимизировать. (О, и реальный Common Lisp обычно реализуется вместе с компилятором, предоставляя вам возможность компиляции или привязки к интерпретируемому коду.)

Существует ряд исследований по сопоставлению нетипизированных, слабо типизированных и сильно типизированных языков. Эти исследования неизменно говорят, что один из них лучше, или говорят, что нет заметной разницы. Однако существует небольшое согласие от исследований.

Самая большая область, в которой может быть явное преимущество, заключается в решении сложных спецификаций для математических задач. В этих случаях (например, криптографические алгоритмы) функциональный язык, такой как Haskell, имеет преимущества, потому что проще проверить соответствие между кодом Haskell и базовым алгоритмом.

+2

Common Lisp также строго типизирован, он просто определяет тип во время выполнения, то есть он динамически типизирован (в отличие от статического, как Haskell). Не путайте «статический» <-> «динамический» со «слабым» <-> «сильный»! – Svante

+0

Кроме того, Common Lisp поддерживает широкий спектр стилей программирования, включая функциональное программирование, поэтому этот спор также является побочной темой (в том, что Haskell является «чистым», в то время как CL также поддается другим путям). – Svante

+1

Арлекин, * C * поддерживает функциональный стиль, если вы этого хотите. Haskell не имеет обязательного задания, Clojure разрешает его только в ограниченной специальной форме. Common Lisp позволяет вам писать функционально, но не применяет его, как Ruby и Python. –

4

Я прихожу в основном из общей перспективы Лиспа, и, насколько я вижу, Common Lisp подходит для любого приложения.

Да, по умолчанию используется динамическая типизация (т.е. обнаружение типа во время выполнения), но вы можете объявлять типы в любом случае для оптимизации (в качестве дополнительной заметки для других читателей: CL строго типизирован, не путайте слабые/сильные со статическими/динамический!).

Я мог представить, что Haskell может быть немного лучше подходит для замены Ada в секторе авионики, поскольку он заставляет во время компиляции, по крайней мере, все проверки типов.

Я не вижу, как CL не должен быть таким же полезным, как Haskell для серверов TCP/IP или парсеров кода - скорее наоборот, но мои контакты с Haskell пока неясны.

+4

Haskell не полезен в качестве замены Ada. Haskell часто имеет непредсказуемую производительность из-за ленивых структур данных и сбора мусора. Это нежелательно в программном обеспечении полета. –

3

Haskell - это чистый функциональный язык. Хотя он позволяет создавать императивные конструкции (используя монады), он, как правило, заставляет программиста рассматривать проблему совсем по-другому, используя более математически-ориентированный подход. Например, вы не можете переназначить другое значение переменной.

Утверждается, что это уменьшает вероятность совершения некоторых типов ошибок. Кроме того, программы, написанные в Haskell, как правило, короче и более краткими, чем те, которые написаны на типичных языках программирования. Haskell также сильно использует нестрогую ленивую оценку, которая теоретически позволяет компилятору сделать оптимизацию невозможной (наряду с парадигмой без побочных эффектов).

Поскольку вы спрашивали об этом, я считаю, что система набора Haskell довольно приятная и полезная. Он не только улавливает распространенные ошибки, но также может сделать код более кратким (!) И может эффективно заменить объектно-ориентированные конструкции с обычных языков OO.

Некоторые комплекты разработки Haskell, такие как GHC, также оснащены интерактивными средами.

0

Наилучшее использование для динамического ввода, которое я нашел, зависит от того, что вы не контролируете, чтобы его можно было использовать динамически. Например, получить информацию из документа XML мы могли бы сделать что-то вроде этого:

var volume = parseXML("mydoc.xml").speaker.volume() 

Не используя утку набрав приведет к чему-то вроде этого:

var volume = parseXML("mydoc.xml").getAttrib["speaker"].getAttrib["volume"].ToString() 

Выгода Haskell с другой стороны, находится в безопасности , Например, вы можете убедиться, используя типы, которые находятся в градусах Fahrenheit and Celsius are never mixed unintentionally. Кроме того, я считаю, что у статически типизированных языков есть лучшие IDE.