Когда вы говорите, что JavaScript - это « динамический », вы обычно подразумеваете « динамически типизированный », что не имеет ничего общего с тем фактом, что он обычно реализуется как интерпретируемый язык и не скомпилировано. Противоположностью « динамически набираемого » является « статически набранного ». Обратите внимание, что это свойство отличается от того, которое описывается " слабо типизированным " и " строго типизированным ". Оба свойства не имеют ничего общего с интерпретаторами и компиляторами, за исключением тенденции к языкам сценариев, которые почти всегда интерпретируются, для динамической типизации.
Компилятор, очевидно (ну, на самом деле, вопрос как раз о компиляторе, который действует как интерпретатор, но давайте рассмотрим это ради аргумента), а не интерпретатор, поэтому, если вы скомпилируете некоторый исходный код в Объектный файл и выполнить его, вы думаете, что он явно не интерпретируется. Но, как оказалось, это не очень четко определенная линия. Если вы считаете эмуляторы интерпретаторами, то вы можете интерпретировать любой исполняемый файл, независимо от того, на каком языке он начинался. Есть также бинарные переводчики и JIT-компиляторы с их байт-кодом, которые запутывают и без того запутанную проблему. Но обратите внимание, что путаница здесь полностью семантическая, решение, вероятно, является просто обновленным набором определений.
И наоборот, вы можете «скомпилировать» любой интерпретируемый язык, записав, какие инструкции выполняет интерпретатор при интерпретации программы, и воспроизведя ее как скомпилированную программу. Это не совсем компиляция, и она не будет более эффективной, чем интерпретатор, но дело в том, что интерпретация не является неотъемлемым качеством языка.
Итак, языки, которые традиционно компилируются , могут и иногда реализуются как интерпретируемые языки. Есть даже переводчики для Си. Я считаю, что это отвечает на ваш вопрос. Я думаю, что смысл F # заключается в том, что, хотя он и интерактивный, он не является настоящим интерпретатором в соответствии с самым строгим определением. Это потому, что он компилирует биты кода и затем запускает их. Это не означает, что строгий интерпретатор для F # не мог быть написан из-за некоторого свойства языка.