Подтвердить что ты не робот

Интроспекция языков функционального программирования

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Ocaml имеет:

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

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

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

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

Ответ 3

Не совсем ответ, но обратите внимание также на функцию F # Quotations и library, для более homoiconicity.

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

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

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

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

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

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

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

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

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

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