Самоанализ функциональных языков программирования

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

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

Haskell, Ocaml - есть ли у них аналогичные возможности через байтовый код или дерево синтаксического анализа?

Есть ли другие языки, на которые мне также стоит обратить внимание?


person rwallace    schedule 07.09.2010    source источник
comment
Зачем вам интроспекция?   -  person Paul Johnson    schedule 07.09.2010
comment
Что касается чтения, это важно, потому что центральной особенностью предполагаемой системы является способность анализировать код, написанный человеком. Что касается записи, то это не обязательно, но приятно, потому что в тех случаях, когда код, сгенерированный машиной, часто запускается, компиляция заставит его работать быстрее.   -  person rwallace    schedule 07.09.2010
comment
Хороший вопрос, я действительно недавно задавался вопросом об этом. Моя повседневная работа - это обычная шепелявка, и я сделал кое-что, чтобы автоматически генерировать графы вызовов graphviz с помощью интроспекции, и мне было интересно, есть ли у haskell что-нибудь достаточно мощное, чтобы я мог делать что-то подобное.   -  person asm    schedule 08.09.2010
comment
@rwallace: И как это требует самоанализа?   -  person J D    schedule 08.09.2010
comment
Джон: если программа может анализировать собственный код, большинство людей назвали бы это интроспекцией; вы используете этот термин иначе?   -  person rwallace    schedule 13.09.2010
comment
@rwallace: Может ли программа не просто анализировать / анализировать собственный исходный код?   -  person J D    schedule 25.06.2011


Ответы (7)


Механизм самоанализа Haskell - это Template Haskell, который поддерживает метапрограммирование во время компиляции, и в сочетании, например, с llvm, предоставляет средства метапрограммирования во время выполнения.

person Don Stewart    schedule 07.09.2010

Ocaml имеет:

  • Camlp4 для управления конкретными синтаксическими деревьями Ocaml в Ocaml. Поддерживаемая реализация Camlp4 - Camlp5.

  • MetaOCaml для полномасштабного многоэтапного программирования.

  • Ocamljit для генерации собственного кода во время выполнения, но я не думаю, что он поддерживался в последнее время.

  • Ocaml-Java для компиляции кода Ocaml для виртуальной машины Java. Я не знаю, есть ли хорошие возможности отражения.

person Gilles 'SO- stop being evil'    schedule 07.09.2010
comment
Camlp4 Wiki: groups.google.com/group/fa.caml/browse_thread / thread / - person nlucaroni; 08.09.2010

Не совсем ответ, но обратите внимание на функцию F # Quotations и библиотека, для получения дополнительных сведений гомоиконность.

person Brian    schedule 07.09.2010

Вы можете попробовать типизированный вариант Racket (ранее известная как схема PLT). Он сохраняет большую часть синтаксической простоты Scheme, но предоставляет систему статических типов. Поскольку Racket - это схема, метапрограммирование является обычным делом для курса, и среда выполнения может генерировать собственный код посредством JIT.

person dhaffey    schedule 08.09.2010

Подход Haskell был бы больше похож на синтаксический анализ исходного кода. Платформа Haskell включает в себя полный анализатор исходного кода, или вы можете использовать GHC API, чтобы получить доступ таким образом.

person Paul Johnson    schedule 08.09.2010

Я бы также посмотрел на Scala или Clojure, которые поставляются со всеми библиотеками, разработанными для Java. Вам никогда не придется беспокоиться, если библиотеки не существует. Но, что касается вашего вопроса, эти языки дают вам такое же отражение (или более мощные типы), которое вы найдете в Java.

person wheaties    schedule 07.09.2010

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

Разве нельзя просто разобрать исходный код, как обычный интерпретатор или компилятор? Зачем вам интроспекция?

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

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

Вы можете читать байтовый код, но он был скомпилирован, поэтому много информации и структуры было потеряно.

F # также имеет технологию лексирования и синтаксического анализа (в первую очередь fslex, fsyacc и FParsec), но она не так развита, как OCaml.

Haskell, Ocaml - есть ли у них аналогичные возможности через байтовый код или дерево синтаксического анализа?

В Haskell есть Template Haskell, но я никогда не слышал, чтобы кто-нибудь его использовал (отказавшись от ПО?).

OCaml имеет свою макросистему Camlp4, и некоторые люди ее используют, но она плохо документирована.

Что касается лексирования и синтаксического анализа, в Haskell есть несколько библиотек (в первую очередь Parsec), а в OCaml есть множество библиотек.

Есть ли другие языки, на которые мне также стоит обратить внимание?

Языки переписывания терминов, такие как Mathematica, были бы очевидным выбором, потому что они упрощают манипулирование кодом. Может быть интересен чистый язык.

Вы также можете рассмотреть MetaOCaml из-за его возможностей компиляции во время выполнения.

person J D    schedule 25.06.2011
comment
Что ж, да, я надеялся избежать необходимости писать свой собственный синтаксический анализатор и среду выполнения, но оказалось, что это необходимо, поэтому я продолжаю и делаю это. Тем не менее, спасибо за список, за который проголосовали. - person rwallace; 26.06.2011
comment
Шаблон Haskell используется на веб-платформе yesod. Я также использовал его в нескольких проектах. - person Jeremy List; 18.08.2016