Испускание байт-кода JVM является традиционным вариантом.Вам придется работать на уровне байт-кода, и вам придется оптимизировать свой код перед тем, как отправлять байт-код, поскольку возможности JVM для его оптимизации после его отправки ограничены.Чтобы получить хорошую производительность, вам, возможно, придется использовать invokedynamic.
Использование Truffle - это, я бы сказал, простой вариант.Вам нужно только написать интерпретатор AST, и тогда генерация кода для вас.Это также высокопроизводительный вариант - на всех языках, где есть версия Truffle и версия с байт-кодом, версия Truffle уверенно превосходит версию с байт-кодом, а также является более простой из-за отсутствия стадии генерации байт-кода.
Излучение LLVM-кодаи работать на Сулонге - вариант, но я бы его не рекомендовал, если у вас нет других ограничений, которые приведут вас к этому варианту.Опять же, вы должны выполнить генерацию битового кода самостоятельно, и вам придется оптимизировать себя перед тем, как испускать битовый код, поскольку после установки битового кода оптимизации ограничены.
Ruby хорош для сравнения этих опций - потому что естьверсия, которая испускает байт-код JVM (JRuby), версия, использующая Truffle (TruffleRuby), и версия, которая испускает битовый код LLVM (Rubinius, но затем он не запускает этот битовый код в Sulong).Я бы сказал, что TruffleRuby быстрее и проще в реализации, чем Rubinius или JRuby.(Я работаю над TruffleRuby.)
Я бы не беспокоился о том, что ваш язык статически типизирован.Truffle может работать со статическими типами и может использовать специализацию профилирования, чтобы снова обнаружить во время выполнения больше мелкозернистых типов, чем выражено статически.