Sætning (programmering)

Disambig bordered fade.svg For alternative betydninger, se Sætning. (Se også artikler, som begynder med Sætning)

En sætning (også kaldet et statement) er inden for programmeringssprog, specifikt inden for imperative programmeringssprog, det mindste selvstændige element, der udtrykker en handling, der skal udføres. Det er en instruktion i et højniveausprog, der skal få en computer til at udføre en bestemt handling. Et program i et sådant højniveausprog er en række af en eller flere sætninger.

En sætning kan svare til en eller flere maskininstruktioner (evt. ingen), eller den kan fortolkes af en fortolker eller en form for virtuel maskine.

I nogle programmeringssprog, f.eks. C, skelnes mellem sætninger og definitioner. Sætninger kan være sammensat af flere sætninger.

Typer af sætninger

Følgende er eksempler på de almindeligste typer af sætninger fra et uspecifikt blokorienteret imperativt sprog.

Simple sætninger

  • assertion: assert(ptr != NULL);
  • assignment: A:= A + 5
  • goto: goto next;
  • return: return 5;
  • call: CLEARSCREEN()

Sammensatte sætninger

  • block: begin integer NUMBER; WRITE('Number? '); READLN(NUMBER); A:= A*NUMBER end
  • do-loop: do { computation(&i); } while (i < 10);
  • for-loop: for A:=1 to 10 do WRITELN(A) end
  • if-statement: if A > 3 then WRITELN(A) else WRITELN("NOT YET"); end
  • switch-statement: switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
  • while-loop: while NOT EOF DO begin READLN end
  • with-statement: with open(filename) as f: use(f)

Syntaks

Udseendet af sætningerne former et programs fremtræden. Programmeringssprog er (bl.a.) karakteriserede ved typen af de sætninger, de benytter (f.eks. gruppen af programmeringssprog, der benytter krøllede parenteser { og }). Manges sætninger indledes med identifiers som if, while eller repeat. Ofte er disse nøgleord reserverede, således at de ikke kan benyttes til navne på variable eller funktioner. Syntaksen for sætningerne i et sprog kan f.eks. beskrives med Backus-Naur form (først brugt til Algol-60) eller syntaksdiagrammer.

Semantik

Mange sætninger adskiller sig fra subrutine-kald ved måden de håndterer parametre på. En subrutine-parameter vil typisk blive evalueret én gang, før rutinen bliver kaldt. I modsætning til dette kan parametre i en sætning blive evalueret flere gange (det er f.eks. tilfældet for betingelsen i en while-løkke) eller slet ikke (f.eks. kroppen af en while-løkke). Sådanne parametre betgenes call-by-name sætnings-parametre. Call-by-name parametre evalueres, når der er behov for dem, det kaldes også lazy-evaluation. Hvis programmeringssproget stiller call-by-name parametre til rådighed, kan man få subrutiner til at opføre sig som egentlige sætninger.

Udtryk

I de fleste programmeringssprog adskiller en sætning sig fra et udtryk derved, at en sætning ikke returnerer et resultat og ved at de udføres for deres sideeffekter. Udtryk returnerer derimod et resultat og de har ofte ingen sideeffekt. Blandt de imperative programmeringssprog er Algol-68 specielt derved, at en sætning kan returnere et resultat. Enkelte andre sprog har også den egenskab. Sprog der kombinerer imperativ stil og funktionel stil, som det er tilfældet for Lisp-familien, skelnes der ikke mellem sætninger og udtryk. Selv udtryk, der udføres sekventielt og udelukkende for deres sideeffekter og ikke returnerer et resultat, betragtes som udtryk. Hos de rent funktionelle programmeringssprog findes sætninger ikke, alt er udtryk.

Denne forskel kan udtrykkes således: En sætning udføres, mens et udtryk evalueres. Dette kan ses i funktionerne exec og eval, der findes i nogle sprog, f.eks. i Python. Her vil exec bruges på sætninger og eval på udtryk.

Sprog der kan udvides

Et sprog har normalt en fast syntaks, men der kendes eksempler på programmeringssprog, hvor man kan udbygge sproget med nye sætninger. Et sprog kan f.eks. tillade, at man oversætter en ny og udvidet oversætter til sproget, eller der kan bare tilføjes nye sætninger under kørslen. Sådanne er for eksempel Lisp og Forth.

Eksterne henvisninger