Hver linje med kode du skriver må oversettes til et språk datamaskinen din kan forstå. Men hvordan skjer det?
Kildekoden til programmeringsspråk på høyt nivå som PHP, Swift og JavaScript ser litt ut som naturlig språk. Du vil se engelske ord i slik kode, og du vil kunne forstå noe av funksjonaliteten, selv om du ikke kan selve språket. Men slik kildekode må være i et maskinlesbart format for at datamaskinen skal kjøre det endelige programmet.
For å gjøre dette trenger maskinen en mellommann for å oversette koden din til noe den kan behandle. Denne mellommannen kan være en tolk, en kompilator eller en assembler. De gjør alle en lignende ting: de oversetter kildekoden fra en menneskelesbar form til en maskinlesbar. Men hvordan de gjør det er ganske forskjellig.
Hva er en tolk?
En tolk leser hver linje med kode, en om gangen, og kjører den umiddelbart ved kjøring. En tolk venter ikke på at hele kildekoden blir konvertert til maskinkode før den sendes til CPU. I stedet konverterer den hver kodelinje til den tolkespesifikke bytekoden og utfører hver instruksjon etter hvert som den blir oversatt. Mens utførelsesoppgaven er avhengig av tolken direkte, driver CPU selve tolken.
Siden den analyserer og kjører hver linje om gangen, er prosessen ofte relativt langsommere. Med det i tankene er feil i tolkede programmeringsspråk lett å oppdage siden de gir umiddelbar tilbakemelding for hver kodelinje.
Et tilbakeslag for denne oppførselen er imidlertid at en kjøretidsfeil krasjer programmet under kjøring, noe som resulterer i en dårlig brukeropplevelse, spesielt hvis prosjektet ditt mangler tilstrekkelig testing.
Hva er en kompilator?
En kompilator leser kildekoden din og oversetter den til en maskinlesbar kjørbar fil. I motsetning til en tolk, leser den hele kildekoden på én gang, og genererer maskinkode for senere behandling av CPU. Siden kompilatoren utfører denne oppgaven bare én gang, er kompilerte programmer vanligvis raskere og mer minneeffektive.
Kompilatoren tar imidlertid ikke hensyn til kjøretidsfeil. I stedet vil den flagge visse feil ved kompilering, noe som vanligvis er bedre. Denne typen feil dukker opp under utvikling, ikke når programmet begynner å kjøre. Men husk at kjøretidsfeil fortsatt er mulig, selv i kompilerte programmer.
De viktigste forskjellene
Tolker og kompilatorer er begge vanlige, så det er nyttig å vite de viktigste forskjellene mellom dem.
Kodeutførelse: Input og Output Processing
En tolk kan bare samle inn, oversette og utføre hver inndata per linje. Den kjører hver linje i kildekoden sekvensielt etter hvert som den kommer, og den endelige utgangen avhenger av hva hver linje gir ut under kjøringen.
En kompilator samler hele kildekoden og oversetter den bare én gang. Så det tar hele kildekoden som input, som den konverterer og sender til CPU for å få en utgang.
Feilsøking og feilsporbarhet
For tolket kode er feil mer sporbare siden tolken kan rapportere dem ved direkte å referere til originalkilden. Men når det oppstår en feil på et tidspunkt under utførelse, stopper tolken. Så feilsøking av feil kan være litt utfordrende siden du må reprodusere dem under kjøring. Det kan til og med bli verre hvis det er utilstrekkelig kjøretidslogging.
På den annen side kan kjøretidsfeilene i et kompilert språk være vanskeligere å spore siden det ikke er noen tolk som kan rapportere om dem. Men feil du oppdager ved kompilering er vanligvis lettere å håndtere siden kompilatoren konsekvent vil identifisere dem.
De fleste kompilerte språk har også en mekanisme for å oppdage ubrukte variabler, typeinkompatibilitet og feil syntaks, og forhindrer denne typen feil tidlig.
Ytelse og hastighet
Som forventet hjelper en kompilator maskinen med å kjøre programkode raskere siden CPU-en bare behandler koden én gang. Dette er ikke tilfelle for tolker, som oversetter hver linje under kjøring.
Selv om det finnes programmeringsprinsipper du kan bruke for å optimalisere tolket kode, vil tolken fortsatt bruke tid på å analysere og utføre hver linje før han går til neste. Imidlertid er kompilatorhjelpere tilgjengelige for å gjøre tolkede språk raskere.
Chrome-nettleseren behandler for eksempel JavaScript ved å bruke V8-motoren; dette kjører på Just-In-Time (JIT) kompilatoren. Pyinstaller-modulen er en annen hjelper som pakker og kompilerer et Python-skript til en kjørbar pakke.
Selv om disse hjelperne er nyttige for å samle et tolket språk inn i en kompilator, endrer det ikke det faktum at grunnlinjeoversetteren fortsatt er en tolk.
Minnebruk
Minnebruksatferden til tolken og kompilatoren er relativ og avhenger ofte av kildekoden og andre faktorer. Mens noen programmerere hevder at kodeklumping i tolker reduserer minnebruken, registrerer tolker også samlet minnebruk.
For eksempel, når du undersøker minnebruksprofilen til Python-koden, kan mengden minne den bruker overraske deg.
Generelt sett krever kompilerte programmer mindre kjøretidsminne. Siden de konverterer hele kildekoden til maskinlesbar kode på forhånd, gir de CPU-en mindre arbeid. Dette er i motsetning til tolker, som kun oversetter kode under kjøring.
Støtte for programmeringsspråk
Tolken og kompilatoren har en god del av distribusjon av programmeringsspråk. Noen populære kompilerte språk inkluderer C, C#, Rust og Golang. Tolkede språk er også populære, blant dem Python, JavaScript og PHP.
Flere programmerere har en tendens til å foretrekke tolkede språk. Mens JavaScript og Python bruker tolker, er de de to generelt mest ønskede språkene, ifølge 2023 Stack Overflow Developer Survey. Rust og C# representerer de kompilerte gruppene i femte og sjette posisjon.
Hvor tolkede språk skinner
Tolker skinner i disse områdene:
- De tillater enkel feilsporing siden tolken utfører hver kodelinje separat.
- Det er ofte raskere å oppnå et minimum levedyktig produkt tidligere med tolkede språk, siden de har mindre komplekse syntakser sammenlignet med kompilerte språk.
- I motsetning til statisk skrevet kompilerte språk, bruker tolkede språk dynamisk skriving, noe som reduserer kodekompleksiteten og forbedrer lesbarheten.
Der kompilerte språk vinner
Hva med kompilatorer? Her er noen aspekter som språkene deres viser en viss styrke:
- Kompilerte språk er vanligvis raskere ved utførelse, og krever mindre kjøretidsminne siden kodeoversettelse skjer bare én gang i forveien.
- Utførelse etter kompilering hjelper med tidlig feildeteksjon. Kompilatoren sikrer at distribusjonen mislykkes når det er en feil. Dette er bedre enn å fange opp feil under kjøring.
- Selv om de er statisk skrevet, definerer kompilerte språk klart intensjonene til variabler og funksjoner, noe som gjør dem mer dokumenterte.
Velge riktig oversetter for prosjektet ditt
Som du har sett, har kompilatoren og tolken sine respektive områder der de utmerker seg. Mens noen programmerere hevder at kompilerte språk er raskere og bedre totalt sett, hevder andre at ytelsen avhenger av kodestruktur og plattform.
Men enda viktigere, ditt valg av oversetter bør også avhenge av flere andre faktorer i tillegg til deres tekniske mekanismer. Den enkle læringen, fellesskapet og prosjektintensjonen er blant faktorene som bør vurderes når man velger mellom tolkede og kompilerte språk.