Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Naar inhoud springen

Syntactische suiker: verschil tussen versies

Uit Wikipedia, de vrije encyclopedie
Verwijderde inhoud Toegevoegde inhoud
k eerste zin aangepast
Lijstcomprehensies: direct link
 
(23 tussenliggende versies door 16 gebruikers niet weergegeven)
Regel 1: Regel 1:
In [[Computertaal|computertalen]] verwijst '''syntactische [[Tafelsuiker|suiker]]''' naar toevoegingen aan de [[Syntaxis (informatica)|syntaxis]] die de [[Expressiviteit|uitdrukkingskracht]] van de taal niet vergroten maar het voor de [[Softwareontwikkelaar|programmeur]] wel makkelijker maken iets te [[programmeren]] of uit te drukken. Deze taalelementen geven een alternatieve en praktischere manier om iets te schrijven met behulp van een korte of meer bekende notatie. Deze notatie beïnvloedt de uitdrukkingskracht van het taal niet. Deze term is bedacht door [[Peter J. Landin]].
In [[Computertaal|computertalen]] verwijst '''syntactische suiker''' naar toevoegingen aan de [[Syntaxis (informatica)|syntaxis]] die er niet voor zijn bedoeld de mogelijkheden van de taal te vergroten, maar om het de [[Softwareontwikkelaar|programmeur]] mogelijk te maken sommige delen beknopter te kunnen [[Programmeren (computer)|programmeren]]. Het is duidelijk dat [[Tafelsuiker|suiker]] hier in overdrachtelijke zin is bedoeld. Deze taalelementen geven een alternatieve en praktischere manier om iets te programmeren met behulp van een korte of meer bekende notatie. Deze notatie beïnvloedt de uitdrukkingskracht van de taal niet. PJ Landin is op de naam gekomen.


Syntactische suiker kan gemakkelijk worden omgeschreven ("ontsuikerd") naar taalelementen die wel tot de kern van de taal behoren. Bij Landin was dat de [[lambdacalculus]] die uitgebreid werd met een paar operaties, zoals het toekennen van waarden (assignatie). De programmeertalen [[ML (programmeertaal)|ML]] en [[Scheme]] zijn later ontworpen op basis van dit principe: deze talen bevatten een aantal essentiële taalconstructies waar syntactische suiker in uitgedrukt kan worden. In de [[wiskunde]] is het een gebruikelijk principe om te beginnen met zo weinig mogelijk basiselementen en de meeste berekeningen uit te voeren in een gemakkelijkere notatie die uitgedrukt kan worden in die basiselementen.
Syntactische suiker kan gemakkelijk worden omgeschreven naar [[broncode]], waarin de elementen wel tot de kern van de taal behoren. Bij Landin was dat de [[lambdacalculus]] die met een paar operaties werd uitgebreid, zoals het toekennen van waarden. De programmeertalen [[ML (programmeertaal)|ML]] en [[Scheme]] zijn later ontworpen op basis van dit principe: deze talen bevatten een aantal essentiële taalconstructies, die door middel van syntactische suiker beknopter kunnen worden geformuleerd. In de [[wiskunde]] is het een gebruikelijk principe om te beginnen met zo weinig mogelijk basiselementen en de meeste berekeningen uit te voeren in een gemakkelijkere notatie, die in die basiselementen kan worden uitgedrukt.


==Voorbeelden==
== Voorbeelden ==
=== Infixnotatie van operatoren ===
De meeste [[Programmeertaal|programmeertalen]] maken het mogelijk om eenvoudige wiskundige berekeningen in [[infix]]notatie te noteren, zoals <code>i + 3</code>. Veel van deze talen, vooral [[Functioneel programmeren|functionele programmeertalen]], voeren deze berekeningen uit door een [[Functie (wiskunde)|functie]] aan te roepen waardoor de infixnotatie eigenlijk syntactische suiker is voor bijvoorbeeld <code>add i 3</code>.


=== Strings in Haskell ===
De meeste [[Programmeertaal|programmeertalen]] maken het mogelijk om eenvoudige wiskundige berekeningen in [[infixnotatie]] te noteren, zoals <code>i + 3</code>. Veel van deze talen, met name [[Functionele programmeertaal|functionele programmeertalen]], voeren deze berekeningen uit door een [[Functie (wiskunde)|functie]] aan te roepen waardoor de infixnotatie eigenlijk syntactische suiker is voor bijvoorbeeld <code>add i 3</code>.
Veel programmeertalen bevatten een beknopte notatie voor [[tekenreeks]]en of strings, een reeks [[Letter|karakters]]. In bijvoorbeeld [[Haskell (programmeertaal)|Haskell]] kan <code>Wikipedia</code> ook op die manier worden geschreven, als <code>Wikipedia</code>. Dit is syntactische suiker aangezien een string in Haskell wordt voorgesteld als een [[Lijst (informatica)|lijst]] karakters. Deze string wordt eigenlijk geschreven als:


: <code>['W','i','k','i','p','e','d','i','a']</code>
Veel programmeertalen bevatten een makkelijkere notatie voor [[String (informatica)|strings]], een reeks [[letter|tekens]]. In bijvoorbeeld [[Haskell]] kan de string "Wikipedia" als volgt geschreven worden: <code>"Wikipedia"</code>. Dit is syntactische suiker aangezien een string in Haskell wordt voorgesteld als een [[Lijst (informatica)|lijst]] tekens (''characters'' in het [[Engels]]). Deze string wordt eigenlijk geschreven als:


Deze notatie voor een lijst is dus ook weer syntactische suiker: een lijst in Haskell is namelijk leeg, geschreven als <code>[]</code>, of een lijst waar een element aan wordt toegevoegd, geschreven als <code>e : lijst</code> waarbij <code>e</code> het element is en '<code>:</code>' een [[Operatie (wiskunde)|bewerking]] om een element op kop van een lijst te zetten. De notatie <code>[1,2,3]</code> is bijvoorbeeld syntactische suiker voor <code>1:2:3:[]</code>. De string <code>Wikipedia</code> wordt, ontdaan van alle syntactische suiker, als volgt geschreven:
:<code>['W','i','k','i','p','e','d','i','a']</code>.


: <code>'W':'i':'k':'i':'p':'e':'d':'i':'a':[]</code>
Deze notatie voor een lijst is ook weer syntactische suiker: een lijst in Haskell is namelijk leeg (voorgesteld als <code>[]</code>) of een lijst waar een element aan wordt toegevoegd (voorgesteld als <code>e : lijst</code> waarbij <code>e</code> het element is en '<code>:</code>' een [[operator]] om een element op kop van een lijst te zetten. De notatie <code>[1,2,3]</code> is bijvoorbeeld syntactische suiker voor <code>1:2:3:[]</code>. De string <code>"Wikipedia"</code> wordt, ontdaan van alle syntactische suiker, als volgt geschreven:


Deze notatie is omslachtig. De toevoeging van syntactische suiker maakt het mogelijk de string als <code>Wikipedia</code> te schrijven. Deze notatie is niet alleen gemakkelijker, het is ook een bekendere notatie aangezien deze notatie in veel programmeertalen wordt gebruikt om een tekenreeks of string op te schrijven.
:<code>'W':'i':'k':'i':'p':'e':'d':'i':'a':[]</code>.


=== Arrays in C ===
Deze notatie is omslachtig en niet prettig in gebruik. De toevoeging van syntactische suiker maakt het mogelijk de string als <code>"Wikipedia"</code> op te schrijven. Deze notatie is niet alleen makkelijker, het is ook een bekendere notatie aangezien deze notatie in veel programmeertalen wordt gebruikt om een string op te schrijven.
Een ander voorbeeld zijn [[array]]s in [[C (programmeertaal)|C]]. In C worden arrays geconstrueerd als blokken [[computergeheugen|geheugen]] die vanaf een bepaald punt kunnen worden opgevraagd, namelijk het begin van de array. Het uitvoeren van berekeningen met [[Pointer (programmeerconcept)|pointers]] is lastig en foutgevoelig waardoor C de notatie <code>a[i]</code> mogelijk maakt voor iets wat eigenlijk als <code>*(a + i)</code> zou moeten worden geschreven. <code>a[i][j]</code> is op vergelijkbare wijze gemakkelijker te begrijpen dan <code>*(*(a + i) + j)</code>.


=== Lijstcomprehensies ===
Een ander voorbeeld zijn [[array]]s in [[C (programmeertaal)|C]]. In C worden arrays geconstrueerd als blokken [[computergeheugen|geheugen]] die opgevraagd kunnen worden vanaf een bepaald punt, namelijk het begin van de array. Het uitvoeren van berekeningen met [[Pointer (programmeerconcept)|pointer]]s is echter lastig en foutgevoelig waardoor C de notatie <code>a[i]</code> mogelijk maakt voor iets wat eigenlijk als <code>*(a + i)</code> geschreven zou moeten worden. Op vergelijkbare wijze is <code>a[i][j]</code> makkelijker te begrijpen dan <code>*(*(a + i) + j)</code>.
{{Zie hoofdartikel|Lijstcomprehensie}}


Met een lijstcomprehensie is het mogelijk een [[Lijst (informatica)|lijst]] te noteren met een notatie die lijkt op de wiskundige notatie voor [[Verzamelingenleer|verzamelingen]]. Deze notatie wordt door de [[compiler]] of [[interpreter]] eerst op een manier geschreven, die door de [[computer]] kan worden verwerkt. De lijst met even getallen kan met lijstcomprehensie is Haskell genoteerd worden als:
==Syntactisch zout==


: <code>[ x | x <- [0..], x `rem` 2 == 0 ]</code>
'''Syntactisch [[zout]]''' bestaat uit de taalelementen die het moeilijker maken om slechte [[Broncode|code]] te schrijven. Deze taalelementen moeten door de programmeur worden geschreven om aan te geven dat hij weet waar hij mee bezig is in plaats van simpelweg iets op te schrijven of te specificeren. Een vereiste om het einde van een lus aan te geven met bijvoorbeeld "end if", "end while" of "end do" in plaats van alleen "end" wordt algemeen beschouwd als syntactisch zout. Sommige programmeurs beschouwen [[Declaratie|type-declaratie]]s van [[variabele]]n ook als syntactisch zout.


Dit wordt omgeschreven naar:<ref>The Haskell 98 Report. [http://haskell.org/onlinereport/exps.html#list-comprehensions 3 List Comprehensions], december 2002.</ref>
==Andere termen==


<pre>
*'''Syntactische [[sacharine]]''' verwijst naar overbodige taalelementen die het programmeren niet makkelijker maken.
let ok x = if x `rem` 2 == 0 then [x] else []
*'''Syntactische [[heroïne]]''' verwijst naar de taalelementen die op het eerste gezicht het programmeren vergemakkelijken maar daarna willen de programmeurs er steeds meer gebruik van maken. De term werd gebruikt met betrekking tot [[operator-overloading]] in een [[column]] van [[Rodney Bates]]. Door het veelvuldig gebruik van operator overloading wordt de code wel erg compact maar uiteindelijk is niemand meer in staat de code te begrijpen.
ok _ = []
in concatMap ok [0..]
</pre>


wat hetzelfde resultaat oplevert.
[[Categorie:Programmeren]]


== Nadelen ==
[[de:Syntaktischer Zucker]]
Het aanbrengen van syntactische suiker brengt ook enkele nadelen met zich mee.<ref>Haskell Wiki. [http://www.haskell.org/haskellwiki/Syntactic_sugar/Cons Syntactic sugar/Cons].</ref> Door het toevoegen van syntactische suiker wordt het lastiger om nauwkeurige foutmeldingen te geven als de programmeur een fout heeft gemaakt: een syntactisch element kan nu verschillende betekenissen hebben, terwijl de compiler niet exact kan zien welke wordt bedoeld als er een fout is gemaakt.
[[en:Syntactic sugar]]

[[fr:Sucre syntaxique]]
Zo geeft de [[Glasgow Haskell Compiler]] een melding wanneer <code>Num Bool</code> bij <code>[ 3 + 3 | 4 + 4 ]</code> ontbreekt, dus een verkeerd geformuleerde lijstcomprehensie, terwijl waarschijnlijk <code>[ 3 + 3 , 4 + 4 ]</code>, een lijst met elementen gescheiden door een komma, werd bedoeld. Evenzo geeft <code>[ x + 3, x <- [1..10] ]</code> een ''parse error'' in plaats van een melding over het gebruik van een komma in plaats van een verticale streep.
[[io:Sintaxala sukro]]

[[ja:糖衣構文]]
Een gerelateerd probleem is dat de compiler bij een foutmelding ook rekening moet houden met het feit dat er syntactische suiker is gebruikt. Zoals hierboven beschreven wordt syntactische suiker omgeschreven naar andere taalconstructies. Mocht zich hier een fout in voordoen, bijvoorbeeld een typefout, dan dient de foutmelding de oorspronkelijke code met syntactische suiker te bevatten en niet de al herschreven code.
[[pl:Lukier składniowy]]

[[ru:Синтаксический сахар]]
== Varianten ==
[[sv:Syntaktiskt socker]]
* Syntactisch zout, van [[zouten]], bestaat uit de taalelementen die het moeilijker maken om slechte [[broncode]] te schrijven. Een vereiste om het einde van een lus aan te geven met bijvoorbeeld <code>end if</code>, <code>end while</code> of <code>end do</code> in plaats van alleen <code>end</code> wordt algemeen beschouwd als syntactisch zout. Het declareren van het [[datatype]] van [[Variabele (informatica)|variabelen]] kan als een voorbeeld van syntactisch zout worden gegeven.
* Syntactische sacharine, van [[sacharine]], verwijst naar overbodige taalelementen die het programmeren niet gemakkelijker maken.
* Syntactische heroïne, van [[heroïne]], verwijst naar de taalelementen die op het eerste gezicht het programmeren eenvoudiger maken, maar daarna willen de programmeurs er steeds meer gebruik van maken. Het werd bijvoorbeeld gebruikt met betrekking tot [[operator-overloading]] in een [[column]] van Rodney Bates. Door het veelvuldig gebruik van operator overloading wordt de code wel beknopt, maar is op het laatst niemand meer in staat de code te begrijpen.

{{Appendix|Voetnoten}}

[[Categorie:Programmeren]]

Huidige versie van 6 aug 2023 om 08:48

In computertalen verwijst syntactische suiker naar toevoegingen aan de syntaxis die er niet voor zijn bedoeld de mogelijkheden van de taal te vergroten, maar om het de programmeur mogelijk te maken sommige delen beknopter te kunnen programmeren. Het is duidelijk dat suiker hier in overdrachtelijke zin is bedoeld. Deze taalelementen geven een alternatieve en praktischere manier om iets te programmeren met behulp van een korte of meer bekende notatie. Deze notatie beïnvloedt de uitdrukkingskracht van de taal niet. PJ Landin is op de naam gekomen.

Syntactische suiker kan gemakkelijk worden omgeschreven naar broncode, waarin de elementen wel tot de kern van de taal behoren. Bij Landin was dat de lambdacalculus die met een paar operaties werd uitgebreid, zoals het toekennen van waarden. De programmeertalen ML en Scheme zijn later ontworpen op basis van dit principe: deze talen bevatten een aantal essentiële taalconstructies, die door middel van syntactische suiker beknopter kunnen worden geformuleerd. In de wiskunde is het een gebruikelijk principe om te beginnen met zo weinig mogelijk basiselementen en de meeste berekeningen uit te voeren in een gemakkelijkere notatie, die in die basiselementen kan worden uitgedrukt.

Infixnotatie van operatoren

[bewerken | brontekst bewerken]

De meeste programmeertalen maken het mogelijk om eenvoudige wiskundige berekeningen in infixnotatie te noteren, zoals i + 3. Veel van deze talen, vooral functionele programmeertalen, voeren deze berekeningen uit door een functie aan te roepen waardoor de infixnotatie eigenlijk syntactische suiker is voor bijvoorbeeld add i 3.

Strings in Haskell

[bewerken | brontekst bewerken]

Veel programmeertalen bevatten een beknopte notatie voor tekenreeksen of strings, een reeks karakters. In bijvoorbeeld Haskell kan Wikipedia ook op die manier worden geschreven, als Wikipedia. Dit is syntactische suiker aangezien een string in Haskell wordt voorgesteld als een lijst karakters. Deze string wordt eigenlijk geschreven als:

['W','i','k','i','p','e','d','i','a']

Deze notatie voor een lijst is dus ook weer syntactische suiker: een lijst in Haskell is namelijk leeg, geschreven als [], of een lijst waar een element aan wordt toegevoegd, geschreven als e : lijst waarbij e het element is en ':' een bewerking om een element op kop van een lijst te zetten. De notatie [1,2,3] is bijvoorbeeld syntactische suiker voor 1:2:3:[]. De string Wikipedia wordt, ontdaan van alle syntactische suiker, als volgt geschreven:

'W':'i':'k':'i':'p':'e':'d':'i':'a':[]

Deze notatie is omslachtig. De toevoeging van syntactische suiker maakt het mogelijk de string als Wikipedia te schrijven. Deze notatie is niet alleen gemakkelijker, het is ook een bekendere notatie aangezien deze notatie in veel programmeertalen wordt gebruikt om een tekenreeks of string op te schrijven.

Een ander voorbeeld zijn arrays in C. In C worden arrays geconstrueerd als blokken geheugen die vanaf een bepaald punt kunnen worden opgevraagd, namelijk het begin van de array. Het uitvoeren van berekeningen met pointers is lastig en foutgevoelig waardoor C de notatie a[i] mogelijk maakt voor iets wat eigenlijk als *(a + i) zou moeten worden geschreven. a[i][j] is op vergelijkbare wijze gemakkelijker te begrijpen dan *(*(a + i) + j).

Lijstcomprehensies

[bewerken | brontekst bewerken]
Zie Lijstcomprehensie voor het hoofdartikel over dit onderwerp.

Met een lijstcomprehensie is het mogelijk een lijst te noteren met een notatie die lijkt op de wiskundige notatie voor verzamelingen. Deze notatie wordt door de compiler of interpreter eerst op een manier geschreven, die door de computer kan worden verwerkt. De lijst met even getallen kan met lijstcomprehensie is Haskell genoteerd worden als:

[ x | x <- [0..], x `rem` 2 == 0 ]

Dit wordt omgeschreven naar:[1]

let ok x = if x `rem` 2 == 0 then [x] else []
 ok _ = []
in concatMap ok [0..]

wat hetzelfde resultaat oplevert.

Het aanbrengen van syntactische suiker brengt ook enkele nadelen met zich mee.[2] Door het toevoegen van syntactische suiker wordt het lastiger om nauwkeurige foutmeldingen te geven als de programmeur een fout heeft gemaakt: een syntactisch element kan nu verschillende betekenissen hebben, terwijl de compiler niet exact kan zien welke wordt bedoeld als er een fout is gemaakt.

Zo geeft de Glasgow Haskell Compiler een melding wanneer Num Bool bij [ 3 + 3 | 4 + 4 ] ontbreekt, dus een verkeerd geformuleerde lijstcomprehensie, terwijl waarschijnlijk [ 3 + 3 , 4 + 4 ], een lijst met elementen gescheiden door een komma, werd bedoeld. Evenzo geeft [ x + 3, x <- [1..10] ] een parse error in plaats van een melding over het gebruik van een komma in plaats van een verticale streep.

Een gerelateerd probleem is dat de compiler bij een foutmelding ook rekening moet houden met het feit dat er syntactische suiker is gebruikt. Zoals hierboven beschreven wordt syntactische suiker omgeschreven naar andere taalconstructies. Mocht zich hier een fout in voordoen, bijvoorbeeld een typefout, dan dient de foutmelding de oorspronkelijke code met syntactische suiker te bevatten en niet de al herschreven code.

  • Syntactisch zout, van zouten, bestaat uit de taalelementen die het moeilijker maken om slechte broncode te schrijven. Een vereiste om het einde van een lus aan te geven met bijvoorbeeld end if, end while of end do in plaats van alleen end wordt algemeen beschouwd als syntactisch zout. Het declareren van het datatype van variabelen kan als een voorbeeld van syntactisch zout worden gegeven.
  • Syntactische sacharine, van sacharine, verwijst naar overbodige taalelementen die het programmeren niet gemakkelijker maken.
  • Syntactische heroïne, van heroïne, verwijst naar de taalelementen die op het eerste gezicht het programmeren eenvoudiger maken, maar daarna willen de programmeurs er steeds meer gebruik van maken. Het werd bijvoorbeeld gebruikt met betrekking tot operator-overloading in een column van Rodney Bates. Door het veelvuldig gebruik van operator overloading wordt de code wel beknopt, maar is op het laatst niemand meer in staat de code te begrijpen.