Каковы мотивы для компиляции в байт-код?

Я работаю над своим собственным языком программирования игрушек. На данный момент я интерпретирую исходный язык из АСТ, и мне интересно, какие преимущества компилируются в байтовый код, а затем его интерпретация может предоставить мне.

Теперь у меня есть три вещи:

  • Прохождение дерева синтаксиса в сотни раз может быть медленнее, чем выполнение команд в массиве, особенно если массив поддерживает O (1) случайный доступ (то есть прыгает 10 команд вверх и вниз).
  • В типизированной среде исполнения у меня есть некоторые затраты времени на запуск, потому что мой АСТ напечатан, и я постоянно обхожу его (т.е. у меня есть 10 типов узлов, и мне нужно проверить, какой тип я сейчас нахожу выполнение). Возможно, компиляция в нетипизированный байт-код может помочь улучшить это, поскольку после проверки типов и компиляции у меня были бы нетипизированные значения и код.
  • Компиляция в байт-код может обеспечить лучшую переносимость.

Правильно ли мои баллы? Каковы некоторые другие мотивы для компиляции в байт-код?

Ответ 1

Скорость - главная причина; интерпретация АСТ слишком медленна на практике.

Другой причиной использования байт-кода является то, что его можно тривиально сериализовать (хранить на диске), чтобы вы могли его распространять. Это то, что делает Java.

Ответ 2

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

Для переводчика AST, чтобы решить, что делать дальше, ему нужно пройти дерево, осмотреть узлы, определить тип узлов, проверить тип любых операндов, проверить законность и решить, какой особый случай назначенного AST (он говорит "+", но это означает, что 16-битная добавка или конкатенация строки?), прежде чем она наконец выполнит какое-то действие.

Если вы берете окончательное действие и генерируете какую-то легко интерпретируемую структуру, то при "выполнении" время интерпретатор может сосредоточиться просто на выполнении действий без проверки этого/специального случая.

Еще одно недавнее оправдание заключается в том, что если вы создаете байт-код для любого из нескольких известных виртуальных машин (JVM, MSIL, Parrot и т.д.), вам даже не нужно кодировать интерпретатор. Для JVM и MSIL вы также получаете выгоду от связанных с ними компиляторов JIT, а также с тщательным дизайном вашего языка, совместимостью с огромными библиотеками, которые являются реальной привлекательностью Java и С#.