Resan från mänskliga läsbara instruktioner (som ett C ++ -program eller ett Python-skript) till binär kod som körs av en dator är en flerstegsprocess:
1. Källkod: Detta är koden skriven av en programmerare på ett program på hög nivå (som Python, Java, C ++, etc.). Denna kod är textbaserad och använder mänskliga läsbara kommandon och syntax.
2. sammanställning (eller tolkning): Detta är det avgörande steget där den mänskliga läsbara koden översätts till maskinförståeliga kod. Det finns två huvudsakliga tillvägagångssätt:
* sammanställning: En kompilator tar hela källkoden och översätter den till en komplett uppsättning maskininstruktioner (objektkod) på en gång. Denna objektkod är sedan ofta kopplad till annan objektkod (som bibliotek) för att skapa en körbar fil. Denna körbara är i huvudsak en sekvens av binära instruktioner. Språk som C ++ och Java (före JVM -steget) använder vanligtvis kompilatorer.
* Tolkning: En tolk översätter och kör källkodlinjen för rad utan att skapa en separat körbar fil. Språk som Python och JavaScript använder tolkar. Även om de inte direkt producerar binär kod på samma sätt som en kompilator, är tolken själv ett program skrivet på ett sammanställt språk och förlitar sig i slutändan på binära instruktioner att köra. Den tolkade koden körs fortfarande med binära instruktioner, men översättningen görs dynamiskt, en rad åt gången.
3. Monteringsspråk (ibland): I vissa fall kan en kompilator generera monteringsspråk som ett mellansteg. Monteringsspråk är ett programmeringsspråk på låg nivå som använder mnemonics (korta förkortningar) för att representera maskininstruktioner. En montering översätter sedan denna monteringskod till maskinkod (binär). Detta steg är ofta doldt för programmeraren.
4. Maskekod (binär): Detta är det sista steget. Maskinkod består av en sekvens av binära siffror (0s och 1s). Varje instruktion representeras av ett unikt binärt mönster som CPU direkt kan förstå och utföra. Denna binära kod representerar saker som:
* opcoder: Instruktioner som berättar CPU vilken operation som ska utföras (t.ex. tillägg, subtraktion, minnesåtkomst).
* operander: Data eller minnes adresserar som instruktionen fungerar.
Exempel (förenklad):
Låt oss säga att en enkel instruktion på ett högnivåspråk är `x =y + 5;`. Efter sammanställning kan detta översätta (mycket grovt och beroende på arkitekturen) till något liknande i binär (detta är en mycket förenklad illustration och verkliga binära instruktioner är mycket mer komplexa):
* Ladda värdet på `y` i ett register: `0001 1010 0000 0010` (Hypotetisk binär instruktion)
* Lägg till 5 i registret: `0010 0101 0000 0101` (Hypotetisk binär instruktion)
* Förvara resultatet i minnesplatsen för `x`: `0011 1100 0000 0011` (Hypotetisk binär instruktion)
Den specifika binära representationen beror helt på CPU -arkitekturen (x86, ARM, etc.) och kompilatorn/tolkaren som används. Processen är komplex, men kärnidén är att instruktioner på hög nivå delas upp i en sekvens av enkla binära instruktioner som CPU direkt kan förstå och utföra.