Qual è la differenza tra "Sintassi" e "Zucchero sintattico"


45

sfondo

La pagina Wikipedia su Syntactic Sugar afferma:

In informatica, lo zucchero sintattico è sintassi all'interno di un linguaggio di programmazione progettato per rendere le cose più facili da leggere o da esprimere. Rende il linguaggio più "dolce" da usare per l'uomo: le cose possono essere espresse in modo più chiaro, più conciso o in uno stile alternativo che alcuni potrebbero preferire.

Non capisco davvero quale sia la differenza tra Syntactic Sugar e Syntax.

Apprezzo il punto che la versione zuccherata può essere più chiara, più concisa, forse far bollire un po 'di piastra. Ma mi sento ad un certo livello, tutta la sintassi lo sta facendo essenzialmente per formare un'astrazione su ciò a cui il codice viene compilato.

Dalla stessa pagina di Wikipedia:

I processori di linguaggio, inclusi compilatori, analizzatori statici e simili, spesso espandono i costrutti zuccherati in costrutti più fondamentali prima dell'elaborazione, un processo a volte chiamato "desugaring".

Come esercizio di pensiero, se prendo "spesso" in questa affermazione significhi "sempre": se la differenza fosse solo se il compilatore "desugar" la sintassi prima di passare a una fase successiva, come potrebbe un programmatore che non conosce le viscere del compilatore sa (o cura) cos'è la sintassi di Sugar o no?

Una domanda molto correlata su questo sito "Definizione rigorosa di zucchero sintattico?" ha una risposta che inizia:

IMHO Non penso che tu possa avere una definizione di zucchero sintattico, perché la frase è BS ed è probabile che venga usata da persone che parlano di "programmatori reali" usando "strumenti reali" su "sistemi operativi reali"

Cosa potrebbe indicarmi che forse non c'è un'enorme differenza nel programmatore che usa la lingua? Forse la differenza è percepibile solo dallo scrittore del compilatore? Sebbene ci possano essere casi in cui è utile che il programmatore che usa la lingua sappia cosa c'è sotto il cofano dello zucchero sintattico? (Ma forse in realtà qualsiasi discorso sull'argomento tende a usare il termine come esca di fiamma?)

Il cuore della domanda

Quindi ... la versione breve della domanda:

  • C'è una vera differenza tra Syntax e Syntactic Sugar?
  • A chi importa?

Cibo extra per il pensiero

Bonus sulla contraddizione argomento:

Sulla pagina di Wikipedia viene fornito un esempio:

Ad esempio, nel linguaggio C la a[i]notazione è zucchero sintattico per*(a + i)

Considerando che un'altra risposta alla domanda sopra collegata parla dello stesso esempio:

Adesso considera a[i] == *(a + i). Pensa a qualsiasi programma C che utilizza array in modo sostanziale.

E riassume che:

La []notazione facilita questa astrazione. Non è zucchero sintattico.

La conclusione opposta per lo stesso esempio!


9
Nella mia risposta alla domanda citata spiego che lo zucchero sintattico è una sintassi alternativa (per una sintassi già esistente nella lingua) che rende più semplice esprimere alcuni modi di dire comuni ma non introduce nuove semantiche. In questo senso, lo zucchero sintattico dipende dal contesto (dalla lingua in cui viene utilizzato): la stessa notazione può essere la sintassi normale in una lingua e lo zucchero sintattico in un'altra lingua. Questa spiegazione ti aiuta?
Giorgio,

7
Un problema è che alcune persone sembrano pensare che "zucchero sintattico" sia una parolaccia, quando non lo è. Ogni funzione o classe che aggiungi a un sistema potrebbe essere considerata "zucchero sintattico", poiché rendono le idee che erano chiaramente già esprimibili nella lingua un po '(o molto) più facili da esprimere.
Joris Timmermans,

Apparentemente, conta per te.
SShaheen,

11
Alla fine, è solo zucchero sintetico sull'elettricità.
Anthony Pegram,

Risposte:


34

La differenza principale è che la sintassi è la grammatica definita in una lingua per consentire di esporre alcune funzionalità. Non appena è possibile accedere a tale funzionalità, qualsiasi altra sintassi che ti consente di fare la stessa cosa viene considerata zucchero. Questo ovviamente si imbatte in scenari strani su quale delle due sintassi è lo zucchero, soprattutto perché non è sempre chiaro quale sia venuto per primo.

In pratica, lo zucchero sintattico viene utilizzato solo per descrivere la sintassi aggiunta a una lingua per facilitare la facilità d'uso, come la creazione di una lhs + rhsmappa di infissi lhs.Add(rhs). Considererei l'indicizzazione dell'array di C come zucchero sintattico.

È importante soprattutto perché i design eleganti tendono a limitare la quantità di duplicazione. Il bisogno (o almeno il desiderio) di zucchero sintattico è visto da alcuni come un segno di fallimento di un progetto.


"Non appena si arriva a quella funzionalità, qualsiasi altra sintassi che ti consente di fare la stessa cosa viene considerata zucchero.": Questo non è abbastanza per avere zucchero sintattico, perché allora qualsiasi altro programma che calcola la stessa funzione sarebbe zucchero sintattico . Il programma sugared e de-sugared deve avere la stessa semantica .
Giorgio,

3
@Giorgio In che modo "questi due programmi calcolano la stessa funzione" diversi da "questi due programmi hanno la stessa semantica"? A parte questo, ti stai concentrando su programmi, non su elementi sintattici. Programmi interi non possono essere zuccheri sintattici. Un operatore, una specie di affermazione, ecc. Può essere zucchero sintattico.

@Giorgio - In effetti, sto considerando funzionalità simili con semantica diversa come funzionalità diverse. E sì, potrebbe esserci un salto nel cerchio come scrivere il tuo compilatore che ha la stessa semantica e chiamarlo "zucchero". Francamente, una definizione formale non accadrà per un concetto così informale.
Telastyn,

1
@Giorgio Ancora una volta, la mia carne bovina non è con la tua opinione sull'equivalenza, ma che cerchi di applicare il concetto di zucchero sintattico ai programmi. Il termine non si riferisce a interi programmi! A seconda della tua definizione, è solo blocchi di costruzione atomici o solo brevi frammenti di programma (il primo sembra coprire> 80%, ma non sono sicuro che copra tutto ciò che viene comunemente considerato zucchero sintattico).

3
@Giorgio Ad esempio, interi programmi ;-) O qualcosa di abbastanza grande che entrambe le formulazioni coinvolgano diverse parole chiave non correlate. Qualcosa che non sono mai stato trattato come zucchero sintattico è if (a) return blah; ...contro result_type res; if (a) res = blah; else {...}; return res;. Dovresti assumere lingue specifiche e ottenere un avvocato estremamente linguistico (spesso fino alla semantica operativa di piccolo passo), per trovare alcuna differenza tra quei programmi.

10

La sintassi è ciò che un elaboratore di linguaggio usa per capire cosa significano i costrutti di una lingua. Anche i costrutti considerati zucchero sintattico devono essere interpretati dall'elaboratore del linguaggio e quindi fanno parte di una sintassi del linguaggio.

Che ciò che distingue lo zucchero sintattico oltre al resto della sintassi di una lingua è che sarebbe possibile rimuovere lo zucchero sintattico dalla lingua senza influenzare i programmi che possono essere scritti nella lingua.

Per dare una definizione più formalistica, direi

Lo zucchero sintattico è quelle parti della sintassi di una lingua i cui effetti sono definiti in termini di altri costrutti di sintassi nella lingua.

Questo non intende in alcun modo denigrare lo zucchero sintattico, o le lingue che lo hanno, perché l'uso dello zucchero sintattico spesso porta a programmi il cui intento è più comprensibile.


"Non c'è modo di dire definitivamente 'questo è zucchero sintattico e che è sintassi', perché lo zucchero sintattico fa parte della sintassi di una lingua.": Falso. È il progettista del linguaggio che introduce una sintassi come zucchero sintattico per un costrutto che è già nella lingua e ha una sintassi. Lo zucchero sintattico è normalmente ad-hoc (meno generale) ma più leggibile / comodo da usare.
Giorgio,

@Giorgio: ho riformulato il mio primo paragrafo perché era un po 'imbarazzante. Ma non sono d'accordo sul fatto che lo zucchero sintattico viene normalmente aggiunto ad hoc. Il pezzetto di zucchero sintattico più conosciuto è probabilmente l' ->operatore di C e non vedo come tale operatore sia meno generale di tutti gli altri.
Bart van Ingen Schenau,

1
@Giorgio: In quel caso, tutto ciò che non si associa direttamente a una singola istruzione di assemblaggio dovrebbe essere considerato come zucchero sintattico, perché potrebbe sempre essere suddiviso in pezzi più semplici (questo include funzioni). Non credo che non troverai molte persone che condividono questa visione.
Bart van Ingen Schenau,

1
"Ad-hoc" significa che viene utilizzato in una situazione speciale e limitata. Il termine non ha una connotazione negativa in generale. Il termine soluzione ad hoc ha una connotazione negativa, perché normalmente si vogliono soluzioni generali, non particolari (per evitare di risolvere problemi simili ancora e ancora).
Giorgio,

1
Poiché le "soluzioni ad hoc" sono spesso sbagliate, può sembrare che "ad hoc" significhi male. Ma c'è anche un sovraccarico della funzione AKA "polimorfismo ad hoc" ( en.wikipedia.org/wiki/Ad_hoc_polymorphism ), che non è male. Almeno in italiano (la mia lingua madre), l'uso del latino "ad-hoc" non è di per sé negativo. Se ha una connotazione negativa in inglese, perdona la mia ignoranza.
Giorgio

6

Le altre risposte non hanno menzionato un concetto chiave: sintassi astratta ; senza di essa, il termine "zucchero sintattico" non ha alcun senso.

La sintassi astratta definisce gli elementi e la struttura delle lingue e il modo in cui le frasi di quella lingua possono essere combinate per costruire frasi più grandi. La sintassi astratta è indipendente dalla sintassi concreta. Il termine "zucchero sintattico", a quanto ho capito, si riferisce a una sintassi concreta.

In generale, durante la progettazione di una lingua, ti consigliamo di creare una sintassi concreta per ogni termine della sintassi astratta, in modo che le persone possano scrivere codice nella tua lingua usando il testo normale.

Ora diciamo che crei una sintassi scomoda e concreta per foo . Gli utenti si lamentano e si implementa una nuova sintassi concreta per rappresentare la stessa sintassi astratta . Il risultato è che la sintassi e la semantica astratte non sono cambiate, ma ora hai due sintassi concrete per lo stesso termine di sintassi astratta.

Questo, credo, è ciò che le persone intendono quando dicono "zucchero sintattico" - cambiamenti che influenzano solo la sintassi concreta, ma che non influenzano la sintassi astratta o la semantica.

E così la differenza tra "zucchero sintattico" e "sintassi concreta" è ora chiara. Per me. :)

Questa interpretazione aiuta anche a spiegare cosa avrebbe potuto significare Alan Perlis quando ha detto "lo zucchero sintattico causa il cancro del punto e virgola": tutto lo zucchero sintattico concreto nel mondo non può riparare la sintassi astratta debole, e tutto lo sforzo che spendi per aggiungere che lo zucchero è sforzo che non stai spendendo per affrontare il vero problema: la sintassi astratta.


Dovrei anche notare che questa è solo la mia opinione; Ci credo solo perché è l'unica interpretazione a cui riesco a pensare che abbia senso per me.


1
Avevo pensato anche al confronto tra sintassi e sintassi concreta, ma non sono sicuro che questo spieghi sempre lo zucchero sintattico. Ad esempio, in C, dato un puntatore pad una struttura che contiene un campo x, fare le espressioni (*p).xe p->xhanno la stessa sintassi astratta? Ma penso che sarebbe bello se tutto si riducesse alla sintassi astratta contro concreta.
Giorgio,

@Giorgio sfortunatamente, non conosco abbastanza C per affermare con sicurezza se uno di questi è zucchero sintattico per l'altro, o come sarebbero i loro alberi di sintassi astratti. O anche se la specifica di C in realtà definisce una sintassi astratta. :(

1
La prima espressione può essere analizzata come un albero con .a alla radice. Il nodo secondario sinistro della radice è a *, e il suo figlio è p. Il nodo secondario giusto della radice è x. Per la seconda espressione, l'albero di sintassi astratto ha ->a nella radice e la radice ha due figli pe x. Sto cercando di capire se ha senso analizzare entrambe le espressioni in modo diverso in modo che abbiano lo stesso albero di sintassi astratto, ma non vedo come al momento.
Giorgio,

3
Non credo che questo albero di analisi, anche se spesso descritto come un AST, sia lo stesso della sintassi astratta di cui parla Matt. Entrambe le espressioni hanno l'azione identica ( converti il ​​tipo di puntatore in tipo di riferimento, quindi ottieni il riferimento al membrox )
Inutile

1
"Entrambe le espressioni hanno l'azione identica (converti il ​​tipo di puntatore in tipo di riferimento, quindi ottieni il riferimento al membro x)": questa è la semantica, non la sintassi astratta. La sintassi astratta si riferisce a tralasciare dettagli inutili della sintassi concreta (come (o ;) per produrre un albero che rifletta la struttura effettiva di un programma (vedi en.wikipedia.org/wiki/Abstract_syntax_tree ). Tuttavia, nella sintassi astratta non si dice (ancora) nulla sulla semantica del programma.
Giorgio,

4

Lo zucchero sintattico è un sottoinsieme della sintassi delle lingue. L'idea di base è che esiste più di un modo per dire la stessa cosa.

Ciò che rende difficile dire quali pezzi sono zucchero sintattico e quali pezzi sono "pura sintassi" sono affermazioni del tipo "è difficile dire quale forma sia venuta prima" o "è difficile sapere in che modo intendesse l'autore della lingua" o "è in qualche modo arbitrario decidere quale forma è più semplice ".

Ciò che rende facile decidere quali pezzi sono puri o zuccherini è porre la domanda nell'ambito di uno specifico compilatore o interprete. La sintassi pura è l'elemento che un compilatore converte direttamente in codice macchina o al quale l'interprete risponde direttamente. Lo zucchero è la roba che per prima viene trasformata in altre cose di sintassi prima che accadano queste cose dirette. A seconda dell'implementazione, questo può essere o meno lo stesso di quello che l'autore intendeva o anche quello che afferma la specifica della lingua.

In pratica, questo è il modo in cui viene decisa la realtà della questione.


Questa risposta collega erroneamente l'implementazione della sintassi al fatto che si tratti di zucchero o meno. Non ho mai visto un argomento = se un elemento di una lingua sia "zucchero" o meno che si preoccupi di come viene implementato l'elemento. Si tratta semplicemente di duplicare un elemento diverso, più brutto, sintatticamente.
GreenAsJade,

3

Davvero, la tua prima citazione da Wikipedia dice tutto "... rende le cose più facili da leggere ...", ".... più dolce da usare per gli umani ....".

Per iscritto, forme abbreviate come "non" o "non" potrebbero essere considerate zucchero sintattico.


Considera (1) "Dovrei andare ora" contro (2) "Dovrei andare ora": (1) lo zucchero sintattico per (2)?
Giorgio,

1
@Giorgio direi di no.
ozz,

A causa della leggibilità ("dovrebbe" non è più leggibile di "dovrebbe") o per significato ("dovrebbe" e "dovrebbe" avere significati diversi).
Giorgio,

@Giorgio abbastanza equo :)
ozz

1
Ah, vedo :) più di un istinto, credo, non credo che uno sia più leggibile dell'altro in quell'esempio
ozz,

3

Di solito lo zucchero sintattico è la parte del linguaggio che può essere espressa dalla parte esistente del linguaggio (sintassi) senza perdita di generalità ma con perdita di chiarezza. A volte i compilatori hanno esplicito passaggio di desugarizzazione che trasforma l'AST creato dal codice sorgente e applica semplici passaggi per rimuovere i nodi corrispondenti allo zucchero.

Ad esempio Haskell ha zucchero di sintassi per monadi con le seguenti regole applicate in modo ricorsivo

do { f }            ~> f
do { g; h }         ~> g >> do h
do { x <- f; h }    ~> f >>= \x -> do h
do { let x = f; h } ~> let x = f in do h

In questo momento non importa cosa significhi esattamente - tuttavia puoi vedere che una sintassi speciale su LHS può essere trasformata in qualcosa di più basilare su RHS (vale a dire applicazioni di funzione, lambda e let's). Questo passaggio consente di mantenere il meglio di entrambi i mondi:

  1. La sintassi su LHS è più facile per il programmatore (zucchero di sintassi) che esprime le idee esistenti in modo più chiaro
  2. Tuttavia, poiché il supporto nel compilatore per i costrutti RHS esiste già nel compilatore, non è necessario trattarlo come qualcosa di speciale al di fuori di parser e desugaring (tranne per la segnalazione di errori).

Allo stesso modo in C puoi immaginare la regola di riscrittura di desugaring (a causa del sovraccarico dell'operatore ecc. Non è vero per C ++):

f->h ~> (*f).h
f[h] ~> *(f + h)

Potresti immaginare di scrivere tutti i programmi senza usare ->o []in C che usano questa costruzione oggi. Tuttavia, sarebbe più difficile per i programmatori utilizzarlo, quindi fornire zucchero sintassi (suppongo che negli anni '70 potrebbe semplificare il lavoro anche per i compilatori). È forse meno chiaro in quanto è possibile aggiungere tecnicamente la seguente regola di riscrittura perfettamente valida:

*f ~> f[0] -- * and [] have the same expressiveness 

Lo zucchero di sintassi è cattivo? Non necessariamente: esiste il pericolo che venga usato come culto del carico senza comprendere un significato più profondo. Ad esempio, le seguenti funzioni sono equivalenti in Haskell, ma molti principianti scriveranno il primo modulo senza capire che stanno abusando dello zucchero di sintassi:

f1 = do x <- doSomething
        return x
f2 = doSomething

Inoltre, la sintassi dello zucchero potrebbe complicare eccessivamente la lingua o essere troppo ristretta per consentire un codice idiomatico generalizzato. Potrebbe anche significare che il linguaggio non è abbastanza potente per fare certe cose facilmente - potrebbe essere in base alla progettazione (non fornire agli sviluppatori strumenti precisi o un linguaggio di nicchia molto specifico che l'aggiunta di un costrutto più potente danneggerebbe altri obiettivi) o per omissione - quest'ultimo il modulo ha dato alla sintassi lo zucchero il nome sbagliato. Se il linguaggio è abbastanza potente da usare altri costrutti senza aggiungere zucchero di sintassi, è considerato più elegante usarli.


3

Penso che l'esempio più ovvio sarebbe la sintassi "+ =" in C.

i = i + 1;

e

 i +=  1;

fare esattamente la stessa cosa e compilare esattamente lo stesso set di istruzioni della macchina. La seconda forma salva un paio di caratteri digitando, ma, cosa ancora più importante, chiarisce che stai modificando un valore basato sul suo valore corrente.

Stavo per citare l'operatore post / prefisso "++" come esempio canonico, ma mi sono reso conto che questo era più che zucchero sintattico. Non è possibile esprimere la differenza tra ++ i e i ++ in una singola espressione usando la i = i + 1sintassi.


+ = può essere utile in casi come a[f(x)] += 1.
Florian F,

1

In primo luogo, affronterò alcune delle altre risposte con un esempio concreto. C ++ 11 basato su range per loop (molto simile a foreach loop in varie altre lingue)

for (auto value : container) {
    do_something_with(value);
}

è esattamente equivalente a (cioè una versione zuccherata di)

for (auto iterator = begin(container); iterator != end(container); ++iterator) {
    do_something_with(*iterator);
}

Ora, nonostante non abbia aggiunto una nuova sintassi o semantica astratta al linguaggio, ha una vera utilità.

La prima versione rende esplicito l'intento (visitando ogni elemento in un contenitore). Vieta inoltre comportamenti insoliti come la modifica del contenitore durante l'attraversamento, o l'avanzamento ulteriore iteratornel corpo del circuito, o il fatto che le condizioni del circuito siano sottilmente errate. Questo evita possibili fonti di bug e, nel farlo, riduce la difficoltà di lettura e ragionamento sul codice.

Ad esempio, un errore di un carattere nella seconda versione:

for (auto iterator = begin(container); iterator <= end(container); ++iterator) {
    do_something_with(*iterator);
}

dà un errore "end-the-end-end" e un comportamento indefinito.

Quindi, la versione zuccherata è utile proprio perché è più restrittiva e quindi più semplice fidarsi e comprendere.


In secondo luogo, alla domanda originale:

C'è una vera differenza tra Syntax e Syntactic Sugar?

No, "zucchero sintattico" è una sintassi (concreta) del linguaggio, considerata "zucchero" perché non estende la sintassi astratta o la funzionalità principale del linguaggio. Mi piace la risposta di Matt Fenwick su questo.

A chi importa?

È importante per gli utenti della lingua, così come qualsiasi altra sintassi, e in quanto lo zucchero è fornito per supportare (e in un certo senso benedire) idiomi specifici.

Infine, sulla domanda bonus

La notazione [] facilita questa astrazione.

questo assomiglia molto alla definizione di zucchero sintattico: supporta (e fornisce la benedizione degli autori del linguaggio) usando i puntatori come array. Il p[i]modulo non è davvero più restrittivo di *(p+i), quindi l'unica differenza è la chiara comunicazione di intenti (e un leggero guadagno di leggibilità).


Per prima cosa dici "[l'intervallo basato su loop] è esattamente equivalente a (cioè una versione zuccherata di) [qualche altra cosa]". Ma poi dici che è diverso, in quanto proibisce di modificare il contenitore durante l'attraversamento ... e ci sono altre differenze che lo rendono più della semplice trasformazione sintattica che hai descritto (ad es. Comportamento quando "contenitore" è temporaneo). Queste differenze implicano che non è solo zucchero sintattico, giusto? Quindi mi sembra che questo non sia un buon esempio di zucchero sintattico.
Don Hatch,

Non ho detto che era equivalente a un ciclo generale , ho detto che era equivalente al ciclo specifico dato. Il ciclo specifico non modifica il contenitore e rappresenta un linguaggio molto comune, ma è comunque necessario leggere attentamente ogni ciclo generale per dire se sta seguendo quel linguaggio comune o se qualcosa di insolito si nasconde nel corpo del ciclo. Il ciclo più recente è lo zucchero per quell'idioma comune , essendo sia meno prolisso che comunicando più chiaramente l'idioma in uso. Non è, e non ho mai sostenuto che lo fosse, in qualche modo zucchero per l'idea generale di un ciclo.
Inutile

0

Qualunque fosse la connotazione originale della frase, al giorno d'oggi è principalmente un peggiorativo, quasi sempre definito come "solo" o "solo" zucchero sintattico. Praticamente conta solo per i programmatori a cui piace fare le cose nel modo illeggibile e vogliono un modo conciso di giustificarlo ai propri colleghi. Una definizione di coloro che usano principalmente il termine oggi, dal loro punto di vista, sarebbe qualcosa del tipo:

Sintassi ridondante con altra sintassi più ampiamente applicabile, al fine di fornire una stampella per i programmatori che non capiscono davvero la lingua.

Ecco perché ottieni due conclusioni opposte per lo stesso elemento sintattico. Il tuo primo esempio sulla notazione di array sta usando il significato positivo originale del termine, qualcosa di simile alla risposta di Bart. Il tuo secondo esempio è difendere la notazione array contro l'accusa di essere zucchero sintattico in senso peggiorativo. In altre parole, sta sostenendo che la sintassi è un'astrazione utile piuttosto che una stampella.


Penso che il significato peggiorativo del termine ("è solo zucchero sintattico") deriva dal fatto che lo zucchero sintattico non aggiunge alcuna informazione.
Giorgio,

1
Potrebbe venire dall'idea che la sintattica non aggiunge alcuna informazione , ma quell'idea non è un dato di fatto. Le informazioni sull'intenzione (ad esempio, per usare un linguaggio ben noto) sono ancora informazioni.
Inutile

@Inutile: per informazione intendevo che un programma si comporta allo stesso modo con o senza zucchero sintattico. Naturalmente può essere più leggibile con lo zucchero sintattico (aggiunge informazioni / documentazione per il lettore) che è un vantaggio.
Giorgio,

Bogus. Lo zucchero sintattico non è un peggiorativo. Qualsiasi programmatore degno di nota creerà librerie che incapsulano e semplificano attività più complesse, piuttosto che copiare e incollare lo stesso codice ovunque. Questo porta a un codice più educato e più gestibile. Questo è essenzialmente ciò che lo zucchero sintattico realizza estraendo schemi comuni, sebbene complessi, in una sintassi più semplice.
Craig,

Sto dicendo che le persone di solito intendono il termine come un insulto, non sto commentando la pratica sottostante stessa. Dire la parola "idiota" è un perjorativo non implica che tutte le persone siano idioti. Quando le persone vogliono parlare positivamente della pratica, di solito usano termini come "astrazione" o "incapsulamento".
Karl Bielefeldt,
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.