Et dataprogram er en serie instruksjoner som beskriver hva en datamaskin skal gjøre. Når programmet kjøres, utfører datamaskinen instruksjonene.

Faktaboks

Også kjent som

program, programvare, applikasjon, app

Alle typer datamaskiner er helt avhengige av dataprogrammer for å kunne fungere. Uten disse programmene vil ikke en laptop, en mobiltelefon eller et nettbrett kunne utføre noe som helst. Produkter med integrert datateknologi, som GPS-systemer, betalingsautomater, vaskemaskiner og ulike styringssystemer, vil heller ikke kunne fungere.

Programmene inneholder algoritmer som beskriver rekkefølgen instruksjonene skal utføres i. En algoritme er rett og slett en beskrivelse av de operasjonene som skal til for å løse en gitt oppgave; det er altså en oppskrift.

Datamaskinen trenger mange ulike typer programmer. Systemprogrammene er nødvendige for at datamaskinen skal kunne fungere som en datamaskin, mens brukerprogrammene lastes inn i datamaskinen for å utføre oppgaver brukeren av maskinen ønsker å få utført. I tillegg kommer mange typer programmer som gjør det mulig for oss å kommunisere og løse oppgaver over internett.

Uavhengig av type, må ethvert program bygges opp på en strukturert og gjennomtenkt måte slik at det lar seg teste, vedlikeholdes og videreutvikles.

Typer programmer

Vi kan dele dataprogrammer inn i ulike typer, alt etter hvilken oppgave de har. Tradisjonelt kan de deles inn i tre hovedtyper:

  • Systemprogrammer er knyttet til maskinens egen funksjonalitet. Blant disse finner vi oppstartprogrammet som er nødvendig for å starte datamaskinen og laste inn det aller viktigste systemprogrammet, operativsystemet. Operativsystemet er selv et dataprogram som styrer og kontrollerer alle de andre programmenes tilgang til maskinens fysiske komponenter.
  • Mellomvare er en betegnelse på dataprogrammer som ligger mellom operativsystemet og andre programmer som kjører på det. Kort fortalt bygger den en infrastruktur som letter kommunikasjonen mellom ulike programmer.
  • Brukerprogrammer er dataprogrammer som lastes inn i datamaskinen for å utføre konkrete oppgaver for brukeren av maskinen. Disse kalles gjerne for applikasjoner eller apper.

Fremveksten av store internasjonale datasentre har ført til utvikling av nye typer dataprogrammer og teknologier som har til hensikt å utnytte datasentrenes fysiske ressurser bedre:

  • En virtuell maskin er et dataprogram som simulerer en fysisk datamaskin ved at de ulike fysiske komponentene er erstattet av programmer som simulerer deres virkemåte.
  • En container er et standardisert dataprogram som, når det kjøres, sørger for at en applikasjon har det den trenger (kjørbar kode, et kjøremiljø, et operativsystem, et systembibliotek og riktig systemkonfigurasjon) og derved virker på samme måte uavhengig av hvilken underliggende maskinevare (hardware) eller operativsystem den kjøres på.

Internetts enorme utvikling siden 1990-tallet har også bidratt til nye typer dataprogramtyper og teknologier. Forutsetningen for å bruke disse er at datamaskinen er koblet til internett.

  • Ulike datasentre tilbyr skytjenester (cloud computing) i form av infrastruktur, plattformer og tjenester som formidles over internett. En vesentlig del av disse skytjenestene er rettet mot programmerere og programvareutviklere. Dette gjør at alle som driver med programutvikling og drift av tjenester som nettservere og databaser slipper å bruke penger på å kjøpe inn og drifte egen maskinvare og lokal infrastruktur. Dette gir en fleksibel løsning som sparer tid og utviklingskostnader. Infrastrukturen bak skytjenester er i stor grad bygget på virtuelle maskiner og containere.

Hva er et program?

Ideen til en programmerbar maskin er ikke ny. Allerede i 1799 utviklet Joseph-Marie Jacquard en vevstol som kunne programmeres ved hjelp av hullkort. Hvert kort ga et lite bidrag til det endelige resultatet og kortenes rekkefølge avgjorde hvilket mønster som ble vevet.

Dagens dataprogram har mye til felles med det første hullkortprogrammet, men også med programmer vi kjenner fra andre sammenhenger. Enten det er et hullkortprogram, konsertprogram eller en matoppskrift kjennetegnes de alle ved at de beskriver en serie med instruksjoner som må utføres for å oppnå et bestemt resultat. Vi kan for eksempel betrakte notene til et musikkstykke som et program som «kjøres» når musikeren spiller notene. Men for at musikeren skal kunne spille musikkstykket, må vedkommende forstå notespråket musikken er beskrevet i, det vil si at han eller hun må kunne «lese noter». Slik er det for alle typer programmer. Skal programmet kunne utføres, må instruksjonene forstås av den eller de som skal utføre programmet. Hovedforskjellen mellom et dataprogram og andre programmer er at instruksjonene i et dataprogram skal utføres av en datamaskin, mens instruksjonene i andre programmer gjerne skal utføres av mennesker. Instruksjonene i dataprogrammet må derfor være skrevet i et språk som datamaskinen er konstruert til å forstå.

Binær representasjon av data og instruksjoner

Maskinkode

Teksten «Program» skrevet i maskinkode

Maskinkode
Instruksjon i maskinkode

Instruksjon som adderer tallene 3 og 9 skrevet i maskinkode. ADD har instruksjonsnummer 25.

Instruksjon i maskinkode

En datamaskin er i utgangspunktet konstruert til å lagre ulike typer data og gjøre beregninger på dataene ved hjelp av noen få grunnleggende instruksjoner. Det kan for eksempel være å legge sammen to tall eller flytte en verdi fra en lagerenhet til en annen. Dataene kan være tallverdier, tekst, bilder eller lyd og lagres i navngitte egnede lagerenheter (variabler, tabeller eller andre typer lagringsstrukturer) i maskinens hurtigminne (Random Access Memory, RAM).

Det eneste «språket» maskinen forstår er såkalt maskinkode, der både data og instruksjoner er bygget opp av kun to tegn, 0 og 1, samt grupperinger av slike. Selv om det i prinsippet går an å skrive dataprogrammer i maskinkode, er maskinkode i realiteten ikke egnet til å skrive reelle programmer. Det er isteden konstruert ulike høynivå programmeringsspråk som ligner mer på menneskelige språk og som dermed er lettere for å skrive instruksjoner i.

Programmeringsspråk

Et programmeringsspråk består av et begrenset utvalg – vanligvis engelske – ord (såkalte nøkkelord eller reserverte ord), noen spesielle symboler og tegn, og konkrete regler for hvordan navn, uttrykk og instruksjoner kan bygges opp. Reglene kalles språkets syntaks, og kan sammenlignes med de grammatikalske reglene vi har i vanlige språk som norsk og engelsk.

Kildekode og kompilering

Selve teksten i et program skrevet i et høynivåspråk, kalles kildekoden. Her er instruksjonene skrevet inn linje for linje og kan leses og forstås av andre som kjenner programmeringsspråket. Men for at datamaskinen skal kunne forstå det, og deretter utføre det, må kildekoden oversettes til maskinkode, det vil si til nuller og enere. Denne oversettelsen gjøres av et eget oversetterprogram som kalles en kompilator (kompilatoren er selv et dataprogram, skrevet i et programmeringsspråk).

Før selve oversettelsen kan finne sted, må imidlertid programmet sjekkes for syntaktiske feil der ingen regelbrudd tolereres. Selv den aller minste feil må rettes opp for at programmet skal kunne oversettes til maskinkode og deretter la seg utføre.

Programutførelsen

Valgsetninger i programmeringsspråket Java
Valgsetninger i programmeringsspråket Java
Repetisjonssetning

En løkke som summerer tallene fra 1 til 10, skrevet i programmeringsspråket Java

Repetisjonssetning
Sorteringsalgoritme
Algoritme som sorterer tallene i en tabell, skrevet i programmeringsspråket Java
Sorteringsalgoritme

Når et musikkstykke spilles etter noter, vil det være den samme sekvensen av toner som spilles hver gang stykket fremføres. Det er den samme sekvensen av instruksjoner som utføres. Slik er det normalt ikke når datamaskinen utfører et dataprogram. Riktignok vil instruksjonene i dataprogrammet bli utført i den rekkefølgen de står, altså sekvensielt, med mindre annet er bestemt. Men vanligvis vil det være ønskelig å kunne ha alternative rekkefølger, avhengig av hva som skjer når programmet kjøres.

Logiske betingelser

Bruk av logiske betingelser i programmet gjør det mulig å endre instruksjonenes rekkefølge. En logisk betingelse er et utsagn som enten er sant eller usant. Sannhetsverdien av de logiske betingelsene avgjør hvilke instruksjoner som utføres. Hvis en logisk betingelse er sann, utføres den eller de tilhørende instruksjonene, og er den usann, utføres ikke instruksjonene. Endringer av instruksjonenes rekkefølge kan være av to hovedtyper:

  • Valg av ett av flere alternativer, avhengig av hvilke betingelser som er oppfylt. Valgsetningene kalles ofte if-setninger, if-else-setninger eller switch-case-setninger.
  • Repetisjon av én eller flere instruksjoner så lenge en betingelse er oppfylt, slik at de samme instruksjonene kan utføres mange ganger. Også her finnes det flere typer som while-setninger, do-while-sentninger og for-setninger.

Ved å kombinere valgsetninger og repetisjonssetninger på forskjellige måter kan man lage ulike algoritmer.

Informasjonen programmet trenger for å avgjøre sannhetsverdiene av de logiske betingelsene i valg- og repetisjonssetningene, hentes ofte fra ytre kilder, som for eksempel brukeren av dataprogrammet. Kommunikasjonen mellom brukeren og programmet, for eksempel via maskinens mus, tastatur eller berøringsskjerm, vil følgelig påvirke hvilke instruksjoner som utføres slik at resultatet blir forskjellig for hver gang programmet kjøres.

Oppbygging av programkoden

Klasse i Java

Klasse som lagrer og aksesserer data om en person, skrevet i programmeringsspråket Java

Klasse i Java

Mange av de programmene vi bruker til daglig, som epost-programmer eller tekstbehandlingsprogrammer, består av mange hundre tusen instruksjoner. Det sier seg selv at dersom programmereren ikke skal miste oversikten fullstendig, er det helt avgjørende at programmet er strukturert og delt opp på en fornuftig måte. Det finnes mange prinsipper for hvordan dette kan gjøres, og mulighetene er i en viss grad bestemt av det programmeringsspråket som brukes.

I såkalte objektorienterte programmeringsspråk gir man programmet en struktur som i størst mulig grad svarer til vår opplevelse av virkeligheten rundt oss, nemlig i form av objekter som personer, biler, bøker og så videre. Programmet deles inn i navngitte klasser som beskriver objektene. Her er data og instruksjoner som logisk hører sammen, samlet. Instruksjonene er fordelt på ulike navngitte metoder, der hver metode er samlingen av instruksjoner som trengs for å utføre den oppgaven navnet på metoden beskriver. Hvis metoden trenger informasjon fra omverdenen for å utføre oppgaven, kan metoden ha parametere som kan motta informasjonen fra andre steder i programmet. Dette kan for eksempel være informasjon som gis av brukeren.

Programmets arkitektur

Mange dataprogrammer består i realiteten av flere moduler som til sammen utgjør hele programmet. Hver modul er et eget program, programmert i et språk som er egnet for å utføre modulens oppgave. Det er for eksempel vanlig at det grafiske brukergrensesnittet som brukeren av programmet ser på skjermen, er programmert i ett språk, mens programlogikken, som behandler dataene brukeren taster inn, er programmert i et annet. De ulike modulene av programmet kommuniserer så med hverandre via applikasjonsgrensesnitt (API), der retningslinjene for hvordan kommunikasjonen skal foregå er fastsatt.

Vedlikehold og videreutvikling

Det er sjeldent et program er ferdig en gang for alle. Feil som oppdages, må rettes, og ny funksjonalitet må legges til etter hvert som behovet melder seg. For at et program skal kunne vedlikeholdes og videreutvikles, må kildekoden ikke bare forstås av datamaskinen, den må også forstås av mennesker. Foruten bruk av kommentarer, er det uhyre viktig at koden er skrevet på en ryddig og lesbar måte slik at andre programmerere lett kan sette seg inn i den og forstå hva den gjør. Det visuelle bilde av koden har stor betydning for tilgjengeligheten. Ved å bruke blanke linjer og innrykk i koden kan man fremheve hvilke instruksjoner som hører sammen og derved gjøre det lettere for programmereren å forstå hva programmet gjør. I tillegg vil bruk av selvforklarende navn på variabler, klasser og metoder bidra til at programmereren forstår hensikten med klassene, hvilke data som lagres i variablene og hva metodene gjør. Programmererens egen forståelse av programmet er helt avgjørende med hensyn til å forhindre logiske feil i koden.

De ulike programmeringsspråkene har utviklet egne konvensjoner og kodestandarder for hvordan dataprogram skal skrives. Det finnes også verktøy (statisk analyse-program) som sjekker at konvensjoner og kodestandarder følges.

Testing

Vi har alle erfart at dataprogram ikke alltid fungerer etter hensikten og at de kan inneholde feil. Det er derfor viktig at dataprogrammene bygges opp på en måte som i størst mulig grad forebygger fremtidige feil og at programmene testes grundig før de tas i bruk.

En av kompilatorens oppgaver er å sjekke programmet for syntaktiske feil slik at det kan oversettes til maskinkode. Men selv om alle syntaktiske feil blir fjernet, er det ingen garanti for at programmet er feilfritt. Programmet kan inneholde logiske feil som, under gitte omstendigheter, fører til at det ikke oppfører seg som forventet. For systemer vi er helt avhengig av, kan logiske feil i kildekoden få alvorlige konsekvenser.

For å kvalitetssikre at programmer fungerer etter hensikten, må de testes kontinuerlig gjennom hele utviklingsforløpet. Målet er å fjerne flest mulige feil før programmet tas i bruk. Med dette for øye er det utviklet ulike metoder og strategier for hvordan testingsaktiviterer kan integreres i hele livsløpet til et program, i planleggingsfasen, gjennom utviklingsperioden, og etter at programmet er ferdigstilt og tatt i bruk. Man kan imidlertid aldri garantere at et program er feilfritt, kun redusere sannsynligheten for at det inneholder feil.

Opphavsrett, fri programvare og åpen kildekode

Dataprogrammer er, i likhet med andre åndsverk, beskyttet av åndsverkloven. Det betyr at den eller de som har utviklet programmet har opphavsretten til det. Opphavsretten gjelder imidlertid ikke ideene programmet er bygget på eller algoritmene de inneholder.

Frem til 1990-årene var det vanlig å distribuere og selge dataprogrammer som kompilert kode (binær form), mens selve kildekoden ble betraktet som en forretningshemmelighet.

Som en reaksjon på dette startet Richard Stallman i 1985 stiftelsen Free Software Foundation (FSF), en stiftelse som hadde til formål å utvikle fri programvare samt formulere lisenser som ivaretok brukernes og programmereres rett til fri bruk, modifikasjon, videreutvikling og distribusjon av programvare. Siden den gang har det kommet mange ulike typer lisenser knyttet til programvare, både med og uten åpen kildekode. Innen gruppen som går under fellesnavnet Open Source Software, finner vi flere lisenstyper med varierende grad av markedstilpassing.

Åpen kildekode har vist seg å ha mange kvalitetsmessige fordeler ved at informasjon om feil, videreutvikling, drift, sikkerhet og brukerstøtte fritt kan deles på nettet. I tillegg har det et viktig sikkerhetsmessig aspekt ved at åpen kildekode gjør det mulig å avdekke eventuelle skjulte, udokumenterte funksjoner i koden.

Les mer i Store norske leksikon

Kommentarer

Kommentarer til artikkelen blir synlig for alle. Ikke skriv inn sensitive opplysninger, for eksempel helseopplysninger. Fagansvarlig eller redaktør svarer når de kan. Det kan ta tid før du får svar.

Du må være logget inn for å kommentere.

eller registrer deg