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

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

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

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

Популярные приложения Haskell: PUGS Darcs

Согласны ли вы, и есть ли исследования на этот счет?


person Berlin Brown    schedule 28.01.2009    source источник


Ответы (5)


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

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

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

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

person Allen    schedule 28.01.2009

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

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

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

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

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

person Charlie Martin    schedule 28.01.2009
comment
Common Lisp также строго типизирован, он просто определяет тип во время выполнения, то есть он динамически типизирован (в отличие от статического, как Haskell). Не путайте статическое ‹-› динамическое со слабым ‹-› сильным! - person Svante; 28.01.2009
comment
Кроме того, Common Lisp поддерживает широкий спектр стилей программирования, включая функциональное программирование, поэтому этот спор также является скорее побочной темой (в том смысле, что Haskell является чистым, в то время как CL также подходит для других способов). - person Svante; 28.01.2009
comment
Арлекин, C поддерживает функциональный стиль, если вы этого хотите. В Haskell нет императивного присваивания, Clojure допускает его только в ограниченной специальной форме. Common Lisp позволяет вам писать функционально, но не навязывает его, как это делают Ruby и Python. - person Charlie Martin; 29.01.2009
comment
Нет, C разрешает функциональный стиль, который полностью отличается от его поддержки. Вы можете напрямую написать все функциональными идиомами в CL, как в Scheme или Haskell. Сила не является обязательным условием для поддержки. Конечно, вы можете делать что угодно на любом языке, полном по Тьюрингу. - person Svante; 02.02.2009
comment
Вы спорите о том, что такое есть. Common Lisp позволяет вам писать что угодно функционально, но программа перестает быть действительно функциональной программой с первым неуместным setf. Clojure, по крайней мере, заставляет вас помещать императивное ядро ​​в специальные блоки и обеспечивает транзакционную память. - person Charlie Martin; 02.02.2009

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

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

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

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

person Svante    schedule 28.01.2009
comment
Haskell бесполезен в качестве замены Ады. Haskell часто имеет непредсказуемую производительность из-за ленивых структур данных и сборки мусора. Это нежелательно в летном ПО. - person Rainer Joswig; 05.04.2009

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

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

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

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

person Eduard - Gabriel Munteanu    schedule 28.01.2009

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

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

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

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

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

person Daniel O    schedule 06.04.2009