Как конкретно компилируется Kotlin? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь понять, как проходит исходный код Kotlin, когда он компилируется. В документации говорится

При нацеливании на JVM Kotlin создает Java-совместимый байт-код.Ориентируясь на JavaScript, Kotlin переносится на ES5.1 и генерирует код, который совместим с модульными системами, включая AMD и CommonJS.Ориентируясь на native, Kotlin будет генерировать специфичный для платформы код (через LLVM).

Насколько я понимаю, когда Kotlin нацеливается на JVM, код компилируется / переводится в байт-код, а затем JVM интерпретирует (?) это до машинного кода.Будет ли это примером компиляции JIT (Just in time)?

При нацеливании на javascript используется слово «transpiles».К чему именно код компилируется и интерпретируется или компилируется далее на любом этапе?

При нацеливании на native код компилируется непосредственно в машинный код?Какие шаги выполняет LLVM?

Наконец, будет ли это означать, что Kotlin является и компилируемым языком, и интерпретируемым языком?

1 Ответ

0 голосов
/ 26 ноября 2018

<...> код компилируется / переводится в байт-код, а затем 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.
...