Запись компилятора; какой VM?

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

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

Кроме того, что за и против там к стековому по сравнению с основанным на регистре VMs?

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

8
задан pavpanchekha 20 July 2010 в 21:05
поделиться

3 ответа

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

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

9
ответ дан 5 December 2019 в 12:07
поделиться

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

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

4
ответ дан 5 December 2019 в 12:07
поделиться

.NET имеет Dynamic Language Runtime, как упоминал Рид Копси. Но я даже не знаю CLR, не говоря уже о DLR - я не могу ничего сказать ни о том, ни о другом. LLVM должен быть лучше, чем простой x86, но он все еще низкоуровневый. Но и о нем я не могу сказать слишком много - только несколько взглядов.

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

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

1
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: