Используется как для статических языков со строгой типизацией, таких как Haskell, так и для динамических (сильных) языков, таких как Common LIsp - PullRequest
9 голосов
/ 28 января 2009

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

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

Популярные приложения на Лиспе: Emacs

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

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

Ответы [ 5 ]

14 голосов
/ 28 января 2009

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

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

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

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

5 голосов
/ 28 января 2009

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

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

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

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

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

4 голосов
/ 28 января 2009

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

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

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

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

3 голосов
/ 28 января 2009

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

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

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

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

0 голосов
/ 06 апреля 2009

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

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

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

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

Преимущество Haskell, с другой стороны, в безопасности. Например, вы можете убедиться, используя типы, что градусы в по Фаренгейту и Цельсию никогда не смешиваются непреднамеренно . Кроме того, я считаю, что статически типизированные языки имеют лучшие IDE.

...