В настоящее время я пишу компилятор JavaScript на ANTLR + Java.
Я читал здесь вопросы о переполнении стека о том, как продолжить выполнение - и всегда отвечу, что было бы слишком сложно выполнить статическую компиляцию (без JIT-информации) динамического языка, но почему именно это ? Конечно, есть очевидная проблема "разрешения типов", и в JavaScript, возможно, проблема с функцией eval
- но есть ли другие причины? (потому что их не сложно преодолеть чисто статически (без JITS))
Я исключаю компиляцию на основе JIT, потому что считаю, что мне было бы слишком сложно ее реализовать.
Имею некоторый опыт написания статических компиляторов с выполнением байт-кода.
ОБНОВИТЬ:
Все ваши ответы действительно полезны для понимания проблемы. Чтобы уточнить, означает ли это, что JavaScript сложнее реализовать, чем другие динамические языки?
И означает ли это, что мне лучше использовать интерпретатор на основе дерева, чем, например, Байт-код (если мы забудем о том свойстве, что JS всегда поставляется в необработанном исходном коде - следовательно, добавляется дополнительное время для генерации и IR, а затем выполняется его)? - или они должны быть примерно одинаково легкими / сложными?
(Я новичок в SOF; не знаю, является ли это предпочтительным способом обновления вопроса?)