Cosa sono i termini "zucchero" e "desugar" nel contesto di Java 8?


107

Ho sentito parlare di "sugaring" e "desugaring" più spesso in Java 8, cosa significano questi termini? sono concettuali o sintattici.

Qualche esempio:

Ciclo iterato predefinito che risuona in java

Osservazioni sullo zucchero sintattico nella compilazione.

Risposte:


136

sugar , in programmazione, si riferisce solitamente a quelle aggiunte dolci , per lo più scorciatoie, che rendono alcuni costrutti più facili da digitare e da leggere (questi ultimi sono, in pratica, i più importanti durante il ciclo di vita del programma).

Wikipedia ha una definizione di zucchero sintattico, ma dovresti notare che non tutto lo zucchero è, in sostanza, sintattico (non tutte le recenti aggiunte dolci erano solo modifiche al compilatore).

Ecco alcuni esempi:

  • gli operatori di incremento suffisso e prefisso ( i++e ++i). Il loro unico scopo è evitare di scrivere una dichiarazione aggiuntiva. Sono zucchero puro.
  • +=, |=, &=, Ecc sono fatti dello stesso tipo di zucchero.
  • Anche la conversione implicita tra tipi primitivi e oggetti è zucchero.
  • anche l'inferenza del tipo è zucchero.
  • L'espressione lambda, in arrivo con Java 8, è un altro tipo di zucchero (questo non solo sintattico )

Java è ampiamente visto come non abbastanza conciso, soprattutto rispetto ai linguaggi moderni. Ecco perché quelle aggiunte che aiutano a rendere il codice più veloce da leggere sono benvenute.

Per finire, vorrei solo notare che mentre una mancanza di zucchero può rendere grasso il tuo programma, un eccesso di zucchero, che porta a molti modi diversi di scrivere le stesse cose, può rendere il tuo linguaggio nauseato e il tuo programma meno coerente e più difficile da mantenere . Un altro tipo di zucchero, lo zucchero API, è molto spesso una piaga che rende l'API più difficile da afferrare, specialmente quando è fatto di aggiunte (sovraccarico per esempio).

Detto questo, desugaring si riferisce a entrambi

  • il processo mediante il quale rimuovi tutto ciò che è ridondante in una lingua
  • il processo mediante il quale un elaboratore di codice scopre cosa c'è dietro un'istruzione zuccherata (questo può ad esempio coinvolgere l'inferenza del tipo)

6
+1 Puoi anche menzionare la parte desugar in quanto ciò completerebbe la risposta che OP ha chiesto! :)
Rahul Tripathi

6
@justhalf Pensa a quanto saranno sottili i tuoi programmi quando sarai in grado di rimuovere tutte quelle interfacce che crei solo per poter passare una funzione.
Denys Séguret,

42
"Lo zucchero sintattico provoca il cancro del punto e virgola." - Alan Perlis
Stuart Marks

12
Gli operatori postfisso e prefisso una volta, nei primi giorni di C, non erano zucchero sintattico. I primi compilatori erano stupidi, per gli standard odierni, e quegli operatori potevano essere implementati con un'istruzione di codice macchina, ma l'istruzione di assegnazione equivalente no. Così hanno permesso di scrivere programmi più efficienti.
Raedwald

3
@justhalf Questa domanda ha ricevuto molta attenzione. Non è raro in questi casi che gli amministratori cancellino i commenti che sembrano non costruttivi. Non penso che il tuo commento debba essere cancellato ma non ha portato molto.
Denys Séguret

17

"Desugaring" sembra avere un significato molto specifico in Java 8. Sembra essere un termine generico per esprimere i vari modi in cui un'espressione lambda può essere associata a una chiamata di metodo concreta.

Questo documento sulla "traduzione di espressioni lambda" sembra avere i dettagli reali di ciò che sta accadendo se sei interessato alle specifiche.

Una frase chiave dal documento:

Il primo passo per tradurre lambda in bytecode è desugaring il corpo lambda in un metodo.


6

In generale "desugaring" in javac permette di rappresentare alcune caratteristiche del linguaggio con altre preesistenti. Ciò consente di rappresentarli nel bytecode senza apportare grandi modifiche al formato del file di classe. Anche per questo motivo il back-end del compilatore è più stabile del front-end. Ciò non significa che ogni nuova funzionalità del linguaggio sia solo zucchero sintattico, come sicuramente non è il caso di lambda e riferimenti a metodi. Ci sono altri esempi di "desugaring" nel compilatore:

  • per ogni loop sono "desugared" allo stile C per i loop
  • le asserzioni sono "desugared" a una frase if
  • le classi interne sono rappresentate come una classe autonoma

Puoi anche indagare su cosa succede con lo switch String, type erasure, ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.