Subrutine ( eng. subroutine ) - en navngivet eller på anden måde identificeret del af et computerprogram, der indeholder en beskrivelse af et specifikt sæt handlinger. En subrutine kan kaldes flere gange fra forskellige dele af programmet. I programmeringssprog er der særlige syntaktiske midler til design og brug af subrutiner.
Subrutiner dukkede oprindeligt op som et middel til at optimere programmer i forhold til mængden af optaget hukommelse - de gjorde det muligt ikke at gentage identiske kodeblokke i programmet, men at beskrive dem én gang og kalde dem efter behov. Til dato er denne funktion af subrutiner blevet hjælpe, deres hovedformål er at strukturere programmet for at gøre det lettere at forstå og vedligeholde.
Fordelene ved at opdele et program i underrutiner inkluderer:
I det enkleste tilfælde (i assemblers ) er en underrutine en sekvens af kommandoer (operatører), der er adskilt fra hoveddelen af programmet og har en speciel kommando til at forlade underrutinen til sidst. Normalt har en underrutine også et navn, som den kan kaldes, selvom en række programmeringssprog også tillader unavngivne underrutiner. I sprog på højt niveau består en underrutinebeskrivelse normalt af mindst to dele: en "header" og en "body". Subrutineheaderen beskriver dens navn og muligvis dens parametre, det vil sige, den indeholder den information, der er nødvendig for at kalde subrutinen. Brødteksten er et sæt af udsagn, der vil blive udført, hver gang subrutinen kaldes.
Et opkald til en underrutine foretages ved hjælp af en opkaldsinstruktion, der inkluderer navnet på underrutinen. I de fleste moderne programmeringssprog er invokationskommandoen simpelthen navnet på den subrutine, der kaldes, eventuelt efterfulgt af faktiske parametre (se nedenfor ).
I det følgende Pascal-eksempel kaldes subprog fra hovedprogrammet tre gange:
program SubProgExample ; // Beskrivelse af underprogrammet subprog procedure subprog ; // Header inklusiv subrutinenavn start // start af subrutinebody WriteLn ( 'Bye' ) ; ende ; // slutningen af underrutineteksten begynder WriteLn ( 'Hej' ) ; subprog ; // 1. kald til subprog ; // 2. opkald subprog ; // 3. opkald afsluttes .Resultatet af at udføre et sådant program vil være outputtet af strengen "Hej" og de tre strenge "Bye".
For at gemme og gendanne udførelseskonteksten for den kaldende procedure, for at eliminere bivirkninger forbundet med mulige uønskede ændringer i de anvendte maskinregistre, genererer compileren specielle sekvenser af kommandoer for hver procedure, kaldet prologen og epilogen af proceduren.
Nogle programmeringssprog (for eksempel Pascal, Ada, Modula-2) tillader indlejrede underrutiner, det vil sige at placere underrutiner i andre underrutiner. Sådanne indlejrede underrutiner kan kun bruges i den underrutine, hvori de er erklæret. I andre tilfælde (for eksempel på C-sproget) er indlejring af underrutiner ikke tilladt. Indlejring af underrutiner giver ingen grundlæggende fordele, men det kan være praktisk til en mere logisk strukturering af programmet (hvis en eller anden underrutine kun bruges i en anden underrutine, er det logisk at placere den første i den anden).
Subrutiner bruges ofte til gentagne gange at udføre stereotype handlinger på forskellige data. Subrutinen har normalt adgang til dataobjekterne beskrevet i hovedprogrammet (i hvert fald nogle af dem), så for at overføre behandlede data til subrutinen er det nok at tildele dem for eksempel til globale variabler. Men denne måde er ikke særlig bekvem og fyldt med fejl.
For at sikre den kontrollerede overførsel af parametre til subrutinen og returnering af resultater fra den, bruges parametermekanismen . Parametre er beskrevet i beskrivelsen af subrutinen (i dens overskrift) og kan bruges inde i proceduren på samme måde som variablerne beskrevet i den. Når en procedure kaldes, angives værdierne for hver af parametrene i den kaldende kommando (normalt efter navnet på den kaldte subrutine).
program SubProgExample2 ; // Beskrivelse af underprogrammet subprog procedure subprog ( Linje : String ) ; // Header inklusive underrutinenavn start // start af underrutinelegeme WriteLn ( Linje ) ; ende ; // slutningen af underrutineteksten begynder WriteLn ( 'Hej' ) ; subprog ( 'Farvel,' ) ; // 1. opkald til subprog ( 'min kærlighed,' ) ; // 2. kald til subprog ( 'farvel!' ) ; // 3. opkald afsluttes .I ovenstående eksempel er linjeparameteren for subprog- underrutinen sat til en anden værdi i hvert opkald, så forskellige linjer vises i stedet for det samme.
For at skelne parametrene for en underrutine, beskrevet i dens overskrift og brødtekst, fra de parametre, der er angivet, når underrutinen kaldes, bruges formelle og faktiske parametre. Formelle parametre specificeres, når en subrutine deklareres eller defineres, og faktiske parametre angives direkte, når den kaldes. Så i det sidste eksempel er Line- parameteren i headeren og brødteksten af subprog den formelle parameter, og strengen 'Good bye' brugt i det første kald til denne subrutine er den faktiske parameter. Når en subrutine kaldes, bliver de faktiske parametre angivet i opkaldskommandoen værdierne af de tilsvarende formelle parametre, hvilket sikrer overførsel af data til subrutinen.
Der er flere måder at overføre parametre til en underrutine.
Et programmeringssprog kan give mulighed for at videregive parametre til underrutiner enten kun efter værdi, eller efter værdi og ved reference, eller ved navn og værdi. I de sidste to tilfælde bruges separate syntaktiske konstruktioner til at skelne mellem måderne at sende en parameter på (i Pascal er dette nøgleordet var , når man beskriver en parameter). Faktisk, hvis sproget indeholder begrebet et link (pointer), så kan du undvære at sende en parameter ved reference (det kan altid modelleres ved at beskrive en parameter af typen "reference"), men denne funktion er praktisk, da det giver dig mulighed for at arbejde med en formel parameter-reference uden dereference , og øger også pålideligheden og sikkerheden af programmet.
Naturlige restriktioner pålægges parametre, der sendes ved reference: den faktiske parameter, der erstattes af en sådan parameter, når den kaldes, skal være en variabel (det vil sige have en adresse), og i stærkt indtastede sprog skal den også have nøjagtig den samme datatype.
Der er to typer underrutiner, der bruges i programmeringssprog på højt niveau: procedurer og funktioner .
I C -lignende sprog beskrives en subrutine altid som en funktion. Proceduren er implementeret som en funktion af typen void , det vil sige, den har en "tom" type og returnerer derfor ingen værdi.
Subrutiner, der er en del af klasser i objektprogrammeringssprog, kaldes normalt metoder . Dette udtryk refererer til ethvert medlems underprogrammer i en klasse, både funktioner og procedurer; når der kræves afklaring, taler man om metoder-procedurer eller metode-funktioner .