Apa istilah "gula", "desugar" dalam konteks Jawa 8?

107

Saya lebih sering mendengar tentang 'sugaring' dan 'desugaring' di Java 8, apa arti istilah-istilah ini? apakah mereka konseptual atau sintaksis.

Beberapa Contoh:

Pengulangan iterasi default resugaring ke java

Pengamatan tentang gula sintaksis dalam kompilasi.

Xelian
sumber

Jawaban:

136

sugar , dalam pemrograman, biasanya mengacu pada tambahan manis , kebanyakan pintasan, yang membuat beberapa konstruksi lebih mudah untuk diketik dan dibaca (yang terakhir, dalam praktiknya, yang paling penting selama siklus hidup program Anda).

Wikipedia memiliki definisi gula sintaksis tetapi Anda harus mencatat bahwa tidak semua gula, pada dasarnya, sintaksis (tidak semua tambahan manis baru-baru ini hanyalah perubahan penyusun).

Berikut beberapa contoh:

  • operator peningkatan postfix dan prefiks ( i++dan ++i). Satu-satunya tujuan mereka adalah untuk menghindari penulisan pernyataan tambahan. Itu gula murni.
  • +=, |=, &=, Dll terbuat dari jenis gula yang sama.
  • Konversi implisit antara tipe dan objek primitif juga merupakan gula.
  • jenis kesimpulan adalah gula juga.
  • Ekspresi Lambda, hadir dengan Java 8, adalah sejenis gula lain (yang ini bukan hanya sintaksis )

Java secara luas dipandang tidak cukup ringkas, terutama dibandingkan dengan bahasa modern. Itulah mengapa penambahan yang membantu membuat kode lebih cepat dibaca.

Sebagai penutup, saya hanya akan mencatat bahwa meskipun kekurangan gula dapat membuat program Anda gemuk, kelebihan gula, yang mengarah ke berbagai cara untuk menulis hal yang sama, dapat membuat bahasa Anda mual dan program Anda kurang koheren dan lebih sulit untuk dipertahankan. . Jenis gula lainnya, gula API, paling sering merupakan wabah yang membuat API lebih sulit untuk dipahami, terutama jika dibuat dengan tambahan (misalnya kelebihan muatan).

Ini dikatakan, desugaring mengacu pada

  • proses yang Anda gunakan untuk menghapus semua yang tidak diperlukan dalam suatu bahasa
  • proses di mana pemroses kode menemukan apa yang ada di balik pernyataan manis (ini mungkin misalnya melibatkan jenis inferensi)
Denys Séguret
sumber
6
+1 Anda juga dapat menyebutkan tentang bagian desugar karena itu akan melengkapi jawaban yang diminta OP! :)
Rahul Tripathi
6
@justhalf Pikirkan seberapa tipis program Anda nantinya ketika Anda akan dapat menghapus semua antarmuka yang Anda buat hanya untuk dapat melewatkan suatu fungsi.
Denys Séguret
42
"Gula sintaksis menyebabkan kanker titik koma." - Alan Perlis
Stuart Marks
12
Operator postfix dan prefix dulu, pada masa awal C, bukan gula sintaksis. Kompiler awal bodoh, menurut standar saat ini, dan operator tersebut dapat diimplementasikan dengan satu instruksi kode mesin, tetapi pernyataan penugasan yang setara tidak bisa. Jadi mereka memungkinkan penulisan program yang lebih efisien.
Raedwald
3
@justhalf Pertanyaan ini mendapat banyak perhatian. Tidak jarang dalam kasus tersebut admin menghapus komentar yang tampaknya tidak membangun. Saya tidak berpikir komentar Anda harus dihapus tetapi tidak menghasilkan banyak.
Denys Séguret
17

"Desugaring" tampaknya memiliki arti yang sangat spesifik di Java 8. Tampaknya menjadi istilah yang mencakup semua untuk mengekspresikan berbagai cara ekspresi lambda dapat diikat ke pemanggilan metode konkret yang sebenarnya.

Dokumen tentang "Terjemahan Ekspresi Lambda" ini tampaknya memiliki detail nyata tentang apa yang terjadi jika Anda tertarik secara spesifik.

Frase kunci dari dokumen:

Langkah pertama menerjemahkan lambda ke dalam bytecode adalah mendesain badan lambda menjadi sebuah metode.

Shorn
sumber
6

Secara umum, "desugaring" di javac memungkinkan merepresentasikan beberapa fitur bahasa dengan fitur yang sudah ada sebelumnya. Hal ini memungkinkan untuk merepresentasikannya dalam bytecode tanpa membuat perubahan besar pada format file kelas. Juga karena alasan ini bagian belakang kompiler lebih stabil daripada bagian depan. Ini tidak berarti bahwa setiap fitur bahasa baru hanyalah gula sintaksis, seperti yang jelas bukan kasus lambda dan referensi metode. Ada lebih banyak contoh "desugaring" di compiler:

  • untuk setiap loop "desugared" ke gaya C untuk loop
  • pernyataan "desugared" ke kalimat if
  • kelas dalam direpresentasikan sebagai kelas mandiri

Anda juga dapat menyelidiki apa yang terjadi dengan sakelar String, penghapusan tipe, ...

Vicente Romero
sumber