Как стать автором
Обновить

Комментарии 16

НЛО прилетело и опубликовало эту надпись здесь

Интересно! Не сообразил как это сделать, если я не храню количество аргументов, локальных переменных и программа не имеет доступа к регистрам. Подскажите как? Попробую реализовать.

НЛО прилетело и опубликовало эту надпись здесь
Это имеет смысл, если делаем jit (компилируем в маш. код), тогда можно освободить регистр rbp под другие нужды. Но если у нас интерпретатор, не факт что после такой «оптимизации» код будет проще (а значит, быстрее), чем явное хранение frame pointer в переменной.
НЛО прилетело и опубликовало эту надпись здесь
Без FP трудно будет сделать трассировку стека для отладки и реализовать отмотку стека для try/catch/finally. Стоит ли оно того?
НЛО прилетело и опубликовало эту надпись здесь
Интересное продолжение, что собираетесь рассмотреть в следующей части?

Наверное, пора писать парсер для построения полноценного Abstract Syntax Tree и генерацию кода из C подобного языка. Уже хочу закрыть гештальт на тему "могу ли написать полноценную виртуальную машину и компилятор" на C++ )))

Увлекательная тема. Развлекался в свое время реализацией Smalltalk-VM c jit-компиляцией. Если бы еще увлекался бы этим, то придумывал бы не свою VM, а попробовал бы реализовать VM для WASM. Тема интересная, и она может в будущем оказаться полезной.

Вы правы, делать свою VM - это не практично, о чем говорил в первой части. Причина по которой пишу VM и компилятор - это желание самому детально понять как всё работает с нуля. По той же причине не использую парсеры (типа bison). Хочу во всём разобраться и понять. Дай бог закончу, можно будет заменить VM на нативную компиляцию (x86/64) или в WASM, или Java Bytecode.

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

Прикольно! Не думал о реализации WASM виртуальной машины. В будущем можно попробовать. Спасибо.

Можно пояснение: на шаге 32 в стек загоняется константа, на шагах 34-38 в стек загоняются аргументы функции, производится сложение, результат записывается на стек. Теперь там должен быть результат сложения и 10. А на шаге 39 производится загрузка на стек переменной c и потом вычитание. Но как 10 попало в с? Или на шаге 32 параметр не в стек загружен?

Если я правильно понял вопрос, то локальная переменная 'c' в функции SUM создана по адресу [32] командой ICONST 10 (аллокация на стеке места под переменную и её инициализация константой 10), по адресу [39] её значение добавляется на вершину стека командой ILOAD #0 для вычислений, без изменения переменной.

Константа которая была передана как второй аргумент изначально создана по адресу [9].

Аргументы функции идут по адресам FP+0 (A=I), FP+1 (B=10) - доступ к ним по команде ARG #index. Локальные переменные по адресам LP+0 (C=10), доступ к ним iload #index.

омандой ICONST 10 (аллокация на стеке места под переменную и её инициализация константой 10)

Ах, тогда ясно. Я не предполагал, что переменные тоже на стеке.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории