Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Haskell или Lisp?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Haskell или Lisp?
Имя
Сообщение << Старые топики   Новые топики >>
Haskell или Lisp? - 2008-01-10 22:02:25.436666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Решил позагоняться на функциональные языки. Как варианты для изучения рассматриваю Хаскелл и Лисп. Общее представление об обоих языках есть, интересуют их отличия, плюсы и минусы в различных условиях (изучение, реальное использование, возможность интегрирования).
Также инетерсуют среды разработки для обоих языков. Что скажете?
Post #: 1
RE: Haskell или Lisp? - 2008-01-10 23:35:24.693333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
различия? Ну это просто разные языки.

lisp. во-первых его много. Есть Common-Lisp, есть schema, есть emacs lisp. Первый – это лисп-система со всеми наворотами типа CLOS, и кучей пакетов к нему. Есть разные реализации: clisp – может быть наиболее приятная для новичка, ибо с поддержкой readline из коробки, но при этом компилируется в байт-код, и не популярна среди common-lisp'овцев. Есть cmucl, и его продолжатель sbcl – эти уже компилируются в native-код, и довольно-таки эффективно. Есть ещё gcl – тоже компилируется в native-код, но с ним я не связывался. Schema – это сильно урезанный/строгий диалект лиспа. Есть реализация guile, ориентирован в первую очередь на использование в качестве скрипт языка приложения. Emacs Lisp – это диалект на котором написан emacs, который кстати является лучшей средой разработки для лиспа.
Haskell имеет две или три реализации, и никаких диалектов. Это просто язык.

При это haskell – это чисто функциональный язык, с lazy-evaluation, lisp же, при всей его ориентированности на функциональное программирование, всё-таки назвать функциональным не очень язык поворачивается. Даже более того, я затрудняюсь классифицировать лисп. Лисп – это лисп.

Насчёт интеграции языка в приложение, имхо, лисп больше подойдёт, так как во-первых есть guile, который вообще как библиотека реализован. А во-вторых ffi sbcl позволяет использовать C-код прямо в lisp программе. Насчёт лиспа из C – не знаю, но думаю тоже без особых проблем.
Хотя в haskell тоже вроде как ffi заложен.

Использование.
haskell менее требователен к системе, но это язык жёстко компилируемый. В то время как лисп – это интерпретатор. Даже если он компилирует функцию в native-код, всё равно REPL остаётся основной фичой. А это значит возможность изменения программы без её перезапуска и прочие прелести.

В плане изучения.
на haskell.org есть несколько туторов. а common-lisp, имхо, лучшее введение это http://www.gigamonkeys.com/book/
С одной стороны командная строка лиспа гораздо удобнее для изучения, но с другой стороны CommonLisp – это монстр. Он просто очень большой. Стоит только глянуть на описание макроса loop и станет ясно о чём я. Замесить в один цикл и for, и while, и foreach, и if – это реально надо иметь мозг свёрнутый лиспом :)
Haskell в этом плане построже/попроще. Но он lazy, что может помешать его изучать. А может и нет. Не знаю.
Post #: 2
RE: Haskell или Lisp? - 2008-01-11 01:06:25.296666   
sergeiprog

Сообщений: 302
Оценки: 0
Присоединился: 2007-04-24 10:02:27.956666
На Википедии есть таблица Сравнение языков программирования, в ней отмечены наличие или отсутствие тех или иных возможностей
Post #: 3
RE: Haskell или Lisp? - 2008-01-11 01:38:49.466666   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Ну то, что это разные языки, понятно. Я имел ввиду какие-то фичи, которые есть в одном языке, и которых нет в другом. Например, в С++ есть шаблоны и обобщённое программирование, в Делфи этого нет, зато в Делфи есть единый базовый класс для всех объектов, чего нет в С++. Хотя я понимаю, что Хаскелл и Лисп - это немного более далёкие друг от друга языки, чем С++ и Делфи, но всё-таки.
upd.sergeiprog, спасибо, именно то, что я имел ввиду.

Интересует такой вопрос. rgo на каком-то форуме писал, что С++ - это средство, которым нужно уметь пользоваться. В нём нет концепции и какой-то единой идеи (за точность цитирования не ручаюсь). Есть ли такая концепция, идея в Lisp и в Haskell? То есть можно ли их назвать элегантными, что ли. Кончено условно, но всё же. Как я понимаю, Хаселл всё-таки более строен и красив с этой точки зрения, чем Лисп (рассматриваем только Common Lisp, он хоть и большой, но единая идея у него может существовать. А может и не существовать).

К слову, если верить Вики, есть и интерпретаторы для Хаскелл. А что-нибудь конкретное (компилятор/интерпретатор/среда разработки) для него не посоветуете? Или по большому счёту всё равно?
Post #: 4
RE: Haskell или Lisp? - 2008-01-11 02:16:04.963333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
ну в haskell концепция – это lazy functional язык, строгий и математичный. За счёт этого очень успешно обрабатываемый компилятором. Во всяких туторах/статьях регулярно встречается словосочетание "Real World". Дело в том что "real world" по ряду аспектов несовместим с функциональным программированием, и haskell с этим успешно борется. Одна "теория" Monad'ов чего стоит. Ведь самая проблема с вводом/выводом, и поскольку эту проблему было сложно решить, они взяли безумно абстрагированную теорию категорий, и применили её к практике введя в хаскелл понятие Monad'а. Понятие, на которое у меня не хватило терпения. Там в туторах говориться: "не парьте себе мозг, просто пользуйтесь как говорят, вникать в детали будете потом". Так вот до этого "потом" у меня дело так и не дошло. Но язык прикольный. У меня где-то должна валяться программка на нём, которая умеет в несколько потоков скачивать с grammy все записи всех альбомов выбранного исполнителя, причём с обходом бана по ip, который запросто можно вызвать неуёмно использовануя grammy даже вручную кликая по ссылкам из броузера :)

lisp же…
1. минимализм синтаксиса, и…
2. всё есть Список – даже программа, это лишь Список, который можно обрабатывать также как Список-не-программу…

не, не так говорю. надо иначе (цитата из книжки на которую я дал ссылку):
quote:


The nearest thing Common Lisp has to a motto is the koan-like description, "the programmable programming language." While cryptic, that description gets at the root of the biggest advantage Common Lisp still has over other languages. More than any other language, Common Lisp follows the philosophy that what's good for the language's designer is good for the language's users. Thus, when you're programming in Common Lisp, you almost never find yourself wishing the language supported some feature that would make your program easier to write, because, as you'll see throughout this book, you can just add the feature yourself.

Лисп – это программирумый язык программирования. Нету фичей языка, которые в нём нельзя было бы создать. Где-то я читал про реализацию лиспа, которая содержала (если память мне не изменяет) ~400 строк ассемблерного кода, а всё остальное было написано уже на лиспе. Тот же макрос loop (казалось бы, реализация циклов – это привелегия компилятора и синтаксиса языка), в лиспе вполне реализуется на лиспе же, причём, естественно, без использования уже существующей реализации loop'а. Другой пример, в php есть замечательный синтаксис для вставки html кода в программу (ну или наоборот – вставки программы в текст html), в лиспе этого нету. Я потратил вечер и написал тоже самое для лиспа, причём с проверкой синтаксиса html (ну, скажем, чтобы в тегах использовались бы атрибуты которые можно использовать с этими тегами). Выглядело это несколько не по-php'шному, но тоже неплохо:(html (head (link (:rel "test/css" :href "style.css")) (title "Hello world page")) (body "hello world")) но всё-же работало. Причём ведь все открывающие/закрывающие теги есть, никаких таких мелочей не пропущено. И что самое интересное, компиляция Списка в строку содержащую html, по-возможности, происходила во время компиляции программы.
Лисп – это не столько язык, сколько лисп-система, с циклом командного интерпретатора REPL (read-eval-print), который читает команду, выполняет её и выводит результат. Из этого цикла программист изменяет/расширяет систему, внося в неё новые возможности, до тех пор, пока выполнение задачи не сведётся к одному вызову функции. Другое дело, что для удобства лисп может читать команды из файла, и не печатать при этом результаты выполнения top-level Списков.
Собственно, одна из раздражающих особенностей листа – обилие скобочек, – это неотъемлимое зло, следствие простоты его синтаксиса необходимой для такой расширябельности.
Post #: 5
RE: Haskell или Lisp? - 2008-01-11 03:01:14.933333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Ух, заинтриговал ты меня Лиспом не по-детски. Хотя начну, видимо, всё-таки с Хаскелла, как с чисто функционального языка. В любом случае, спасибо.

P. S. Вот подумалось, если Лисп настолько универсален, что на нём можно написать любую фичу, то почему он так не популярен по сравнению с теми же Делфи, Си++ и т.д.? Сложность? Другая парадигма? Производительность? Something else?
Post #: 6
RE: Haskell или Lisp? - 2008-01-11 04:13:53.260000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: kreol
Ух, заинтриговал ты меня Лиспом не по-детски. Хотя начну, видимо, всё-таки с Хаскелла, как с чисто функционального языка. В любом случае, спасибо.

Я в последнее время отошёл от него, поняв, что моё знание C и умение им пользоватся, в большинстве ситуаций перевешивает возможности лиспа подстраиваться под задачу, и решать задачу в терминах задачи. Но меня от него пёрло довольно долго не по-детски ;)
quote:

ORIGINAL: kreol
P. S. Вот подумалось, если Лисп настолько универсален, что на нём можно написать любую фичу, то почему он так не популярен по сравнению с теми же Делфи, Си++ и т.д.? Сложность? Другая парадигма? Производительность? Something else?

Он непривычен. Имхо, во-многом непопулярность функциональных/декларативных языков объясняется этим фактом. Перейти с C на Pascal или обратно не сложно. После этого перейти на C++ – тоже. А вот написать хоть что-то на лиспе или хаскелле… Так сразу и не вкуришь, как это сделать.
Сложность. CommonLisp ОГРОМЕН. Там есть всё, на все случаи жизни. Надо довольно долго им пользоваться, чтобы чтение документации стало бы занимать меньше времени, чем собственно кодинг. Когда напишешь программу, смотришь и радуешься как оно всё просто оказывается, но пока пишешь – беда.
И… sbcl у меня отхавывал 20M оперативки. То есть это сама лисп-система столько места занимает. Когда я в него загрузил cl-sql стало ещё больше. В emacs'е это терпимо. Потому как лисп там используется везде, есть возможность прямо на ходу изменять/расширять функциональность emacs'а как текстового редактора, на всё это можно пожертвовать столько памяти. Но это мне можно, потому что я иногда пользуюсь этой фичой. К emacs'у ведь, который вроде позиционируется как текстовый редактор, есть куча всяких программ, которые делают из него irc-клиента, или броузер, или почтовик, или всё-что-угодно. Кстати вспомнил пример, как общаясь на irc-канале с кем-то (из emacs'а), и узнав что клиент собеседника умеет выполнять команды shell'а (человек просто выполнил команду date – и все кто был на канале увидели его локальное время), я не уходя с канала прикрутил к emacs'овому клиенту аналогичную возможность, и продемонстрировал всем результаты (на что мне сказали что мои часы на полторы минуты спешат :)). Но это я так могу. Мне это прикольно и удобно. А тому кто не может, не хочет, не нуждается в этом, тому требования emacs'а к системе естественно покажутся завышенными.
А если это не emacs, а самостоятельный icq-клиент? Который отхавает 20M памяти на sbcl, после подгрузки графической библиотеки скушает ещё 10-20 метров, и только после этого начнёт грузить код именно клиента. Это же полный отстой, а не icq-клиент.

Короче для лиспа нужно правильное применение. Я как-то в online игре robotwars зависал, играл кучей мультов и мне надоело всеми ими управлять постоянно меняя прокси, логинясь и тд и тп. Ну дык, я влез в лисп, начал его учить скачивать отдельные страницы robotwars и парсить их переводя во внутренние структуры. Потом начал писать функции которые работали с этими структурами… Кончилось всё тем, что у меня была командная строка, из которой я управлял всеми мультами, следил за их состояниями, планировал вперёд кто с кем подерётся. Очень удобно. Если не хватало каких-то возможностей, не отменяя никаких ранее запланированных действий (и более того, в процессе их выполнения), дописывал пару функций, и продолжал планирование.
Если бы я тоже самое попытался бы выполнить на C или haskell, мне бы пришлось, скорее всего, писать программу которая анализируя опции командной строки составляла бы запрос (или запросы) отправляла бы их, и складывала бы результаты в файлы, или выводила бы их в stdout. А потом уже используя shell, я бы собственно управлялся бы с этой программкой, и из shell'а бы писал всю логику поведения моих мультов. Я бы упёрся в то, что необходимо правильное проектирование, что моя программа должна предоставлять мне не слишком низкоуровневый интерфейс, чтобы она делала как можно больше работы, а с другой стороны, была бы как можно более гибкой. Планирование, то есть выполнение какого-то действия, при выполнении в будущем какого-то условия, потребовало бы, постоянного слежения за тем, чтобы новые версии моей программы (которые запросто могли бы появлятся раз в полчаса), обеспечивали бы обратную совместимость с теми командами, которые уже запланированы, но ещё нее дошли до стадии запуска. Короче всё бы оказалось сложнее.
Кстати ещё один девиз лиспа вспомнил. Точнее вспомнил суть, уж красиво формулировать лень. Идея в том, что проще на лиспе за полчаса написать программу, которая отработает за один раз часов пять, выдаст результат и станет после этого ненужной, чем писать такую же программу на C часов десять, и потом за десять минут получить тот же результат.
Post #: 7
RE: Haskell или Lisp? - 2008-01-11 18:51:09.443333   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Ну по опыту работы с BlackBox'ом я понял, что есть языки, направленные на отдельные бинарики, а есть языки, направденные на работу в системе, и при наличии хотя бы 2-3 программ второй вариант обходит первый по занимаемой памяти. Поэтому 20 метров оперативы для sbcl меня не сильно пугают :)
Другое дело, что все Лиспы как-то явно уклонются в сторону никсов, а я всё-таки больше сижу и пишу под Виндой. gcl и clisp под win32 нашёл, emacs тоже, а вот как раз с sbcl возникли проблемы. Как я понял, готовой версии пока нет (Port in progress), и без MinGW тут никак?

upd. Вот нашёл ещё у себя LSPEdit - очень маленький (дистрибутив < 1Mb) редактор + ком строка, к тому же портабельная (в смысле можно прямо установленную носить на флешке, например). С этим можно работать, или это что-то совсем палёное?
Post #: 8
RE: Haskell или Lisp? - 2008-01-11 20:32:20.083333   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:


Другое дело, что все Лиспы как-то явно уклонются в сторону никсов, а я всё-таки больше сижу и пишу под Виндой.


Corman Common LISP к примеру сделан под win (не спортирован). Есть еще Allegro Common LISP. Кстати, у авторов Allegro есть раздел "success stories" с такими клиентами как AMD, Boeing, Sony итд.
Post #: 9
RE: Haskell или Lisp? - 2008-01-12 02:30:58.870000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666

quote:

ORIGINAL: Absurd

quote:


Другое дело, что все Лиспы как-то явно уклонются в сторону никсов, а я всё-таки больше сижу и пишу под Виндой.


Corman Common LISP к примеру сделан под win (не спортирован). Есть еще Allegro Common LISP. Кстати, у авторов Allegro есть раздел "success stories" с такими клиентами как AMD, Boeing, Sony итд.

Оба работают только 30 дней =\ Хотя на вид и ничего.
Меня всё-таки больше интересовал как раз sbcl. Я хотя в основном и сижу под Виндой, но иметь что-то одновременно под 2 платфоры как-то приятнее :-) Ну да ладно, пока разбираюсь с Хаскеллом, а потом, видимо, буду мучать MinGW и sbcl.

Если кто-нибудь настраивал Emacs под Хаскелл (не Лисп, а именно Хаскелл), не откажусь от короткой инструкции %)
Post #: 10
RE: Haskell или Lisp? - 2008-01-12 12:17:28.323333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: kreol
Если кто-нибудь настраивал Emacs под Хаскелл (не Лисп, а именно Хаскелл), не откажусь от короткой инструкции %)

есть haskell-mode. Он правда не входит в стандарнтый набор модов емакса, но его несложно найти в гугле и поставить.
Post #: 11
RE: Haskell или Lisp? - 2008-01-12 14:58:03.450000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666

quote:

ORIGINAL: rgo

есть haskell-mode. Он правда не входит в стандарнтый набор модов емакса, но его несложно найти в гугле и поставить.

о, спасибо.
Post #: 12
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Haskell или Lisp?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.