Что такое хорошая виртуальная машина для разработки языка для хобби?

Я думаю о написании своего собственного маленького языка.

Я нашел несколько вариантов, но не стесняйтесь предлагать больше.

  • JVM
  • Попугай
  • ОСА

Многие языки используют JVM, но если вы не пишете язык, похожий на Java, вся мощь, которую дает вам stdlib, будет казаться уродливой; С динамическими вещами тоже не очень хорошо.

Parrot кажется хорошей виртуальной машиной для разработки языков, но у нее есть небольшой запах заброшенного/незавершенного/хобби-проекта.

OSA — это то, что поддерживает Applescript, не особенно известную виртуальную машину, но я использую Mac, и она предлагает хорошую системную интеграцию.

CLR+Mac не кажется хорошей комбинацией...

Мой язык будет объектно-ориентированным функциональным языком параллельных потоков данных со строгой типизацией и сочетанием синтаксиса Python и Lisp. Звучит хорошо, а?

[edit]
Я пока принял Python, но хотел бы узнать больше об OSA и Parrot.


person Pepijn    schedule 30.01.2010    source источник
comment
Как насчет требований к производительности и масштабируемости?   -  person skaffman    schedule 30.01.2010
comment
Думаю, я бы предпочел использовать Python или Lua, чем Scheme. Требований к производительности и масштабируемости почти нет, он будет использоваться только для небольших инструментов, которые я пишу.   -  person Pepijn    schedule 30.01.2010


Ответы (4)


Один из подходов, с которым я экспериментировал, заключается в использовании модуля Python ast для создания абстрактное синтаксическое дерево, представляющее код для запуска. Функция Python compile может компилировать AST в байт-код Python, который exec может быть запущен. Это немного более высокий уровень, чем прямая генерация байт-кода, но вам придется иметь дело с некоторыми причудами языка Python (например, принципиальная разница между операторами и выражениями).

При этом я также написал модуль «deparse», который пытается преобразовать AST обратно в эквивалентный исходный код Python только для отладки. Вы можете найти код в репозитории psil, если вам это интересно.

person Greg Hewgill    schedule 30.01.2010
comment
Это означает писать мой язык на Python, не так ли? Было бы весело... Придется подумать об ограничениях. - person Pepijn; 30.01.2010
comment
Правда, пользоваться библиотекой Python ast конечно проще всего из Python. Вы, безусловно, могли бы сделать хуже, чем выбор Python. - person Greg Hewgill; 30.01.2010
comment
Как ast для создания статической системы типов и особенно для написания функций стиля потока данных (вызов, как только данные поступят)? - person Pepijn; 30.01.2010
comment
Естественно, Python AST не предназначен специально для общего назначения, а скорее предназначен для реализации того, что необходимо самому Python (который является языком общего назначения). Конечно, можно создавать такие функции, как система статических типов и функции потока данных, поверх Python, поэтому это также возможно в Python AST. Это может быть просто немного работы, так же как реализация таких функций в прямом байт-коде для виртуальной машины будет немного работы. - person Greg Hewgill; 30.01.2010
comment
Не проще ли использовать Parrot, который предназначен для универсального использования? - person Pepijn; 30.01.2010

Взгляните на LLVM. Это не чистая виртуальная машина как таковая, а скорее фреймворк с собственным IR, который позволяет создавать виртуальные машины высокого уровня. Имеет приятные вещи, такие как статический анализ кода и поддержка JIT.

person zebrabox    schedule 30.01.2010
comment
Я знаю LLVM по ласточке Unladen. Поскольку мой язык — это всего лишь хобби-проект, я думаю, что лучше позаимствовать виртуальную машину со стандартной библиотекой. - person Pepijn; 30.01.2010

  • Lua имеет небольшую, хорошо написанную и быструю виртуальную машину.
  • Python VM — вы действительно можете подключить к ней новый язык, если хотите. Или напишите (используйте?) что-то вроде tinypy, который представляет собой небольшую и простую реализацию виртуальной машины Python.

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

Тем не менее, я не согласен с тем, что Parrot заброшен/хобби. Он довольно зрелый, и над ним работают очень сильные разработчики. Кроме того, эта виртуальная машина специально разработана для работы с несколькими динамическими языками. Таким образом, он был разработан с учетом гибкости.

person Eli Bendersky    schedule 30.01.2010
comment
Я хотел бы узнать больше о том, почему вы считаете, что мне подходят виртуальные машины Lua или Python. Parrot может быть зрелым, по крайней мере, большинство языков на нем неполные или заброшенные. - person Pepijn; 30.01.2010
comment
@Pepijn: я обновил ответ. Не знаете, что еще предложить, если у вас нет более конкретных вопросов? - person Eli Bendersky; 30.01.2010
comment
Я хочу передавать функции и объекты как значения, и я думаю о более или менее статической системе типов, мне также нужны материалы для потока данных. Python имеет четкое различие между функциями, значениями, выражениями и операторами, но его система типов довольно динамична. Это мне помешает? Как это для Lua, Parrot, JVM или OSA? - person Pepijn; 30.01.2010
comment
@Pepijn: вы можете реализовать проверку типов поверх виртуальной машины Python, если хотите. - person Eli Bendersky; 30.01.2010

Вы рассматривали Pypy? Из того, что я прочитал, помимо того, что он является JIT-компилятором Python, он также может работать с другими языками. Например, есть руководство, в котором объясняется, как для создания JIT-компилятора Brainfuck с использованием Pypy.

person Antimony    schedule 10.06.2012