© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Syntaktisk sukker

 

 

Unødvendigt men bekvemt Syntaktisk sukker er i virkeligheden unødvendig syntaks. Det er alternative måder at skrive det samme på. Måder der forsøder tilværelsen for programmørerne. Syntaktisk sukker gør det nemmere at skrive syntaktiske konstruktioner, der er hyppigt forekommende.
Forskellige grunde Nogle former for syntaktisk sukker gøre programmer lettere at læse, andre gøre dem mindre læsbare og igen andre gør det vanskeligere at begå fejl. Begrundelserne for at indføre syntaktisk sukker er derfor vidt forskellige.
 

 

1. Assignments

  Assignments på formen:
Syntax 1:
Specielt assignment
<variabel> = <variabel> <operator> <udtryk>;
  hvor <variabel> er det samme variabelnavn på begge sider af lighedstegnet, <operator> er en af de numeriske operatorer (+, -, *, /, og % hvis det er heltal), kan man i stedet skriver det på formen:
Syntax 2:
Forkortet syntaks
<variabel> <operator>= <udtryk>;
  Lad os se nogle eksempler:
Source 1:
En række assignments
int x, y, z;

...

x = x + 5;
y = y * (x - z);
z = z % 3;
  De tre assignments kan i stedet skrives som:
Source 2:
Med forkortet syntaks
x += 5;
y *= x - z;
z %= 3;
  I første række er det en bekvemmelighed at kunne bruge denne kortere skrivemåde, men det er først når man anvender mere beskrivende variabelnavne, at den egentlige værdi kommer frem. Betragt f.eks.
Source 3:
Længere variabelnavn
mississippi = missisippi + 3;
  Her er variabelnavnet stavet forkert på højre side af lighedstegnet. Jo flere gange vi skal stave til mississippi, jo flere chancer er der for, at vi staver forkert. Ved at bruge den forkortede skrivemåde, kan vi reducere antallet med én, og dermed mindske risikoen for denne fejl:
Source 4:
Med forkortet syntaks
mississippi += 3;

 

1.1 Inkrementering og dekrementering

  Ved inkrementering forstås, at en numerisk variabel tælles op med én, og ved dekrementering, at den tilsvarende tælles ned med én.
++ og -- I Java kan man bruge operatorerne ++ og --, som erstatning for de fulde assignments. Lad os se nogle eksempler:
Source 5:
Inkrementeringer og dekrementeringer
int x, y;

...

x = x + 1;
y = y - 1;
  Dette kan i stedet skrives som:
Source 6:
Forkortet skrivemåde
x++;
y--;
  Man kan vælge at skrive operatorerne før variabelnavnet. Følgende vil give det samme resultat som ovenfor:
Source 7:
Foranstillede operatorer
++x;
--y;
  Den eneste sammenhæng, hvor det har betydning, om man skriver operatorerne før eller efter variabelnavnene er i forbindelse med udtryk, der har sideeffekter. Da man ikke bør lave udtryk med sideeffekter, vil jeg ikke uddybe dette her!
 

 

2. Alt er while

Kontrol-strukturer En interessant observation, er at alle kontrolstrukturer (selektive og iterative) kan formuleres i termer af while-sætningen - der er ganske enkelt ikke det, der ikke kan formuleres med en passende while-sætning.
  Vi skal i det følgende se hvordan dette kan gøres for hver enkelt kontrolstruktur, og hvordan vi kan anvende det til nærmere at definere begrebet: et programmeringssprog.
 

 

2.1 Selektion

 

 

2.1.1 if-sætningen

  Betragt følgende generelle if-sætning:
Syntax 3:
Generel if-sætning
if ( <boolsk udtryk> )
  <sætning>;
  Hvis man sammenligner den med en lignende while-sætning
Syntax 4:
Lignende while-sætning
while ( <boolsk udtryk> )
  <sætning>;
  vil man se, at den semantiske forskel er begrænset. if-sætningen er en while-sætning, der kun kører nul eller en gang.
  Hvis det boolske udtryk er falsk vil både if-sætningen og while-sætningen køre nul gange. Hvis det er sandt vil if-sætningen køre én gang, mens while-sætningen vil køre en eller flere gange.
  Når vi vil lave en while-sætning, der har samme semantik som if-sætningen, skal vi derfor sikre os, at den ikke kan køre mere end én gang. Vi skal have realiseret følgende:
Pseudo 1:
Udvidet kørsels-betingelse
while ( <boolsk udtryk> && <løkken endnu ikke har kørt> )
  <sætning>;
  Det gøres nemmest ved at indføre en boolsk variabel:
Pseudo 2:
Boolsk variabel
boolean harUdført=false;

while ( <boolsk udtryk> && !harUdført ) {
  <sætning>;
  harUdført = true;
}
  Denne konstruktion med while-sætningen er ækvivalent med if-sætningen (bemærk, at det ikke betyder noget, om <sætning> ændrer sandhedsværdien af <boolsk udtryk>).
 

 

2.1.2 if-else-sætningen

  Det er nemmest at vise, at der findes en konstruktion med while-sætningen, der er ækvivalent med if-else-sætningen ved at bruge resultatet ovenfor. Vi vil derfor vise, at man kan lave en if-else-sætning med if-sætninger.
  Den generelle if-else-sætning har følgende form:
Syntax 5:
Generel if-else-sætning
if ( <boolsk udtryk> )
  <sætning1>;
else
  <sætning2>;
  Det er rimelig enkelt at finde følgende konstruktion med to if-sætninger:
Pseudo 3:
Med to if-sætninger
if ( <boolsk udtryk> )
  <sætning1>;

if ( !<boolsk udtryk> )
  <sætning2>;
  Der er blot en detalje, der ødelægger ækvivalensen, nemlig <sætning1>. <sætning1> kan generelt ændre sandhedsværdien af <boolsk udtryk>, og dermed kan vi risikere at både <sætning1> og <sætning2> udføres!
  Løsningen er igen at indføre en boolsk variabel. Denne gang skal den huske værdien af <boolsk udtryk>
Pseudo 4:
Med boolsk variabel
boolean boolskUdtryk=<boolsk udtryk>;

if ( boolskUdtryk )
  <sætning1>;

if ( !boolskUdtryk )
  <sætning2>;
  Nu kan <sætning1> ændre så meget den vil, vi har gemt resultatet!
  Vi har nu vist at if-else-sætningen kan laves med to if-sætninger, og da if-sætningen kan laves med en while-sætning, følger at if-else-sætningen kan laves med to while-sætninger.
 

 

2.1.3 switch-sætningen

  Af kapitlet om selektion fremgår det, at switch-sætningen er syntaktisk sukker for en særlig gruppe af if-else-sætninger. Da if-else-sætningen kan formuleres vha. to while-sætninger, følger det, at switch-sætningen kan formuleres vha. while-sætninger.
 

 

2.2 Iteration

 

 

2.2.1 do-while-sætningen

  Det fremgår af kapitlet om iteration, at do-while-sætningen ikke er nødvendig, idet den kan laves med en while-sætning.
 

 

2.2.2 for-sætningen

  Det fremgår af kapitlet om iteration, at for-sætningen er syntaktisk sukker for tællerstyret iteration, og den dermed kan laves med en while-sætning.
 

 

2.3 Programmeringssprog

Imperativt sprog Som lovet ovenfor vil vi bruge while-sætningen generelle natur til at definere begrebet: et programmeringssprog. Mere præcist vil vi definere et imperativt programmeringssprog, men definitionen kan bruges mere generelt, da et sprog tilhørende de andre paradigmer skal have de samme muligheder på en eller anden måde. Det at man har mulighederne på en anden måde, er det der gør, at de tilhører et andet paradigme.
Assignment Den eneste sætning, der ikke kan formuleres med while-sætningen er assignment. Disse to definerer derfor til sammen hvad et programmeringssprog er:
 

Definition: Et programmeringssprog

Et programmeringssprog, er et sprog, der har sproglige konstruktioner, der er semantisk ækvivalente med while-sætningen og assignment.