Диалект Lisp и сравнение с Java / C # - PullRequest
11 голосов
/ 06 марта 2012

Теперь я обычно на Java / C # (люблю их обоих, не могу сказать, что я посвящен одному).
И я недавно обсуждал различия между F # и C # с другом, когда он удивил меня, сказав: «Так .. F # звучит очень похоже на шутку, но с гораздо меньшим ощущением« швейцарского армейского ножа »»
Теперь мне было стыдно говорить это, но я понятия не имею,что такое был lisp.
После некоторых поисков я увидел, что lisp очень интересен, но был озадачен множеством диалектов и средой бега.

Вот что я знаю: я знаю 3 диалекта:

  • Common Lisp (у меня в закладках есть книга Practical Common Lisp .
  • Схема (более "теоретическая" версия CL)
  • Clojure . Кажется, это версия CL, работающая на JVM.

Основная идея lisp заключается в использовании кода в качестве данных.

ЧтоЯ хочу знать:

  • Какая рабочая среда для разных диалектов? Как они работают?Установка rk / get (под этим я подразумеваю, является ли она средой выполнения, подобной виртуальной машине Java, или если она требует чего-то другого, или если она обычно поддерживается ОС (как в скомпилированном виде)).И как их получить (если что-то должно быть получено)
  • Какой диалект лучше изучать (я хочу, чтобы диалект не был "языком обучения", но который вы можете потом полностью использовать, не сожалея об этомизучая другой, например, сначала нужно изучить C ++, прежде чем пробовать Visual C ++, если вы понимаете, о чем я)
  • Каковы основные преимущества lisp в целом (я видел много страниц об этом высказывании)это быстрее в разработке и исполнении, но все они были довольно расплывчаты по деталям)
  • Можно ли вообще использовать его для общего назначения или оно сконцентрировано на ИИ?(Под этим я подразумеваю, если, например, можно с его помощью создать полноценное консольное приложение, а затем с такой же легкостью реализовать OpenGL и создать игру. Изучение языка, специализирующегося на чем-то точном, стоит, но на данный момент не для меня)

Я также был бы очень рад любой дополнительной информации, которую вы, ребята, можете мне дать!(Ссылки приветствуются! Электронные книги и еще много чего.)

Редактировать: все ответы здесь были очень полезными.Таким образом, я дал им +1 к повторению, но выбрал более конкретный как лучший.Спасибо всем.

Ответы [ 4 ]

14 голосов
/ 06 марта 2012

Я также интенсивно изучал Java и C # до прихода в Лисп, так что, надеюсь, смогу поделиться некоторыми полезными взглядами.

Во-первых, все Лиспы великолепны, и вы обязательно должны изучить его. Есть известная цитата Эрика Рэймонда:

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

Причины, по которым Лиспы особенно интересны и сильны:

  • Гомо-звонность - в Лиспе "код - это данные" - сам язык написан на структурах данных Лисп. Само по себе это интересно, но где он становится действительно мощным, это когда вы начинаете использовать это для генерации кода и расширенных макросов. Некоторые считают, что эта функция является основной причиной того, что Lisp может помочь вам быть более продуктивным, чем кто-либо другой (короткое эссе Пола Грэма)
  • Разработка Interactice в REPL - это есть у некоторых других языков, но это особенно идиоматично и глубоко укоренилось в культуре Lisp. Это удивительно продуктивно и полезно для развития, изменяя живую программу. Недавние примеры, которые бросились в глаза, включают взлом музыки с обертоном и редактирование симуляции живой игры .
  • Динамическая типизация - мнения разделились относительно того, является ли это преимуществом или нет (я лично нейтрален), но многие люди считают, что динамически типизированные языки дают вам преимущество в производительности, по крайней мере, с точки зрения строить вещи быстро. YMMV.

Моя личная рекомендация для изучения Lisp в настоящее время - Clojure. У Clojure есть несколько явных преимуществ, которые выделяют его:

  • Современный языковой дизайн - Clojure «очищает» Lisp несколькими способами. Например, Clojure добавляет некоторый новый синтаксис для векторов [] и хеш-карт {} в дополнение к спискам (). Пуристы могут не одобрить, но я лично считаю, что эта находка нововведений делает язык намного приятнее в использовании и чтении.
  • Функциональность в первую очередь - все лиспы хороши как функциональные языки, однако Clojure продвигается дальше. Вся стандартная библиотека написана в терминах чистых функций. Все структуры данных являются неизменяемыми. Изменчивое состояние строго ограничено. Ленивые последовательности (включая бесконечные последовательности) поддерживаются. В некоторых смыслах он больше похож на Хаскелла, чем на других Лиспов.
  • Параллелизм - Clojure имеет уникальный подход к управлению параллелизмом, поддерживаемый очень хорошей реализацией STM. Стоит посмотреть это отличное видео для более глубокого объяснения.
  • Работает на JVM - что бы вы ни думали о Java, JVM - отличная платформа с чрезвычайно хорошей компоновкой GC, JIT, кросс-платформенной переносимостью и т. Д. Это может стать препятствием для входа для некоторых, но любой, кто привык к Java или C #, должен быстро почувствовать себя как дома.
  • Экосистема библиотек - поскольку Clojure работает на JVM, он может очень легко использовать библиотеки Java. Вызов Java API из Clojure тривиален - он аналогичен любому другому вызову функции с синтаксисом (.methodName someObject arg1 arg2). С доступностью огромной экосистемы библиотек Java (в основном с открытым исходным кодом) Clojure, по сути, перепрыгивает все «нишевые» языки с точки зрения практической полезности

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

Наконец, по поводу производительности: в основном вы всегда будете платить небольшое снижение производительности за использование языковых конструкций более высокого уровня. Однако, по моему опыту, Clojure "достаточно близок" к Java или C #, поэтому вы не заметите разницы для разработки общего назначения. Помогает то, что Clojure всегда компилируется и что вы можете использовать необязательные подсказки типов , чтобы получить преимущества производительности статической типизации.

некорректные тесты производительности (по состоянию на начало 2012 года) позволяют использовать Clojure в 2-3 раза быстрее статически типизированных языков, таких как Java, Scala и C #, немного отстая от Common Lisp и немного немного опередил Схему (Ракетка).

11 голосов
/ 06 марта 2012

Лисп, как вы обнаружили, не является одним языком; это семейство языков, которые имеют определенные общие черты.

Существует два основных диалекта Лиспа: Общий Лисп и Схема. Каждый из этих двух диалектов имеет много реализаций, каждая со своими особенностями. Однако Common Lisp и Scheme стандартизированы, и стандарты определяют определенный базовый набор функций, которые можно ожидать от любой реализации.

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

Clojure - еще один второстепенный, более поздний диалект. Если вы хотите понять Lisp, вам лучше сначала изучить Common Lisp или Scheme.

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

Преимущество Lisp, проще говоря, в том, что он более мощный , чем другие языки. Весь код Lisp является данными Lisp и может быть обработан как таковой; это позволяет вам делать действительно классные вещи с метапрограммированием, которые просто невозможно сделать на других языках, потому что они не дают вам прямого доступа к структурам данных, которые составляют ваш код. (Причина, по которой Лисп может это сделать, а они не могут, тесно связана с его странным синтаксисом. Каждый компилятор или интерпретатор после прочтения исходного кода должен перевести его в деревья абстрактного синтаксиса . В отличие от других языков Синтаксис Lisp является прямым представлением AST, в которые транслируется код Lisp, так что вы знаете, как выглядят эти деревья, и можете напрямую ими манипулировать.) Наиболее часто используемая функция метапрограммирования - это макросы; Макросы Lisp могут буквально перевести немного исходного кода во все, что вы можете программировать. Вы не можете сделать это, скажем, с макросами C.

«Быстрее в разработке и исполнении», возможно, была ссылка на одну особенность, которую обеспечивает большинство реализаций Lisp: цикл read-eval-print. Вы можете ввести выражение в приглашение, и интерпретатор оценит его и напечатает результат. Это замечательно как для изучения языка, так и для отладки или иного исследования кода.

Лисп динамически типизирован (хотя статически типизированные разновидности существуют). Большинство реализаций Lisp работают на собственной виртуальной машине; однако, многие также могут быть скомпилированы в машинный код. Clojure был написан специально для JVM; он также может быть нацелен на .NET и JavaScript.

Хотя Лисп изначально был создан для исследований ИИ, он ни в коем случае не предназначен исключительно для ИИ. Основная причина, по которой он не более популярен в основных производственных средах (кроме самодостаточного доминирования Java и C #), заключается в поддержке библиотек. Common Lisp имеет много хороших библиотек (схема меньше), но он бледнеет по сравнению с огромным количеством библиотечной поддержки, доступной для Java или Python.

Если вы хотите начать, я рекомендую скачать Racket , очень популярную реализацию Scheme. В нем есть все, что вам нужно, в том числе простая, но очень мощная IDE с циклом read-eval-print, прямо из коробки. Первоначально разработанный как учебный язык, он поставляется с очень большой стандартной библиотекой, более характерной для Common Lisp, чем для Scheme. В результате он видит применение в реальных производственных средах.

4 голосов
/ 06 марта 2012

Среды выполнения

Common Lisp и Scheme обычно имеют свои собственные уникальные среды выполнения. Есть несколько вариантов Scheme (Chicken и Gambit), которые можно преобразовать в C и затем связать с их средами, чтобы можно было развернуть их как отдельные исполняемые программы. Clojure работает в JVM, и есть также порт CLR, но мне не ясно, что порт CLR является текущим с JVM. Clojure также имеет Clojurescript, который предназначен для среды выполнения Javascript.

Что лучше учить первым

Не думаю, что на этот вопрос есть хороший ответ. Тебе решать. Хотя, если у вас есть опыт работы с JVM, для начала Clojure может показаться более плавным.

Что лучше в Лиспе

Это вопрос, который может привести к пламенной войне. У меня нет особого опыта. Я начал изучать Clojure несколько месяцев назад всерьез, много лет смотрел на Common Lisp и Scheme.

Что мне нравится, так это их динамическая натура. Вам нужно изменить функцию во время выполнения вашей программы? Нет проблем! Как и любой электроинструмент, вы должны быть осторожны, чтобы не отрубить свои кусочки при использовании этого.

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

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

Является ли Лисп общего назначения

Да.

-

У Марка Фолькмана действительно хорошая статья о Clojure. Многие основы есть. Сначала я просто запустил репл и экспериментировал, когда мне нужно было что-то выяснить программно. например изучить API или сделать некоторые расчеты. После короткого периода времени я начал работать над повышением уровня усилий, и у меня есть проект, над которым я сейчас работаю, который включает Clojure.

Нет плохой книги о Clojure, которая была написана. Книга Стюарта Сьерра обновляется; и книга Орейли скоро выйдет, так что вы можете подождать. Радость Clojure хороша, но я не думаю, что это хорошая стартовая книга.

Для Common Lisp я очень рекомендую Землю Лисп.

Для Scheme есть несколько классических произведений, включая The Little Schemer и SICP.

О, и это: http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey (возможно, один из самых важных докладов, которые вы когда-либо видели), и это http://www.infoq.com/presentations/hickey-clojure (IIRC, действительно хорошее введение в Clojure).

3 голосов
/ 07 марта 2012

общий шрифт

  • Common Lisp компилируется и интерпретируется. Развертывания (в Windows) могут быть выполнены с помощью DLL. Или с помощью предварительно скомпилированного байт-кода. Или установив систему Lisp на целевом устройстве и запустив исходный код для него.

  • Common Lisp - это полностью используемый промышленный язык с активным сообществом и библиотеками для множества различных задач.

  • Лиспы, как правило, быстрее для разработки и благодаря возможностям абстракции лучше подходят для разработки концепций более высокого уровня. Это трудно объяснить. Ruby vs. C является примером такого рода вещей. Все Лиспы несут эту способность ИМО.

  • Common Lisp - это язык общего назначения. Я не знаю, если современные реализации Common Lisp напрямую поддерживают выполнение сборки, поэтому может быть сложно писать драйверы или использовать неподдерживаемые компилятором инструкции ЦП.

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

Для электронных книг вы можете получить On Lisp от Грэма и Gentle Введение в символические вычисления. Возможно, другие, но это те, которые я могу вспомнить.

...