Подтвердить что ты не робот

Почему Kotlin необходимо связать свою рабочую среду после компиляции?

Я просто пытаюсь понять базовую архитектуру, которая, я думаю, я ошибаюсь.

В качестве примера возьмем учебник здесь.

Когда я это сделаю:

kotlinc-jvm hello.kt -include-runtime -d hello.jar

Зачем ему нужно связать время выполнения Kotlin в jar, если компилятор уже преобразовал код в байт-код Java?

4b9b3361

Ответ 1

Когда вы пишете приложение на Java, вы получаете возможность полагаться на все стандартные библиотеки классов. Классы java. (например, java.lang.*, java.util.*...) включены в каждую JRE, поэтому вам не нужно их самостоятельно упаковывать.

Kotlin включает свою собственную библиотеку стандартных классов (время исполнения Kotlin), отдельную для библиотеки классов Java. Чтобы распространять файл jar, который может быть запущен любым человеком с простой старой JRE, вам также необходимо связать время выполнения Kotlin.

Если вы не объединили время выполнения Kotlin, ваш пользователь должен будет убедиться, что время выполнения Kotlin находилось в пути к классам при выполнении вашего приложения. Связанная с вами страница дает пример этого сценария:

Компиляция библиотеки

Если вы разрабатываете библиотеку, которая будет использоваться другими приложениями Kotlin, вы можете создать файл .jar, не включив в него время выполнения Kotlin.

$ kotlinc-jvm hello.kt -d hello.jar

Если вы настраиваете таргетинг на других пользователей Kotlin, то разумно предположить, что у них уже будет доступность для Kotlin. Однако, если вы пытаетесь развернуть приложение для конечного пользователя, тогда вы хотите включить время выполнения Kotlin, чтобы ваше приложение было автономным.

Ответ 2

Принятый ответ Грега Копффа объясняет общий случай необходимости что-то связывать, но я чувствую, что основной вопрос был упущен: почему то, что компилируется в байт-код Java (и, следовательно, больше не является Kotlin), требует среды выполнения Kotlin " "?

Мое ожидание (и подозреваемого, я полагаю) состоит в том, что после компиляции больше не будет никаких следов Kotlin, и поэтому не должно быть необходимости во время выполнения Kotlin.

Я ожидаю также, что "среда выполнения" - это своего рода двоичный файл, такой как JRE, непосредственно ответственный за выполнение байт-кода.

Из справочника по языку Kotlin на пакетах:

Ряд пакетов импортируется в каждый файл Kotlin по умолчанию:

  • Котлин. *
  • kotlin.annotation. *
  • kotlin.collections. *
  • kotlin.comparisons. * (с версии 1.1)
  • kotlin.io. *
  • kotlin.ranges. *
  • kotlin.sequences. *
  • kotlin.text. *

Поэтому кажется, что:

  1. "среда выполнения Kotlin" на самом деле является просто "библиотекой классов Kotlin" (а не строго отдельной "средой выполнения", такой как JRE);

  2. когда код Kotlin скомпилирован в байт-код Java, Kotlin исчезает, но заменяющий его байт-код требует доступа к библиотеке классов Kotlin; так что

  3. среда выполнения Kotlin должна быть доступна любому байт-коду Java, который изначально был кодом Kotlin, что можно сделать, связав среду выполнения Kotlin с таким кодом.

Для меня использование командой Kotlin слова "время выполнения" вызвало так много путаницы. Я бы предпочел, чтобы они называли это "классами поддержки Kotlin", а не использовали термин Java с совсем другим значением.

Это не объясняет, почему так много вещей kotlin пространстве имен пакетов kotlin, или можно ли записывать файлы Kotlin, которые вообще не зависят от времени выполнения Kotlin, но, возможно, это проблемы другого вопроса.

Ответ 3

может быть .jar совместим с Java.
Kotlin может запустить .class сам по себе.
Это тоже работа

kotlinc hello.kt
kotlin HelloKt

Ответ 4

Среда выполнения Kotlin - это не что иное, как набор библиотек (связанных в jar), на которые ссылаются во время выполнения, как и любой другой jar в classpath.