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

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

Интерпретатор со специализатором не прокатит за компилятор (Futamura projections)?

Если есть p в коде то как мне кажется специализатор не сможет отработать (если речь о выполнении специализатора при компиляции, JIT подход конечно сработает). Если есть p то мне кажется единственное решение — генерировать шитый код, если p нет то можно сразу сгенерировать бинарник.

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


Кстати, вообще, в продакшене есть системы life patching (в ядре), которые позволяют ядру выполнять некий аналог put'а (замену куска себя в рантайме). Проблемы, которые там решали, классом выше, чем просто "заменить себя" (например, надо сохранять старые структуры данных для активных вызовов).


В целом, мне кажется, для неоптимизирующего компилятора, put может вполне выполняться. Я даже знаю один простой метод:


compile(p);
memcpy(old, new);
patch(new, p);
switch_code(new);
Пардон, но вы написали интерпретатор, а вовсе не компилятор.
На выходе компилятора ожидается набор машинных кодов или текст на ассемблере.
Да. Я в первом же абзаце написал, что технически это транслятор, но я называю программу компилятором для удобства. Для меня главным было получить из кода на Befunge исполнимый файл на Python.
Это и не транслятор, поскольку на выходе у него вовсе не текст программы на питоне или каком-то другом ЯВУ.
Я написал интерпретатор. Ок?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации