Самоанализ функциональных языков программирования - PullRequest
17 голосов
/ 07 сентября 2010

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

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

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

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

Ответы [ 7 ]

10 голосов
/ 08 сентября 2010

Ocaml имеет:

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

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

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

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

9 голосов
/ 07 сентября 2010

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

6 голосов
/ 07 сентября 2010

Не совсем ответ, но обратите внимание также на функцию F # Цитаты и библиотеку , для более гомоизональности материала.

5 голосов
/ 08 сентября 2010

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

3 голосов
/ 08 сентября 2010

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

2 голосов
/ 07 сентября 2010

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

1 голос
/ 25 июня 2011

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

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

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

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

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

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

Haskell, Ocaml - имеют ли они аналогичные средства, либо через байт-код, либо при разбореtree?

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...