Я делаю набросок дизайна чего-то (машинное обучение функций), для чего предпочтительно нужен функциональный язык программирования, а также самоанализ, в частности, способность исследовать собственный код программы в каком-то хорошо управляемом формате, и, желательно, также возможность получить машину сгенерированный код, скомпилированный во время выполнения, и мне интересно, на каком языке лучше всего его писать. Конечно, 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