Hur fungerar programmering?

Du har nu skrivit och kört ditt första program, men du kanske inte har funderat kring hur datorn faktiskt förstår de instruktioner du har givit den. Som du kanske vet så talar alla datorer i s.k. binärkod - d.v.s. i 1:or och 0:or - inte på språk som är människoläsbara såsom Python. Exempelvis kan vi uttrycka ordet "Hi" i binärkod enligt:

01001000 01101001

Där 01001000 representerar ett H och 01101001 representerar ett i.

För att datorer ska kunna köra program måste kod på något sätt översättas till instruktioner som datorn kan utföra. I många programmeringsspråk sker detta genom en s.k. kompilator som översätter källkod till maskinkod eller till en körbar fil innan programmet faktiskt körs. Detta är exempelvis fallet för språk som C och C++.

Python används dock vanligtvis på ett annat sätt. När du skriver ett Python-program i en .py-fil körs programmet nämligen av en s.k. Python-tolk. I den vanligaste implementationen, CPython, översätts koden först internt till något som kallas för “bytecode” - vilket är som en mellanform mellan den kod du själv skriver och det som datorn kan tolka/köra. Detta är vad Python-tolken avslutningsvis exekverar. Du behöver med största sannolikhet inte ta detta i beaktande inom ramen för denn kurs utan du kan istället föreställa dig att du skriver källkod och kör den via Python-tolken.

I de fall Python inte kan förstå källkoden så uppstår ofta ett syntaxfel, exempelvis SyntaxError. Om koden däremot är syntaktiskt korrekt men något fortfarande går fel medan programmet körs så kan istället andra fel uppstå - exempelvis NameError, TypeError eller ValueError.

Create folder and drag

Kompilering och tolkningsprocessen i Python

När du kör ett Python-skript, går din kod igenom två huvudsakliga steg: ett kompileringssteg och ett exekveringssteg.

“Kompilering”

I det första steget omvandlar Python din kod till något som kallas för “bytecode”. Bytecode är en lågnivå, plattformsoberoende representation av din källkod som kan tolkas av Python-tolken. Denna process sker automatiskt och är transparent för användaren. Kompileringen sker endast en gång för varje skript, såvida inte koden ändras.

“Tolkning”

Efter att koden har kompilerats till bytecode, tolkas och exekveras denna bytecode av Python-tolken. Tolken läser igenom bytecode:n - en instruktion i taget - och utför vad varje instruktion säger. Denna process sker i realtid när du kör ditt skript.

Create folder and drag

Jämförelse mot kompilerade språk

Till skillnad mot kompilerade språk, där koden kompileras direkt till maskinkod som kan exekveras direkt av datorns CPU, tolkas alltså Python-kod först till en “mellannivå” (bytecode) som sedan exekveras av Python-tolken. Detta tillåter Python att vara plattformsoberoende - d.v.s. att samma Python-kod kan köras på vilket operativsystem som helst - så länge det finns en Python-tolk installerad på maskinen.

Fördelar och nackdelar

✅ Plattformsoberoende: Python-kod kan köras på alla system där en s.k. Python-tolk är installerad.

✅ Flexibilitet och dynamik: Python tillåter för dynamiska datatyper och sena bindningar (late bindings), vilket gör det enklare att skriva flexibel kod. D.v.s. att vi t.ex. inte på förhand måste definiera datatypen för en variabel.

✅ Enkel syntax och läsbarhet: Python har - argumenterbart - ett enkelt, engelskliknande språk vilket gör det lättare att lära sig, läsa och underhålla jämfört mot vissa andra språk

Exempel (i Python):

for item in list:
    ...

Exempel (i C):

for (int i = 0; i < cars.Length; i++) 
{ ... }

✅ Stort ekosystem och bibliotek: Python har ett stort antal bibliotek och ramverk för allt från dataanalys till webbutveckling och AI/ML. Det gör att man kan utveckla avancerade system snabbt utan att skriva allt från grunden.

❌ Prestanda: Eftersom Python-kod tolkas vid körning kan prestandan vara lägre jämfört mot andra, kompilerade språk.

❌ Mindre kontroll över hårdvara/minne: Python ger mindre låg-nivåkontroll jämfört med språk som C/C++, vilket kan vara en nackdel i system där hårdvaruoptimering är viktigt.

❌ Dynamisk typning kan leda till svårupptäckta fel: Eftersom Python är “dynamiskt typat” kan vissa typer av buggar dyka upp först vid körning av ett program, vilka i andra språk hade fångas upp innan körning.

❌ Distributionsproblem: Python-program kräver att tolken är installerad på maskinen som kör koden, vilket kan skapa hinder jämfört mot en fristående fil.

Sammanfattning

Även om Python primärt är ett tolkat språk, innefattar dess exekveringsprocess ändå ett steg där källkoden kompileras till bytecode. Denna process bidrar till Pythons flexibilitet och plattformsoberoende, samtidigt som den erbjuder en relativt smidig utvecklingscykel.

Att förstå denna process kan hjälpa dig att bättre förstå hur dina Python-program körs och hur du kan optimera dem för bättre prestanda, men notera att detta inte examineras i denna kurs. Det är viktigt att ta i beaktande vid mer avancerad programmering, men det bör inte vara ditt fokus när du lär dig programmering.


This site uses Just the Docs, a documentation theme for Jekyll.