J2CL - Better Late Than Never

Tidak ada yang bisa terlambat menghadiri pemakaman mereka.
Valentin Domil


Pekan lalu, sebuah tim dari Google akhirnya memposting kode sumber untuk kerangka kerja J2CL , yang telah dibicarakan sejak 2015. Gagasan untuk menerjemahkan Java ke dalam JavaScript masih jauh dari baru, dan semua orang telah lama mengisi kerucut dengan Google Web Toolkit, tetapi masyarakat menunggu produk ini tidak seperti yang lain - mereka membicarakannya dan berpidato, tetapi tidak ada yang melihatnya.



‌‌‍‍
Lebih dari 3 tahun telah berlalu sejak pengumuman pertama dan tampaknya produk tersebut telah kehilangan pasar tanpa dilahirkan. Hari ini kita memiliki Scala.js , Kotlin.js dan JSweet , belum lagi bahwa pengembangan web telah dibajak oleh TypeScript dan tidak ada ruang tersisa untuk Java. Selama masa ini, banyak, bahkan para ahli jav yang paling berdedikasi, telah kehilangan kepercayaan pada “Java for Front-end” dan mengekang kerangka JavaScript ini atau itu.


Sejak rilis itu terjadi, mari kita lihat apa yang terjadi, dan kepada siapa itu mungkin berguna.


Ide


Pada dasarnya, meniru JVM di browser adalah tugas yang sulit. Pengembang Google Web Toolkit telah menyelesaikannya sejak lama dan mencapai keberhasilan tertentu: mereka membangun penerjemah, mengembangkan mekanisme persaingan untuk perpustakaan Java standar, dan menyediakan penyempurnaan untuk pengembangan aplikasi.


Ada banyak keuntungan dari pendekatan ini: pengetikan statis, kemampuan untuk menggunakan kembali kode server di browser, dan alat yang sudah jadi dalam bentuk IDE Java. Banyak pendekatan yang awalnya diletakkan di GWT sekarang terlihat di TypeScript, Web Pack, dan alat pengembangan front-end lainnya.


Google Web Toolkit yang lama tidak disukai karena bentuknya yang tebal dan abstraksi untuk membangun UI. Gagasan J2CL lebih sederhana - memungkinkan Anda menerjemahkan Java ke JavaScript dengan biaya serendah mungkin, sehingga Anda dapat dengan mudah memanggil Java dari JavaScript dan sebaliknya.


Dan jika kembali pada tahun 2015 benar-benar akan ada penerjemah Java berkualitas tinggi di JS tanpa sampah yang tidak perlu, tidak diketahui bagaimana pengembangan web akan berkembang lebih lanjut.


Latar Belakang J2CL


Pada awal 2015, tim Google GWT membuat keputusan yang sulit namun perlu - untuk mengembangkan produk baru yang memungkinkan Anda menggunakan Java dalam pengembangan front-end.


Ini terutama disebabkan oleh tren perubahan dalam pengembangan web dan klien internal baru mereka, yang memandang Java untuk web bukan sebagai ekosistem yang terisolasi, tetapi sebagai bagian integral dari tumpukan besar. Ini membutuhkan visi yang sama sekali baru dan penciptaan alat-alat dari awal, yang harus diintegrasikan erat dengan ekosistem lainnya.


Dengan GWT, hampir tidak mungkin untuk mencapai tujuan-tujuan ini. Meskipun ada alat untuk interaksi dua arah dengan JavaScipt di GWT, kerangka kerja tidak bisa menghilangkan banyak barang bawaan dalam bentuk UI, perpustakaan RPC dan API aplikasi lainnya.


Binatang apa ini?


Menurut pengembang , J2CL menyediakan integrasi tanpa kode Java dalam aplikasi JavaScript. Ini adalah penerjemah Java ke JavaScript yang sederhana dan ringan dengan fokus pada pengoptimalan kode menggunakan Closure Compiler .


  • Anda dapat dengan mudah menggabungkan Java dan JavaScript dalam satu proyek, mendapatkan yang terbaik dari masing-masing bahasa.
  • Mengizinkan penggunaan kembali kode antara solusi server, aplikasi web, dan platform Android. Sejumlah besar perpustakaan Java tersedia, seperti: Guava, Dagger dan AutoValue.
  • Modern dan nyaman. Perakitan proyek didasarkan pada Bazel , didukung oleh Live-reload.
  • Terverifikasi. Dikatakan bahwa J2CL digunakan dalam produksi dalam proyek GSuite: GMail, Documents, Slide, dan Kalender.

Pada dasarnya, J2CL menerjemahkan kode sumber Java ke dalam kode JavaScript tanpa menggunakan bytecode kelas Java. Ini berarti bahwa, seperti dalam kasus Google Web Toolkit, kode sumber untuk semua perpustakaan yang digunakan diperlukan untuk mengkompilasi proyek. Selain itu, ini menimbulkan pertanyaan tentang dukungan untuk fitur bahasa Jawa dalam rilis baru. Saat ini, pengembang menjanjikan dukungan untuk semua fitur sintaksis Java 11.


J2CL tidak akan mendukung GWT Widgets, GWT RPC dan perpustakaan GWT lainnya - hanya Java dasar dan mesin integrasi JavaScript, JSInterop .


Yaitu Ini adalah versi GWT yang sangat terbatas dengan transporter yang sama sekali baru. Dan, karena produk baru tidak lagi kompatibel dengan GWT, itu disebut bukan GWT, tetapi J2CL. Akibatnya, rilis yang direncanakan dari GWT 3 akan menjadi kerangka kerja di atas J2CL, di mana semua pustaka aplikasi akan dipisahkan dari tingkat sistem penerjemah itu sendiri.


Pembatasan kompatibilitas Java yang ada dijelaskan di GitHub . Pada dasarnya, mereka tetap sama seperti di GWT - tidak ada dukungan refleksi, tidak ada API jaringan Java. Tetapi ada sesuatu yang berbeda - semantik array dan daftar tidak dicontoh, misalnya, pemeriksaan kemunculan indeks di batas array tidak dilakukan. Pengembang tidak fokus pada meniru perilaku JVM, tetapi pada sintaks bahasa untuk memastikan overhead minimum dan tidak menghasilkan banyak JavaScript untuk memastikan kompatibilitas penuh.


Meskipun J2CL siap diproduksi, versi OSS-nya masih jauh dari itu. Misalnya, ada masalah memulai proyek di Windows dan pengembang tidak menjanjikan API yang stabil.


Pilihan Bazel sebagai sistem build untuk produk internal Google mudah dijelaskan, tetapi tidak ada nilai tambah bagi komunitas, dan tidak ada cara lain untuk menggunakan J2CL selain mempelajari sistem build ini. Yang tersisa hanyalah menunggu komunitas menulis plugin untuk Maven / Gradle.


Coba


Pertama, untuk mencoba J2CL sekarang, Anda memerlukan Mac OS atau Linux.
Kedua, Anda perlu menginstal Bazel - sistem build yang agak eksotis dari Google.


Sekarang Anda setidaknya dapat mengumpulkan sesuatu, misalnya, HelloWorld dari repositori resmi.


> bazel build src/main/java/com/google/j2cl/samples/helloworld:helloworld 

Jika kita melihat kesimpulannya, kita akan terkejut:


 > cat bazel-bin/src/main/java/com/google/j2cl/samples/helloworld/helloworld.js document.write('Hello from Java! and JS!'); 

Ini tentu saja tidak membuktikan apa-apa, tetapi sangat senang dengan minimalis setelah modul GWT. Belum ada contoh aplikasi yang bagus, kami akan menunggu kemunculannya.


Mengapa perlu jika ada xxx.js


Jawaban atas pertanyaan mengapa ini perlu ditemukan masih sulit. Pada pandangan pertama, J2CL memiliki ide yang sangat kuat - untuk menggunakan kembali Java untuk frontend seperti halnya orang menggunakan TypeScript. Di sisi lain, proyek itu tampaknya terlambat.


Proyek transporter yang lebih baru di JS, seperti Kotlin.js dan Scala.js, diimplementasikan sebagai plugin kompiler dan tidak perlu mem-parsing ulang kode sumber. Dan dalam hal ini, J2CL adalah langkah mundur, karena membutuhkan kode sumber yang akan diuraikan.


Titik terpisah adalah bahasa Jawa itu sendiri. Mengapa menulis di Jawa verbose, jika Anda dapat menulis bagian server dan klien di Kotlin ringkas?


Meskipun, jika dibandingkan dengan proyek serupa lainnya - JSweet , maka saya lebih percaya J2CL. Perkakas JSweet jauh lebih ramah dan lebih siap digunakan, tetapi JSweet memiliki komunitas kecil dan hampir semuanya ditulis oleh satu orang.


Apakah Anda mengatakan kode sumber terbuka?


Tentu senang bahwa proyek ini memiliki lisensi terbuka untuk Apache 2.0.


Sayangnya, open source tidak berarti proses pengembangan terbuka . Kekecewaan terbesar masyarakat berasal dari situasi saat ini, proyek J2CL diumumkan 3 tahun lalu, tetapi tidak ada yang menunjukkan kode sumbernya, Anda tidak dapat memengaruhi API terakhirnya dan tidak mempercepat proses pengembangan, karena tidak ada tempat untuk mengirim tambalan.


Mari berharap situasi membaik dan produk menjadi layak.


Pembaruan: aplikasi J2CL pertama yang porting dari GWT2 - https://github.com/DominoKit/dominodo

Source: https://habr.com/ru/post/id430378/


All Articles