Написание компилятора; какой VM?

Я попытаюсь написать компилятор для динамического языка. Предпочтительно для какой-то существующей виртуальной машины - - - я (пока) не хочу иметь дело со сбором мусора и множеством других проблем, которые для вас обрабатывает хорошая виртуальная машина. Какие VMs вы предлагаете?

Я на Linux, поэтому я не знаю, является ли .NET (через Mono) хорошей идеей. Я слышал, что Parrot хорош для динамических языков, но я не слышал о любой использовать язык. Должен ли я изобрести свой собственный? Не кода LLVM даже считайте, что я должен компилировать VM, или это так же сложно, как прямой x86?

кроме того, какие плюсы и минусы существуют для стековых и регистровых виртуальных машин?

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

3 ответов


JVM (Java) и CLR (.NET) кажутся двумя наиболее распространенными целями для этого, поскольку они оба обрабатывают большинство этих проблем для вас. Оба обеспечивают довольно простые наборы инструкций для работы.

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


LLVM дает вам гораздо лучшую модель программирования, чем прямая сборка x86. Да, это низкий уровень. Но вам не нужно беспокоиться о регистрации schedulign или полной оптимизации вывода. Кроме того, пока вы все еще пишете свой интерфейс, вы можете воспользоваться его системой типов, чтобы поймать ошибки, которые вы можете сделать.

тем не менее, вам придется разработать свой собственный слой среды выполнения, чтобы заботиться о "динамических" частях вашего языка. Только за одну эту часть я, возможно, и останусь. с CLR.


.Net имеет динамические язык, как отметил Рид Copsey. Но я даже не знаю CLR, а тем более DLR - я ничего не могу сказать ни о том, ни о другом. LLVM должен быть лучше, чем обычный x86, но он все еще низкий уровень. Но я не могу сказать об этом слишком много - только несколько взглядов.

Я заглянул в Parrot, хотя. Сама идея довольно велика, и реализация выглядит здравой. Если я когда-нибудь сделаю динамический язык, я уверен, что он будет нацелен на parrot. Этот пир (промежуточное представление Parrot) очень высокого уровня для виртуальной машины. У вас есть синтаксический сахар (ариметические операторы, назначения, вызывающие подпрограммы и возвращающиеся из них-это кусок пирога ...), не связывайтесь с точными номерами регистров, а просто возьмите столько, сколько хотите, и назначьте им любое число и даже назовите переменные!

Если бы мне пришлось выбирать, я предполагаю, что предпочел бы VM на основе регистра. Исследования показывают, что эти торговые байт-коды для выполнения скоростью, которая меня вполне устраивает. Кроме того, слишком сложные операции стека, как правило, объединяют мой мозг, когда я пытаюсь понять их - операции на основе регистров становятся более естественными imho.