Hopp til innhold
Fagartikkel

Fra kildekode til maskinkode

Programmering gjøres som oftest med høynivåspråk som Python, JavaScript, Java, C#, C++ og C. For at kildekoden (source code) vi utvikler skal kunne kjøre på en datamaskin, må den kompileres til maskinkode (computer executable).

Maskinkode

Datamaskiner kjører ved hjelp binære instruksjoner. Hver enkelt instruksjon er en enkel operasjon prosessoren skal gjøre, som for eksempel å sammenligne to tall, gjøre en utregning eller flytte data mellom registre.

En enkelt instruksjon ikke så nyttig alene, men når vi setter dem sammen i sekvenser av flere instruksjoner som gjøres etter hverandre, er det meste mulig. Dette er den store styrken til moderne datamaskiner. En sekvens av instruksjoner kaller vi for maskinkode (computer executable).

Maskinkode må være tilpasset prosessorens instruksjonssett (for eksempel x86, ARM64 og RISC-V), slik at alle instruksjonene kan utføres slik koden krever.

Det er mulig å programmere direkte i maskinkode, men dette er uvanlig siden programmering av binære instruksjoner er tidkrevende og vanskelig for de fleste. Maskinkoden vil dessuten bare fungere på det ene instruksjonssettet den er skrevet for, noe som er upraktisk i en verden med mange instruksjonssett i bruk. Det meste av programmering gjøres derfor i et programmeringsspråk.

Programmeringsspråk

Det finnes hundrevis av forskjellige programmeringsspråk. Noen av de vanlige høynivåspråkene vi har, er Python, JavaScript, Java, C#, C++, C og GO.

Hvert programmeringsspråk har strengt definerte regler for hvordan koden skal utformes (syntaks). Dette kan sammenlignes med grammatikk i språk, bare mye strengere.

Lavnivå-programmeringsspråk

Det er uvanlig å skrive binær maskinkode direkte. Prosessen er rett og slett for tidkrevende og vanskelig for de aller fleste. Men i noen tilfeller er det ønskelig å skrive kode som er så nært maskinkode som mulig.

I lavnivåspråk (Assembly language) har vi kun de instruksjonene som instruksjonssettet har tilgjengelig, og hver linje med kode tilsvarer en instruksjon maskinen skal gjøre.

Et eksempel på ei Assembly-kodelinje kan være

mov ecx, ebx

Instruksen (mov) flytter innholdet i register (ecx) over til register (ebx).

Programmering i Assembly kan gi en mer effektiv kode, som kjører raskere og bruker mindre ressurser, enn kode skrevet i et høynivåspråk. Det er likevel såpass avansert at det kun er helt spesielle områder der det gjøres, for eksempel mikrokontroller-programmering.

Kode som er skrevet i Assembly omgjøres til maskinkode ved hjelp av programvare vi kaller en assembler.

Høynivå-programmeringsspråk

Det meste av programmering gjøres i det vi kaller høynivå-programmeringsspråk. Disse språkene skal være brukervennlige og har syntaks som er logisk for mennesker å forstå.

Ei linje med kode skrevet i et høynivåspråk vil ofte tilsvare mange instruksjoner med kjørekode når den er omgjort.

Kompilering

Høynivå-programmeringsspråk bruker en kompilator for å omgjøre den skrevne kildekoden til kjørekode. Kompilatoren tar den skrevne koden og de bibliotekene som er inkludert, inn i koden og lager kjørekode av dem.

Kompilatorene er lagd for å kunne lage kjørekode til forskjellige typer prosessorer (som bruker forskjellig instruksjonssett). Dette gjør at kode som er skrevet i et høynivåspråk, kan kompileres for å fungere både på x86 og ARM64 uten for mye ekstraarbeid.


De fleste feil vi gjør i programmering, er enten logiske feil eller syntaksfeil.

Logisk feil

En logisk feil oppstår når logikken i programmeringen ikke blir riktig. For eksempel kan dette være at vi ønsker å legge sammen to tall, men ved feil ganger sammen tallene.

Syntaksfeil

Syntaksfeil oppstår når vi ikke følger grammatikken i programmeringsspråket riktig, for eksempel ved å skrive ; i stedet for :, eller ved at vi blander store og små bokstaver i språk som er sensitive for dette.

Relatert innhold

CC BY-SA 4.0Skrevet av Tron Bårdgård.
Sist faglig oppdatert 27.03.2022