2010-09-07 3 views
17

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

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

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

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

+2

Зачем вам нужна интроспекция? –

+1

На стороне чтения это важно, потому что центральная особенность рассматриваемой системы - это способность анализировать написанный человеком код. На стороне написания не важно, но приятно, потому что в тех случаях, когда часто генерируется код сгенерированного компьютером, его компиляция заставит его работать быстрее. – rwallace

+0

Хороший вопрос, я действительно об этом задумывался недавно. Моя дневная работа - общий lisp, и я сделал кое-что, чтобы автоматически генерировать графики вызовов graphviz, используя интроспекцию, и мне было интересно, имеет ли haskell что-нибудь достаточно мощное, чтобы я мог сделать что-то подобное. – asm

ответ

9

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

2

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

10

Ocaml имеет:

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

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

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

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

+0

Camlp4 Wiki: http://groups.google.com/group/fa.caml/browse_thread/thread/632bb527a6762d89 – nlucaroni

5

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

3

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

1

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Ну да, я надеялся избежать необходимости писать свой собственный парсер и время выполнения, но оказалось, что необходимо, чтобы я пошел вперед и делал это. Спасибо за список в любом случае, несмотря на это. – rwallace

+0

Шаблон Haskell используется на веб-платформе Yesod. Я также использовал его в нескольких проектах. –

Смежные вопросы