Goto är en programflödesstyrande sats i vissa imperativa programspråk, bland annat Basic, C, Pascal och C#. Satsen talar om att programexekveringen ovillkorligen ska hoppa till och fortsätta vid en angiven plats, som vanligen identifieras med en etikett (engelska: label) eller ett radnummer, beroende på programspråk. I maskinkod/assembler motsvaras goto av hoppinstruktioner som till exempel jump och branch.

Namnet goto kommer av engelska go to, ’gå till’.

Användning

redigera

Ett exempel i Basic med radnumrering:

10 PRINT "Programmet startar här."
20 GOTO 40
30 PRINT "Denna rad hoppas över."
40 PRINT "Programmet fortsätter här."

En goto-sats kan kombineras med en if-sats för att göra hoppet villkorat:

20 IF I = 99 THEN GOTO 40

I kombination med if-satser kan goto användas för att återskapa andra typer av villkorssatser som återfinns i strukturerad programmering. Detta följer av att villkorssatser i maskinkod är implementerade som jämförelser och villkorade hopp.

Kritik av goto

redigera

Goto-satsens plats i högnivåspråk har fått utstå kritik. En åsikt är att den leder till svårläslig kod, som är svår att förändra och uppdatera, och att den leder till spagettikod. Under 1960- och 1970-talen kom många[vilka?] som arbetade inom datavetenskap fram till att program bör använda en strukturerad flödeskontroll med slingor och if-satser.

En kritik av goto framfördes 1968 i ett brev av Edsger Dijkstra, med titeln Go To Statement Considered Harmful [1]. I detta brev argumenterar Dijkstra för att man bör ta bort den okontrollerade användandet av GOTO-satser i högnivåspråk då de försvårade arbetet med att analysera och verifiera programmets korrekthet. En annan synvinkel presenteras i Donald Knuths Structured Programming with go to Statements[2] där flera vanliga programmeringsuppgifter analyserades. Det visade sig att i ett antal av dem var goto den optimala språkkonstruktionen att använda.

Goto kan i vissa fall fungera som den bästa lösningen på ett problem ifall det saknas nödvändiga programkonstruktioner för att det annars ska kunna lösas i ett visst programspråk. Till exempel saknar C stöd för korutiner; sådana kan implementeras med hjälp av goto.

Referenser

redigera
  1. ^ Dijkstra, Edsger: Go To Statement Considered Harmful Arkiverad 3 juli 2007 hämtat från the Wayback Machine.. Communications of the ACM 11:3 (1968), 147–148.
  2. ^ Knuth, Donald: Structured Programming with Goto Statements. Computing Surveys 6:4 (1974), 261–301.