Учебное руководство/ресурс для реализации VM

Я хочу реализацию цели самообразования простая виртуальная машина для динамического языка, предпочитаю в C. Что-то как Lua VM, или Попугай или Python VM, но более простой. Есть ли какие-либо хорошие ресурсы/учебные руководства при достижении этого кроме рассмотрения кода и проектной документации существующего VMs?

Править: почему близко голосуют? Я не понимаю - это не программирование. Прокомментируйте, существует ли определенная проблема с моим вопросом.

42
задан idmean 19 July 2015 в 12:16
поделиться

3 ответа

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

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

  • Основные арифметические операции, включая арифметические сравнения, доступ к магазину
  • базовый поток управления
  • Встроенный печать

Вы можете использовать стек сборный подход к вычислению к арифметике, как можно больше VMS. Там нет много динамично в вышеупомянутом. Чтобы добраться до этого, мы хотим, мы хотим, чтобы две вещи: возможность вычислить имена переменных во время выполнения (это просто означает строковые операции), а также некоторое лечение кода в качестве данных. Это может быть так же просто, как позволяет ссылками функций.

Ввод в VM в идеале будет в Bytecode. Если у вас еще нет компилятора, это может быть сгенерировано из базового ассемблера (который может быть частью VM).

Сам VM состоит из цикла:

1. Look at the bytecode instruction pointed to by the instruction pointer.
2. Execute the instruction:
   * If it's an arithmetic instruction, update the store accordingly.
   * If it's control flow, perform the test (if there is one) and set the instruction pointer.
   * If it's print, print a value from the store.
3. Advance the instruction pointer to the next instruction.
4. Repeat from 1.

, связанных с вычисленными именами переменных, могут быть сложными: инструкция должна указывать, какие переменные находятся вычисленные имена. Это может быть сделано, позволяя инструкциям ссылаться на пул строки. Константы, предоставленные на входе.

Пример программы (в сборке и базовом коде):

offset  bytecode (hex)   source
 0      01 05 0E         //      LOAD 5, .x
 3      01 03 10         // .l1: LOAD 3, .y
 6      02 0E 10 0E      //      ADD .x, .y, .x
10      03 0E            //      PRINT .x
12      04 03            //      GOTO .l1
14      78 00            //      .x: "x"
16      79 00            //      .y: "y"

Подразумеваемые коды инструкций:

"LOAD x, k" (01 x k) Load single byte x as an integer into variable named by string constant at offset k.
"ADD k1, k2, k3" (02 v1 v2 v3) Add two variables named by string constants k1 and k2 and put the sum in variable named by string constant k3.
"PRINT k" (03 k) Print variable named by string constant k.
"GOTO a" (04 a) Go to offset given by byte a.

Вам нужны варианты для при наличии переменных названы другими переменными и т. Д. (И уровни косвенного нагрузки. ). Ассемблер смотрит на аргументы, такие как «Add .x, .y, .x» и генерирует правильный Bytecode для добавления из строковых констант (и не вычисляемых переменных).

30
ответ дан 26 November 2019 в 23:58
поделиться

Ну, речь идет не о реализации виртуальной машины в C, но поскольку это была последняя вкладка, которую я открыл, прежде чем я увидел этот вопрос, я чувствую, что мне нужно указать в статью статью о внедрении компилятора KBASIC BYTECODE и VIRGUAL Машина в JavaScript, используя тег . Он включает в себя весь исходный код, чтобы получить достаточно QBASIC, реализованный для запуска игры «Zobbles» и является первой в серии статей на компилятору и интерпретателю Bytecode; Этот описывает VM, и он обещает будущие статьи, описывающие компилятор.

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

9
ответ дан 26 November 2019 в 23:58
поделиться

Еще один ресурс, на который стоит обратить внимание, - это реализация языка Lua . Это виртуальная машина на основе регистров, которая имеет хорошую репутацию по производительности. Исходный код находится в ANSI C89 и, как правило, очень удобочитаем.

Как и в случае с большинством высокопроизводительных языков сценариев, конечный пользователь видит читаемый высокоуровневый динамический язык (с такими функциями, как замыкания, хвостовые вызовы, неизменяемые строки, числа и хэш-таблицы в качестве основных типов данных, функции как значения первого класса, и более). Исходный текст компилируется в байт-код виртуальной машины для выполнения реализацией виртуальной машины, схема которой в значительной степени соответствует описанию ответа Эдмунда .

Было приложено много усилий для сохранения портативности и эффективности самой виртуальной машины. Если требуется еще большая производительность, существует компилятор точно вовремя из байтового кода виртуальной машины в собственные инструкции для 32-разрядной архитектуры x86 и находится в стадии бета-версии для 64-разрядной версии.

4
ответ дан 26 November 2019 в 23:58
поделиться
Другие вопросы по тегам:

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