Een machinetaalprogramma dat voor de ene computer is geschreven, kan niet op een andere computer met een andere CPU worden uitgevoerd, omdat machinetaal direct verbonden is met de specifieke architectuur van de CPU . Dit betekent dat de instructies zo zijn gecodeerd dat alleen de hardware van die specifieke CPU ze kan begrijpen en uitvoeren. De verschillen vallen uiteen in verschillende belangrijke gebieden:
* Instructiesetarchitectuur (ISA): Dit is de fundamentele reeks instructies die een CPU begrijpt. Verschillende CPU's (zelfs van dezelfde fabrikant) hebben verschillende ISA's. Wat een eenvoudige toevoegingsinstructie op de ene CPU is, kan op een andere CPU een complexe meerstapsbewerking zijn, of bestaat misschien niet eens. De codering van deze instructies (de specifieke bitpatronen die elke instructie vertegenwoordigen) varieert enorm tussen ISA's.
* Aantal registers: CPU's hebben interne registers voor tijdelijke gegevensopslag. Het aantal en de grootte van deze registers verschillen tussen CPU's. Een programma dat is geschreven om een specifiek aantal en type registers te gebruiken, werkt niet op een CPU met een andere configuratie.
* Geheugenadresseringsmodi: Hoe de CPU toegang krijgt tot het geheugen (bijvoorbeeld directe adressering, indirecte adressering, enz.) varieert per architectuur. De machinecode weerspiegelt deze adresseringsmodi, waardoor deze incompatibel is met CPU's die verschillende methoden gebruiken.
* Gegevensrepresentaties: De manier waarop gegevenstypen (gehele getallen, getallen met drijvende komma, enz.) worden weergegeven in binair formaat kan verschillen. Een programma dat is gecompileerd voor de gegevensrepresentatie van één CPU kan onjuiste resultaten opleveren of zelfs crashen op een CPU met een andere representatie.
* Systeemoproepen: Programma's communiceren vaak met het besturingssysteem via systeemaanroepen. De manier waarop deze oproepen worden gedaan en de specifieke codes die worden gebruikt, zijn CPU- en besturingssysteemspecifiek, wat een extra laag van incompatibiliteit toevoegt.
In wezen is machinecode extreem laag en nauw gekoppeld aan de fysieke hardware. Proberen om machinecode die voor de ene CPU is gecompileerd op een andere uit te voeren, is hetzelfde als proberen een plaat af te spelen die bedoeld is voor een draaitafel van 33⅓ RPM op een draaitafel van 45 RPM:de snelheden zijn verschillend en het resultaat is wartaal. Talen op een hoger niveau (zoals C++, Java, Python) lossen dit probleem op door compilers of tolken te gebruiken om de code te vertalen naar een vorm die geschikt is voor de architectuur van de doel-CPU. |