Чому вивчення перекладача Lisp на Lisp так важливо?


30

Я бачив багато навчальних програм CS та навчальних пропозицій для нових програмістів, які закликають програміста-початківця вивчити ліст-перекладача, який спеціально написаний на lisp. Всі ці сайти говорять про речі, схожі на "його інтелектуальне одкровення", "це досвід просвітництва, який повинен мати кожен серйозний програміст", або "він показує вам апаратні та програмні відносини" та інші неясні твердження, особливо з цієї статті, взяті з це поважне керівництво .

Загальне почуття мого питання полягає в тому, як ліс досягає вищезазначених цілей і чому ліс? Чому б не якась інша мова?

Я запитую це, тому що я щойно закінчив писати схему інтерпретатора схеми (взято з SICP http://mitpress.mit.edu/sicp/ ), і тепер я пишу інтерпретатора пітона за схемою, і я намагаюся мати цю легендарну епіфанію що має походити спеціально від колишнього. Я шукаю конкретні технічні деталі між двома мовами, якими можу скористатися у своїх інтерпретаторах схем, щоб зрозуміти, як працюють програми.

Більш конкретно:

Чому вивчення перекладача, яке написано мовою, яку він інтерпретує так, - це просто чудова розумова вправа зберігати оригінальну мову та побудовану мову прямо, чи є конкретні проблеми, рішення яких можна знайти лише в характері оригінальна мова?

Як інтерпретатори Lisp демонструють хороші архітектурні концепції для майбутнього дизайну програмного забезпечення?

Що б я пропустив, якби я зробив цю вправу іншою мовою, як C ++ або Java?

Що з цієї вправи найбільше використовується винос або «розумовий інструмент»? **

** Я вибрав відповідь, яку я зробив, тому що помітив, що я отримав завдяки цій вправі більше навичок проектування інструментів розбору в моїй голові, ніж будь-який інший інструмент, і я хотів би знайти різні методи синтаксичного аналізу, які можуть працювати краще для схеми перекладач, ніж інтерпретатор пітона.



4
@gnat Не зовсім поради щодо кар’єри, скоріше питання про те, «що таке чудове в Lisp».
Роберт Харві

1
@RobertHarvey, що посилання стосується не лише кар'єри, але й поради щодо освіти , я мав на увазі це. Але, мабуть, напевно, добре підходить і Lisp-is-great
gnat

1
Ви, здається, запитуєте, чого навчитеся з певної вправи. Ваша схильність - це знак лінощів, ключовий для будь-якого хорошого програміста, але незалежно від того, єдиний спосіб дізнатися, чого ви навчитесь із вправи, - це зробити і побачити. Ніхто не може сказати тобі, чого ти навчишся робити, просто доведеться це зробити.
Джиммі Хоффа

2
Хоча це питання стосується освіти загалом, я б не класифікував це як "поради щодо освіти" таким чином, "Яку мову я повинен вивчити?" є. Тобто це не характерно для певного типу курсу чи роботи. Насправді, якщо ви обрізаєте деякі мовленнєві слова, це питання про мови програмування в цілому, відповіді яких обговорюють мовні особливості. Це справді не специфічно для Lisp, але його можна застосувати до інших гомоніконічних мов, таких як xslt. Тому я не скажу, що це ідеальне питання, тільки що це не просто "поради щодо кар'єри".
TheRubberDuck

Відповіді:


17

Загрожуючи дати відповідь "я теж", якщо ви спробуєте, ви побачите ...

Якщо ви вивчаєте комп'ютерні мови, ви, швидше за все, складете враження, що мова йде про принаймні половину розбору. Якщо ви навчитеся Lisp, ви зрозумієте, що синтаксис обробки поверхні - це не що інше, як зручність для людей (як і більшість із нас), яким не подобається багато дратуючих одиночних дужок.

Тоді ви могли зрозуміти, що за цю зручність заплатили велику ціну. У Lisp тривіально для програми побудувати іншу програму та виконати її. В інших мовах це вдосконалений прийом, як, наприклад, множення римськими цифрами.

Звичайно, майже кожен запитав "хто це повинен робити?" Що ж, ви могли дуже добре побачити, що це відкриває цілу суть речей, які ви ніколи навіть не розуміли, що раніше не могли зробити. Ви можете це зробити іншими мовами, але не дуже легко.

ВСТАНОВИТИ, щоб відповісти на коментар Ізката:

  • Програма SHRDLU для розуміння природного мови працювала шляхом перекладу англійської заяви чи запитання в програму на діалекті Ліспа під назвою MICRO-PLANNER та її виконанням.
  • Програми, що маніпулюють програмами, наприклад, щоб спростити їх або довести їх правильність, природно написані в Lisp.
  • Я використовував програму генерації в програмі, щоб зрозуміти візуальні сцени, де вона повинна мати справу з усіма симетріями, здатними в тривимірних об'єктах, без множення коду.
  • Все, що стосується логіки та теореми, що підтверджують угоди щодо маніпулювання логічними виразами, які є формою програми.
  • Символічна математика, така як символічне інтегральне чи диференційне числення, передбачає маніпулювання математичними виразами, подібними до мініатюрних програм.
  • Будь-яка проблема, пов’язана з генеруванням коду, або більш виразний термін "часткове оцінювання", природна в Ліспі. Я робив це для програми мосту баз даних давно. Я зробив це на C, що було не так просто, як Lisp, але ідею я отримав від Lisp. Це розглядалося як техніка, якою майже ніхто тоді не міг займатися (особливо голови COBOL). Можливо, більше зараз, сподіваюся.

... це лише кілька ...

Тоді ви усвідомлюєте, що деякі речі, які сьогодні вважаються "сучасними", були літньою шапкою в Ліспі протягом 40-ти років. Як і функціональне програмування. Як і збирання сміття. Як і закриття.

Це не означає, що сучасні мови не мають нових гарних ідей, як-от OOP тощо. Але якщо ви навчитеся Lisp, це розширить вашу перспективу.


You can do it in other languages, but not nearly so easily.- Подібно до? (Мені здається, це питання тому, що подібні заяви часто робляться, але майже ніколи не стають більш конкретними)
Izkata

Я вперше подумав, що світ був революціонізований, коли зрозумів, що JavaScript може надрукувати власний вихідний код, і об'єкти можна пройти, щоб отримати рядковий літерал, який можна ухилити в об'єктний буквал. Тоді я зрозумів, що Perl мав це все разом з $ Data :: Dumper :: Deparse, і тоді я зрозумів, що Lisp це назавжди. Розуміння інтерпретаторів розблоковує цю силу, яка завжди є для побудови живих модулів, а в Lisp це доступніше, ніж будь-яка інша мова.
Дмитро

смішна річ - програміст Lisp, який знає про внутрішні можливості Lisps, завжди може зробити власний інтерфейс Lisp на будь-якій динамічній мові - від javascript до bash, perl або python; приємно завантажувати завантажувальні програми з доступного середовища.
Дмитро

19

Проста відповідь на ваше запитання - спробувати Lisp, бажано спільно з SICP . Тоді ви будете освічені.

Це сказало ...

Код є даними
Більшість мов різко розрізняють код і дані; Лісп ні. Це дає можливість, наприклад, тривіально записати аналізатор Lisp в Lisp і маніпулювати кодом Lisp в межах Lisp. Найкращий опис цього просвітництва, яке я знайшов, - це Природа Ліса .

Це частково вірно, тому що синтаксис для мови такий простий. Це робить можливими речі в Lisp (як метапрограмування), які недоцільно для інших мов, оскільки синтаксис стає на шляху.

Подальше читання
Збивання середніх


3
2-й абзац не має сенсу: гомонікості! = Простий синтаксис; простий синтаксис дозволяє легко написати парсер Lisp будь-якою мовою (див. це ). 3-й абзац розпливчастий, потребує прикладів.

@MattFenwick Це правда, що гомоніконність може бути виконана зі складним синтаксисом, але це було б надзвичайно складно. Справедливо вважати, що якщо ви маєте справу з гомоніконічним синтаксисом, це буде просто, якщо з будь-якої іншої причини, ніж вимагається від нього послідовність, це зробить його невимовно легшим, ніж негомоіконний синтаксис. Хоча ваш другий пункт хороший, LISP легко розібратися, оскільки це простий синтаксис, а не гомоконічність (навіть якщо гомоніконність є причиною цієї простоти)
Джиммі Хоффа

1
У будь-якому випадку, невеликі накладні витрати на прийняття значення даних та інтерпретацію його як програми. Це приємна річ. Програмування за конфігурацією - це прямолінійна робота, коли все, що вам потрібно зробити, це написати інтерпретатор для даних конфігурації. Розширені математичні перетворення (які важко здійснити в знатних мовах) часто «зводяться» до простих синтаксичних перетворень чистого фрагмента Ліспа.
номен

1
@MattFenwick: Я вилучив слово "Гомоїконічність" зі своєї відповіді.
Роберт Харві

1
Я б хотів, щоб я міг дати більше, ніж +1, для «Природи Лісапа»; Я ніколи не бачив такого чудового пояснення.
Doval

9

Чому настільки наголошується вивчення перекладача, яке написано мовою, яку він тлумачить?

Загалом, вивчення перекладача дає вам уявлення про його мову та особливості. Загалом, вивчення коду мовою програмування - це як практикування розмовної мови, слухаючи та читаючи: вона ознайомлює вас з тим, що може зробити ця мова, як вона використовується та загальними "ідіомами". Більш конкретно, Lisp - гомонічна мова, тобто її синтаксис виразів такий самий, як і його синтаксис даних. Написання коду в Lisp виглядає жахливо так, як ви пишете список, і навпаки. Таким чином, інтерпретувати код Lisp за допомогою коду Lisp так само просто, як і перегляд списків з carта cdr.

Як я можу скористатися цією вправою, щоб максимально використати її концептуально?

Подумайте, як інтерпретатор би інтерпретував себе - у багатьох реалізаціях мета-кругового інтерпретатора (де інтерпретується гомоніконічна мова) можна просто "пропустити" функцію. Наприклад, для реалізації carпросто візьміть carаргумент. Це відводить акцент від механізмів зберігання даних і фокусується на функціональності.

Як інтерпретатори Lisp демонструють хороші архітектурні концепції для майбутнього дизайну програмного забезпечення?

Перекладачі можуть бути дуже складними, що заохочує гарну архітектуру при їх розробці. Зважаючи на це, цей більше залежить від індивідуального перекладача.

Що б я пропустив, якби я зробив цю вправу іншою мовою, як C ++ або Java?

Ці мови не є гомоніконічними, тому їм не виграє витонченість та простота метакругового інтерпретатора Lisp. Це робить вправу складнішою і, можливо, менш поширеною, але я б не сказав, що це насправді менш вигідно.

Що з цієї вправи найбільше використовується винос або «розумовий інструмент»?

Я не впевнений, що маю гарну відповідь на це; просто, що це допомагає побачити, як працює перекладач, і, що ще важливіше, повозитися з ним, щоб побачити, як незначні зміни в мові можна легко здійснити.


5

LISP сам по собі структурований таким чином, що робить його надзвичайно легким для розбору. Якщо ви спробуєте написати компілятор, ви помітите, що набагато простіше, якщо все на вашій мові є виразом і має низький рівень неоднозначності. LISP змушує дужки скрізь ліквідувати неоднозначність і не має висловлювань, а лише виразів.

Сам факт, що LISP дуже простий для розбору, спонукає користувачів проаналізувати власний вихідний код і робити магічні трюки з ним. Рядок між даними та кодом стає розмитим, і ви можете легко робити речі, які зазвичай вимагають певних зусиль, наприклад, відображення, перезапис динамічного коду, плагіни та серіалізація.

У цьому суть. Вправа, ймовірно, покликане дати вам деяке уявлення про те, що можливо, коли код легко піддається синтаксичному аналізу.


Розбирати не просто Лісп. S-вирази легко розбирати. Крім того, вам ТАКЕ потрібно розібрати Лісп.
Райнер Йосвіг

@Rainer: Хіба це не просто заїдання? У моєму світі розбір означає перехід від тексту до AST, що нічого не говорить про інтерпретацію команд.
Олександр Торстлінг

У C ++ парсер виявить синтаксично неправильну декларацію функції. В Лісп ні. Читач нічого не знає про мову програмування Lisp. Аналізатор C ++ знає повний синтаксис C ++. Читач Lisp знає лише s-вирази.
Райнер Йозвіг

Ага, тоді я розумію, що ти маєш на увазі. Щоправда, хоча я все ще думаю, що простий оцінювач Lisp був би простішим у побудові, ніж простий c ++. Це те, що вони роблять в SICP, чи не так (якийсь час я прочитав)?
Олександр Торстлінг

мова, що використовується в SICP, дуже проста, навіть не повна схема. Перекладач для крихітної мови, схожої на С, також повинен бути простим. C ++ великий. Деякі її труднощі пов'язані з відносно великою кількістю вбудованого синтаксису. У типовій системі Lisp значна частина синтаксису будується за допомогою макросів - поза інтерпретатором. Макроси реалізують синтаксис та механізм розширення для перетворення джерел. Це зберігає серцевину менше. Але макроси можуть бути масовими. Наприклад, реалізація для конструкції LOOP містить понад 2000 рядків складного макрокоду.
Райнер Йозвіг

4

Я не впевнений, що це дійсно важливо для всіх. Ви можете бути успішним розробником, не знаючи, як працює інтерпретатор Lisp. При вивченні інформатики, однак, слід вивчити основні ідеї Ліспа.

Інтерпретатори Lisp важливі для програмістів Lisp. Вони повинні зрозуміти, як працює Перекладач ([і компілятор] 1 ), щоб повністю зрозуміти, як користуватися мовою.

Перекладач Ліспа часто використовується як інструмент у галузі інформатики, щоб навчити студентів декільком речам:

Як навчальний пристрій, інтерпретатор Lisp є корисним, оскільки його можна вивчити та зрозуміти за невеликий час. Оскільки мало хто з студентів вже знає про Лісп, то студенти знаходяться на рівні рівня, коли мова йде про навчання вище понять.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.