Lisp диалект и сравнение с Java/С#

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

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

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

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

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

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

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

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

Ответ 1

Я также интенсивно изучал Java и С#, прежде чем приступить к Lisp, поэтому, надеюсь, вы сможете поделиться некоторыми полезными перспективами.

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

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

Причины того, что Lispы особенно интересны и могущественны:

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

Хотя первоначально созданный для исследования ИИ, Lisp отнюдь не исключительно для ИИ. Основная причина, по которой он не является более популярным в основных производственных средах (помимо самовоспроизводящегося доминирования Java и С#), - это поддержка библиотеки. У общего Lisp есть много хороших библиотек (Scheme less so), но он бледнеет по сравнению с огромным количеством поддержки библиотеки, доступной для Java или Python.

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

Ответ 3

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

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

Что лучше узнать первым

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

Что лучше о Lisp

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

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

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

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

Является Lisp общим назначением

Да.

-

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

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

Для Common Lisp я настоятельно рекомендую Землю Lisp.

Для Схемы существует несколько классиков, включая The Little Schemer и SICP.

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

Ответ 4

общий lisp

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

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

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

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

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

Для электронных книг вы можете получить Lisp от Graham и Gentle Introduction to Symbolic Computation. Возможно, другие, но те, которые я могу вспомнить.