я уж не говорю про яву с ее собственной машиной. кстати визуал барсик тоже из той же оперы.
краем уха слыхал что и си шарп тош недалеко ушел.
не компилит в машинный код а сворачивает как Форт или Паскаль в свой свернуто-сшитый код. а потом исполняет.
разве не так ?
не так. совсем не так. Рассмотрим на примере C#:
1) На входе имеем исходный текст (текстовый файл)
2) После компиляции получаем exe, который на самом деле является контейнером для IL байт-кода. Этот exe и распространяется конечным юзерам
3) При запуске этого exe файла, управление передается JIT (Just In Time) компилятору IL кода. Который компилирует IL-байт код в машинный код (аналогичный тому что производят классические компиляторы). JIT компилятор знает на каком конкретно типе проца нужно выполнить код, какие есть ресурсы и т.п. С учетом этого он максимально эффективно компилирует функцию-точку входа в IL байт-коде в машинный код и передает ему управление. При компиляции все вызовы функций заменяются на передачу управления в JIT
4) Когда машинный код скомпилированной функции Main дойдет до вызова метода, управление попадет опять в JIT и он скомпилирует этот метод. После этого все ссылки на этот метод будут заменены на адрес уже скомпилированного машинного кода. Т.е. при втором, третьем и т.д. вызове, уже просто вызовется скомпилированный ранее код.
В этом большое преимущество перед обычными компиляторами типа C++, т.к. компилятор байт-кода в машинный уже знает конкретную модель процессора, знает сколько доступно памяти, какая конкретно ось и т.п. Это дает возможность проводить оптимизации, которые для классического C++ невозможны.
Есть тут и узкое место - первоначальный запуск приложения может занять больше времени чем нативный код от классического компилятора C++. Это тоже решается путем пердкомпиляции всего кода и размещении в системном хранилище уже скомпилированного кода.
Это делается путем запуска ngen.exe install <имя сборки>
После такой операции, при запуске exe файла с IL байт-кодом, система не станет его компилировать, а возьмет просто уже готовый скомпилированный машинный код из системного хранилища и запустит на выполнение.
Все тоже самое относится также и к Java, и не только. JavaScript, LUA и другие скриптовые языки тоже как правило компилируются JIT'ом
Но это еще не все. Байт-код хранит много информации и это дает возможность прямо во время выполнения анализировать, обращаться и вызывать неизвестные типы данных/методы и даже генерировать новые прямо в рантайме (reflection). Это дает огромнейшие возможности, которых классические языки практически лишены.
Могу точно утверждать что Java, C#, JS, LUA сегодня используют JIT. И я не слышал чтобы где-то пользовались интерпретаторами для них.