Java 8 bağlamında "şeker", "şeker çözücü" terimler nelerdir?


107

Java 8'de 'şekerleme' ve 'şekerleme' hakkında daha sık duyuyorum, bu terimler ne anlama geliyor? kavramsal mı yoksa sözdizimsel mi?

Bazı Örnek:

Java için yeniden şekillendirme varsayılan yinelenen döngü

Derlemede sözdizimsel şeker hakkında gözlemler.

Yanıtlar:


136

şeker , programlamada genellikle bazı yapıların yazılmasını ve okunmasını kolaylaştıran tatlı eklemelere, çoğunlukla kısayollara atıfta bulunur (ikincisi, uygulamada, programınızın yaşam döngüsü boyunca en önemlisidir).

Wikipedia'nın bir sözdizimsel şeker tanımı vardır, ancak tüm şekerin özünde sözdizimsel olmadığına dikkat etmelisiniz (son tatlı eklemelerin tümü yalnızca derleyici değişiklikleri değildi).

İşte birkaç örnek:

  • sonek ve önek artırma operatörleri ( i++ve ++i). Tek amaçları, ek bir ifade yazmaktan kaçınmaktır. Saf şekerdir.
  • +=, |=, &=Vb şekerin aynı tür malzemeden yapılmıştır.
  • İlkel türler ve nesneler arasındaki örtük dönüşüm de şekerdir.
  • tür çıkarımı da şekerdir.
  • Java 8 ile gelen Lambda ifadesi başka bir tür şekerdir (bu sadece sözdizimsel değil )

Java, özellikle modern dillerle karşılaştırıldığında yeterince özlü olarak görülmemektedir. Bu nedenle, kodun daha hızlı okunmasına yardımcı olan bu eklemeler memnuniyetle karşılanır.

Bitirmek için, şeker eksikliği programınızı şişmanlatabilirken, fazla şeker, aynı şeyleri yazmak için birçok farklı yola yol açarken, dilinizi bulandırabilir ve programınızı daha az tutarlı ve sürdürmesi daha zor hale getirebilir. . Başka bir şeker türü olan API şekeri, çoğunlukla API'yi kavramayı zorlaştıran bir vebadır, özellikle de eklemelerden (örneğin aşırı yükleme) yapıldığında.

Bu söyleniyor, şekerleme ya da

  • bir dilde gereksiz olan her şeyi kaldırma işlemi
  • bir kod işlemcinin şekerli bir ifadenin arkasında ne olduğunu bulması süreci (bu, örneğin tür çıkarımını içerebilir)

6
+1 Ayrıca, OP'nin sorduğu cevabı tamamlayacağı için desugar kısmından da bahsedebilirsiniz! :)
Rahul Tripathi

6
@justhalf Yalnızca bir işlevi geçebilmek için oluşturduğunuz tüm bu arabirimleri kaldırabildiğiniz zaman programlarınızın ne kadar zayıflayacağını düşünün.
Denys Séguret

42
"Sözdizimsel şeker, noktalı virgül kanserine neden olur." - Alan Perlis
Stuart Marks

12
C'nin ilk günlerinde sonek ve önek operatörleri bir zamanlar sözdizimsel şeker değildi. İlk derleyiciler bugünün standartlarına göre aptaldı ve bu operatörler tek bir makine kodu talimatı ile gerçekleştirilebilirdi, ancak eşdeğer atama ifadesi bunu yapamadı. Böylece daha verimli programlar yazmayı sağladılar.
Raedwald

3
@justhalf Bu soru çok ilgi gördü. Bu gibi durumlarda, yöneticilerin yapıcı olmayan yorumları silmesi nadir değildir. Yorumunuzun silinmesi gerektiğini sanmıyorum ama pek bir şey getirmedi.
Denys Séguret

17

"Desugaring", Java 8'de çok özel bir anlama sahip gibi görünmektedir. Bu, bir lambda ifadesinin gerçek bir somut yöntem çağrısına bağlı olabileceği çeşitli yolları ifade eden tümünü kapsayan bir terim gibi görünmektedir.

"Lambda İfadelerinin Tercümesi" hakkındaki bu belge, ayrıntılarla ilgileniyorsanız neler olup bittiğine dair gerçek ayrıntıları içeriyor gibi görünüyor.

Belgeden anahtar bir cümle:

Lambda'ları bayt koduna çevirmenin ilk adımı, lambda gövdesini bir yönteme dönüştürmektir.


6

Genel olarak javac'ta "tasnif etmek" bazı dil özelliklerinin önceden var olanlarla temsil edilmesine izin verir. Bu, sınıf dosya biçiminde büyük değişiklikler yapmadan onları bayt kodunda temsil etmeye izin verir. Ayrıca bu nedenle derleyicinin arka ucu ön uçtan daha kararlıdır. Bu, lambdalarda ve yöntem referanslarında kesinlikle olmadığı gibi, her yeni dil özelliğinin sadece sözdizimi şekeri olduğu anlamına gelmez. Derleyicide daha fazla "ayıklama" örneği vardır:

  • her döngü için, döngüler için C stiline göre "şekillenmiştir"
  • iddialar bir if cümlesine "önerisi kaldırılır"
  • iç sınıflar bağımsız bir sınıf olarak temsil edilir

Ayrıca String switch, tip silme, ... ile neler olduğunu da araştırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.