Fra slutningen af 1950'erne fremkom den klasse af programmeringssprog, der har fået den største udbredelse i praksis, de procedureorienterede sprog. De kaldes også imperative sprog, fordi de sætninger, et program består af, har karakter af kommandoer, der udføres i en bestemt, på forhånd fastlagt rækkefølge. Disse sprog gør det muligt at udtrykke en algoritme i en notation, der er naturlig i forhold til den opgave, der skal løses, og i mindre grad retter sig imod computerens egen interne struktur. Programmer i et imperativt sprog transformeres til maskinsprog vha. en oversætter. I disse sprog er computerens referencer til regneregistre og lagerceller skjult og erstattet af det abstrakte begreb en variabel. En variabel har et navn og en værdi. Navnet defineres af programmøren, og værdien fremkommer som resultat af de beregninger, programmet udfører. Navnet henviser egentlig til en celle i computerens lager, og denne celle indeholder værdien. Referencen er skjult for programmøren og styres af oversætteren og operativsystemet.
En vigtig nyskabelse var indførelsen af typer. Alle variable erklæres som havende en eller anden type, der afgrænser manipulationsmulighederne. I et assemblersprog repræsenteres der data uden hensyn til, hvad de betyder, hvilket giver mange fejlkilder. Man kan fx komme til at addere en dato og et efternavn ved blot at anføre en forkert lageradresse i en assemblerinstruktion. Indførelse af typer kan forhindre den slags fejl. Hvis to variable har typerne hhv. "tal" og "tegn", er det forbudt at addere dem, og en sådan fejl findes af oversætteren. Eksempler på typer for variable er heltal (erklæres fx som int eller integer), flydende tal (float eller real), den logiske type (ofte kaldet boolean efter matematikeren George Boole) og tegn (character).
Procedurer. Et procedureorienteret programmeringssprog kan indeholde procedurer, som er programenheder, der udfører specifikke, afgrænsede opgaver. Man kommer ofte ud for, at den samme dataproces skal udføres mange gange og fra forskellige steder i et program, fx beregning af matematiske funktioner som logaritmer eller trigonometriske funktioner. Sådanne funktioner er ikke indbygget i computerens hardware, men må programmeres vha. addition, subtraktion, multiplikation og division. Det er derfor praktisk, at sproget tillader, at programmøren kun skriver selve koden (proceduren) én gang og derefter henviser til den, når der er behov for det.
Man kan opdele procedurer i to slags: indbyggede og programmørdefinerede. Indbyggede procedurer er dem, der er en del af sproget, og som programmøren kan aktivere blot ved at anføre et kald i sit program. En procedure, der defineres af programmøren, skal derimod være en del af programmet, men kan kaldes på samme måde som de indbyggede procedurer. Man kan også opdele procedurer i dem, der blot udfører et eller andet, og dem, der returnerer en værdi. De sidstnævnte kaldes funktionsprocedurer eller blot funktioner; de kan indgå som led i beregningsudtryk. En procedure, der sorterer et talsæt efter tallenes størrelse, er et eksempel på den første kategori, mens de matematiske procedurer som fx logaritmer er funktioner.
Et kald består af navnet på proceduren samt evt. en eller flere parametre. Kaldet af en procedure, der sorterer et talsæt, kan fx se således ud: sort(numbers,n), hvor sort er procedurens navn, og parametrene numbers, og n er navne på variable, der indeholder hhv. talsættet og antallet af tal. Denne procedure vil normalt ikke være indbygget, og sorteringsalgoritmen må derfor defineres af programmøren. Kald af funktioner kan eksemplificeres ved følgende sætning i sproget Pascal:
z := abs(y + sin(x))/2;
Dette er en tildelingssætning, der beregner værdien af den variable z som det halve af den numeriske værdi af summen af den variable y og sinus taget af den variable x. Både abs og sin er indbyggede funktioner i Pascal. Funktionskald har altså samme status i et udtryk som variable og konstanter.
Sætningstyper. Et imperativt programmeringssprog indeholder sætningstyper til konstruktion af de basale programstrukturer værditildeling, forgrening og gentagelse. Ved en forgrening undersøges først, om en betingelse er opfyldt, og der udvælges herved et programafsnit, der bliver udført, mens et andet måske springes over. Gentagelsessætninger fører til løkker, programstumper, der gennemløbes et bestemt antal gange eller et antal gange, der afhænger af beregningerne i løkken. I de fleste sprog findes der også mulighed for direkte ændring af den rækkefølge, sætningerne udføres i. Det sker ved at navngive de sætninger, man ønsker at "hoppe" til, og fra et andet sted i programmet kan man så udføre en såkaldt goto-sætning ('gå til'-), der refererer til navnet på en af de navngivne sætninger.
Sammensatte datatyper. I moderne sprog søger man at forøge abstraktionsniveauet på forskellig vis. Fx tillader typen array, at man grupperer data af samme type som en indiceret datamængde med et fælles navn. I mange sprog findes også mulighed for at gruppere data af forskellige typer i datastrukturer, der går under navne som structures (i C) eller records (i Pascal). I mange sprog er det endvidere muligt at definere nye typer til eget brug. Med indkapsling gøres et større eller mindre programforløb til en udelelig enhed med veldefinerede kontaktmuligheder til andre dele af programmet. En procedure er et eksempel på indkapsling, men indkapslingsprincippet kan føres langt videre. I de sprog, der bruges i dag, er det således almindeligt, at man kan definere programenheder, der indeholder såvel datastrukturer som de procedurer, der opererer på dem. Man kan på denne måde definere nye typer i sproget, kaldet abstrakte datatyper (ADT). En ADT har en veldefineret grænseflade til omverdenen, men implementeringen af funktionaliteten er skjult. Man kan derfor ændre de indre datastrukturer eller algoritmer, uden at det har virkning på det omgivende program; dette kaldes information hiding. Klasser (classes) i de objektorienterede sprog (se objektorienteret programmering) og pakker (packages) i Ada er eksempler på sådanne sprogkonstruktioner; de gør det muligt at opdele hele programmet i veldefinerede segmenter, der evt. kan genbruges i andre programmer eller danne basis for opbygning af nye segmenter.
Kommentarer
Din kommentar publiceres her. Redaktionen svarer, når den kan.
Du skal være logget ind for at kommentere.