Я видел много учебных программ по CS и предложения для новых программистов, которые призывают начинающего программиста изучать интерпретатор lisp, который специально написан на lisp. Все эти сайты говорят что-то вроде «своего интеллектуального откровения», «это опыт просветления, который должен иметь каждый серьезный программист», или «он показывает вам аппаратные / программные отношения» и другие смутные утверждения, особенно из этой статьи, взятой из это уважаемое с практическими рекомендациями .
Общее мнение моего вопроса таково: как лисп достигает вышеуказанных целей и почему лисп? Почему не какой-то другой язык?
Я спрашиваю об этом, потому что я только что закончил писать интерпретатор схемы в схеме (взят из SICP http://mitpress.mit.edu/sicp/ ), и сейчас я пишу интерпретатор python в схеме, и я изо всех сил пытаюсь получить это легендарное прозрение это должно прийти конкретно от первого. Я ищу конкретные технические детали между двумя языками, которые я могу использовать в их интерпретаторах схем, чтобы понять, как работают программы.
Более конкретно:
Почему изучение переводчика, написанного на языке, который он интерпретирует, так подчеркнуто - это просто большое умственное упражнение, чтобы сохранить исходный язык и построенный язык прямо или есть конкретные проблемы, решения которых могут быть найдены только в природе оригинальный язык?
Как интерпретаторы LISP демонстрируют хорошие концепции архитектуры для будущего проектирования программного обеспечения?
Что бы мне не хватало, если бы я выполнил это упражнение на другом языке, таком как C ++ или Java?
Какой из этих упражнений чаще всего используется на вынос или «умственный инструмент»? **
** Я выбрал ответ, который сделал, потому что заметил, что благодаря этому упражнению я приобрел больше навыков в разработке инструментов синтаксического анализа в моей голове, чем любой другой инструмент, и я хотел бы найти другие методы синтаксического анализа, которые могут работать лучше для схемы. интерпретатор, чем интерпретатор Python.
Ответы:
Если вы попробуете ответить «я тоже», вы увидите ...
Если вы изучаете компьютерные языки, у вас может сложиться впечатление, что это как минимум половина анализа. Если вы изучите Lisp, вы поймете, что синтаксический анализ поверхностного синтаксиса является не чем иным, как удобством для людей (таких как большинство из нас), которым не нравится множество раздражающих одиночных скобок.
Тогда вы могли бы понять, что за это удобство заплатили большую цену. В Лиспе программа тривиально создает другую программу и выполняет ее. В других языках это продвинутая техника, например, умножение на римские цифры.
Конечно, почти все будут спрашивать, "кому это нужно делать?" Ну, вы могли очень хорошо видеть, что это открывает целый ряд вещей, о которых вы даже не подозревали, что не могли сделать раньше. Вы можете сделать это на других языках, но не так просто.
ВСТАВЛЕН, чтобы ответить на комментарий Изката:
... это всего лишь несколько ...
Затем вы понимаете, что некоторые вещи, которые сегодня считаются «современными», были в Лиспе в течение 40 с лишним лет. Нравится функциональное программирование. Как сборка мусора. Как замыкания.
Это не значит, что у современных языков нет новых хороших идей, таких как ООП и т. Д. Но если вы изучите Lisp, это расширит ваши перспективы.
источник
You can do it in other languages, but not nearly so easily.
- Подобно? (Мне кажется, что вопрос в том, что подобные заявления часто делаются, но почти никогда не становятся более конкретными)Простой ответ на ваш вопрос - попробовать Lisp, желательно в сочетании с SICP . Тогда ты будешь просветленным.
Это сказал ...
Код - это данные. В
большинстве языков проводится четкое различие между кодом и данными; Лисп нет. Это позволяет, например, тривиально написать анализатор Lisp в Lisp и манипулировать кодом Lisp в Lisp. Лучшее описание этого просветления, которое я нашел, - «Природа Лиспа» .
Это верно отчасти потому, что синтаксис для языка очень прост. Это делает возможными вещи в Лиспе (такие как метапрограммирование), которые непрактичны в других языках, потому что синтаксис мешает.
Дальнейшее чтение,
бьющееся по средним
источник
В целом, изучение переводчика дает вам понимание его языка и особенностей. В общем, изучение кода на языке программирования похоже на практику разговорного языка путем прослушивания и чтения: он знакомит вас с тем, что может делать этот язык, как он используется и общими «идиомами». Точнее говоря, Лисп - это гомоиконический язык, то есть его синтаксис для выражений такой же, как и его синтаксис для данных. Написание кода на Лиспе выглядит ужасно, как будто вы пишете список, и наоборот. Таким образом, интерпретировать код Lisp с помощью кода Lisp так же просто, как выполнять списки с помощью
car
иcdr
.Подумайте о том, как интерпретатор интерпретирует себя - во многих реализациях мета-циклического интерпретатора (где интерпретируется гомоиконический язык) можно просто «пройти» через функцию. Например, чтобы реализовать
car
, просто возьмитеcar
аргумент. Это отвлекает внимание от механизмов хранения данных и фокусируется на функциональности.Интерпретаторы могут быть очень сложными, что способствует хорошей архитектуре при их проектировании. Имея это в виду, этот больше зависит от индивидуального переводчика.
Эти языки не гомоичны, поэтому они не извлекают выгоду из изящества и простоты мета-циклического интерпретатора Lisp. Это делает упражнение более сложным и, возможно, менее распространенным, но я бы не сказал, что оно действительно менее полезно.
Я не уверен, что у меня есть хороший ответ для этого; просто то, что это помогает увидеть, как работает интерпретатор, и, что еще важнее, повозится с ним, чтобы увидеть, как легко можно внести незначительные изменения в язык.
источник
LISP сам по себе структурирован таким образом, что его чрезвычайно легко анализировать. Если вы попытаетесь написать компилятор, вы заметите, что намного проще, если все на вашем языке является выражением и имеет низкий уровень неоднозначности. LISP заставляет круглые скобки везде устранять двусмысленность и не имеет никаких утверждений, только выражения.
Сам факт, что LISP очень легко анализировать, побуждает пользователей анализировать свой собственный исходный код и делать с ним фокусы. Граница между данными и кодом становится размытой, и вы легко можете делать вещи, которые обычно требуют довольно больших усилий, такие как отражение, динамическое переписывание кода, плагины и сериализация.
Это суть этого. Это упражнение, вероятно, предназначено, чтобы дать вам некоторое представление о том, что возможно, когда код легко разбирается из самого себя.
источник
Я не уверен, что это действительно важно для всех. Вы можете быть успешным разработчиком, не зная, как работает интерпретатор Lisp. При изучении информатики, основные идеи Lisp должны быть изучены, хотя.
Интерпретаторы Lisp важны для программистов на Lisp. Им нужно понять, как работает Интерпретатор ([и компилятор] 1 ), чтобы полностью понять, как использовать язык.
Интерпретатор Lisp часто используется как инструмент в информатике, чтобы научить студентов нескольким вещам:
понимание компактного и минимального определения языка посредством реализации: Алан Кей назвал это уравнениями программного обеспечения Максвелла .
понимание программирования на уровне языка путем изменения и расширения переводчика
понимание метауровневого программирования и его влияния на дизайн и использование языка программирования. Например, понимание того, что означает «цитирование» и почему это необходимо
понимание интерпретации языка программирования Lisp и его связи с лямбда-исчислением
В качестве обучающего устройства полезен интерпретатор Lisp, потому что его можно выучить и понять за короткое время. Поскольку мало кто из студентов уже знает о Лиспе, они находятся на ровном месте, когда речь идет об изучении выше понятий.
источник