Pertanyaan Mengapa Kotlin perlu menggabungkan runtime-nya setelah dikompilasi?


Saya hanya mencoba memahami arsitektur yang mendasarinya, yang menurut saya saya salah.

Mengambil tutorial sini sebagai contoh.

Ketika saya melakukannya:

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

Mengapa diperlukan untuk menggabungkan runtime Kotlin ke dalam toples jika compiler sudah mengkonversikan kode ke Java bytecode?


32
2018-06-01 02:59


asal


Jawaban:


Ketika Anda menulis aplikasi di Java, Anda bisa mengandalkan semua pustaka kelas standar. Itu java. kelas (mis. java.lang.*, java.util.* ...) disertakan dengan setiap JRE, jadi Anda tidak perlu mengemasnya sendiri.

Kotlin termasuk perpustakaan kelas standarnya sendiri (the Kotlin runtime), terpisah ke perpustakaan kelas Java. Untuk mendistribusikan file jar yang dapat dijalankan oleh siapa saja dengan JRE biasa lama, Anda perlu menggabungkan runtime Kotlin juga.

Jika Anda tidak memaketkan runtime Kotlin, maka pengguna Anda harus memastikan runtime Kotlin berada di classpath ketika menjalankan aplikasi Anda. Halaman yang Anda tautkan memberikan contoh skenario ini:

Menyusun sebuah perpustakaan

Jika Anda mengembangkan pustaka untuk digunakan oleh aplikasi Kotlin lain, Anda dapat menghasilkan file .jar tanpa menyertakan runtime Kotlin ke dalamnya.

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

Jika Anda menargetkan pengguna Kotlin lain, maka masuk akal untuk menganggap mereka sudah memiliki runtime Kotlin tersedia untuk mereka. Namun, jika Anda mencoba menerapkan aplikasi untuk pengguna akhir, maka Anda ingin menyertakan runtime Kotlin sehingga aplikasi Anda mandiri.


30
2018-06-01 03:52



Jawaban yang diterima Greg Kopff menjelaskan kasus umum karena perlu memaketkan sesuatu, tetapi saya merasa bahwa titik utama dari pertanyaan itu terlewatkan: mengapa harus sesuatu yang mengkompilasi ke Java byte-code (dan karena itu tidak lagi Kotlin) membutuhkan "runtime" Kotlin?

Harapan saya (dan pertanyaan dari penanya, saya kira) adalah bahwa sekali dikompilasi, tidak ada jejak Kotlin lagi, dan oleh karena itu tidak perlu ada runtime Kotlin.

Harapan saya adalah bahwa "runtime" adalah semacam biner asli, seperti JRE, yang secara langsung bertanggung jawab untuk mengeksekusi kode byte.

Dari Referensi bahasa Kotlin di paket, meskipun:

Sejumlah paket diimpor ke setiap file Kotlin secara default:

  • kotlin. *
  • kotlin.annotation. *
  • kotlin.collections. *
  • kotlin.comparisons. * (sejak 1.1)
  • kotlin.io. *
  • kotlin.ranges. *
  • kotlin.sequences. *
  • kotlin.text. *

Oleh karena itu, tampaknya:

  1. "Kotlin runtime" sebenarnya hanyalah "perpustakaan kelas Kotlin" (dan bukan "runtime" terpisah seperti JRE);

  2. ketika kode Kotlin dikompilasi ke dalam Java byte-code, Kotlin hilang, tetapi byte-code yang menggantikannya membutuhkan akses ke perpustakaan kelas Kotlin; dan sebagainya

  3. runtime Kotlin harus tersedia untuk setiap byte-kode Java yang awalnya kode Kotlin, yang dapat dilakukan dengan menggabungkan runtime Kotlin dengan kode tersebut.

Bagi saya, penggunaan kata “runtime” oleh tim Kotlin inilah yang memicu begitu banyak kebingungan. Saya lebih suka bahwa mereka menyebutnya "kelas dukungan Kotlin" daripada menggunakan istilah Jawa dengan konotasi yang sangat berbeda.

Ini tidak menjelaskan mengapa begitu banyak hal di bawah kotlin namespace paket diperlukan, atau apakah file Kotlin dapat ditulis yang tidak benar-benar bergantung pada runtime Kotlin sama sekali, tetapi mungkin ini adalah masalah untuk pertanyaan lain.


16
2018-05-12 10:43