<...> код компилируется / переводится в байт-код, а затем JVM интерпретирует (?) Его в машинный код.Будет ли это примером компиляции JIT (Just in time)?
Да, при нацеливании на JVM Kotlin компилируется в файлы JVM *.class
, которые представляют собой формат байт-кода, который впоследствии может быть либоинтерпретируется JVM, компилируется в машинный код JVM во время выполнения программы (JIT) или даже скомпилируется досрочно (AOT) до машинного кода.Здесь компилятору Kotlin не нужно знать, как именно будет использоваться байт-код.
При нацеливании на javascript используется слово «transpiles».Что именно представляет собой код, скомпилированный до него, и будет ли он интерпретироваться или компилироваться далее на любом этапе?
Целевым форматом для Kotlin / JS является исходный код JavaScript.Вы можете попробовать создать любой пример Kotlin / JS и проверить *.js
выходные файлы , содержащие исходный код JS, в который преобразуется код Kotlin.Я считаю, что слово transpile ( translate + compile ) используется здесь, чтобы подчеркнуть, что целевой формат является исходным кодом, а не двоичным, в то время как компилятор все еще выполняетмного преобразований и оптимизаций.
Исходный код JavaScript также интерпретируется или JIT-компилируется, что зависит от механизма JavaScript, используемого для запуска программы.
При нацеливании на native это кодскомпилирован прямо в машинный код?Какие шаги выполняет LLVM?
Существует две возможные целевые формы для Kotlin / Native:
- A
*.klib
библиотека, которую можно повторно использовать в другом Kotlin /Родной проект.Это ZIP-архив, содержащий битовый код LLVM вместе с некоторыми специфичными для Kotlin метаданными . - Двоичный файл, специфичный для платформы, в одном из многочисленных форматов, включая статические и динамические библиотеки и исполняемые файлы.Это действительно машинный код для конкретной целевой платформы, который можно использовать для компоновки, если это библиотека, или запускать напрямую, если это исполняемый файл.В этом случае компилятор Kotlin вызывает компоновщик LLVM
lld
, чтобы связать двоичный файл из битового кода LLVM.