Динамический против статического компилятора (JavaScript)

В настоящее время я пишу компилятор JavaScript на ANTLR + Java.

Я читал здесь вопросы о переполнении стека о том, как продолжить выполнение - и всегда отвечал, что было бы слишком сложно выполнить статическую компиляцию (без JIT-информации) динамического языка - но почему что именно? Конечно, есть очевидная проблема "разрешения типов", и в JavaScript, возможно, проблема с функцией eval - но есть ли другие причины? (потому что они не кажутся слишком сложными для преодоления чисто статически (без JITS))

Я исключаю компиляцию на основе JIT, потому что считаю, что мне было бы слишком сложно ее реализовать.

У меня есть некоторый опыт в написание статических компиляторов с выполнением байт-кода.

ОБНОВЛЕНИЕ:

Все ваши ответы действительно полезны для понимания проблемы. Чтобы уточнить, означает ли это, что JavaScript сложнее реализовать, чем другие динамические языки?

И означает ли это также, что мне лучше использовать интерпретатор на основе дерева, чем, например, Байт-код (если мы забудем о том свойстве, что JS всегда поставляется в необработанном исходном коде - следовательно, добавляется дополнительное время для генерации и IR, а затем выполняется его)? - или они должны быть примерно одинаково легкими / сложными?

(Я новичок в SOF;не знаю, является ли это предпочтительным способом обновления вопроса?)

5
задан Sune1987 24 August 2011 в 20:03
поделиться