QNA > P > Perché Il Linguaggio Assembly Dipende Dalla Macchina?

Perché il linguaggio assembly dipende dalla macchina?

Al livello più profondo, significa che i set di istruzioni differiscono. Mettendo una particolare sequenza di bit in un processore x86 si otterranno risultati completamente diversi da quelli che si otterrebbero se si mettesse la stessa serie di bit in un processore ARM, per esempio.

I linguaggi di livello superiore "superano" questo perché i computer fanno tutti più o meno le stesse cose, solo in modi diversi. ARM ha modi per sommare due numeri proprio come fa x86, ha modi per caricare dati dalla RAM nei registri (e viceversa) proprio come fa x86, etc..

Tutti i costrutti di alto livello possono alla fine essere ridotti a un insieme fondamentale di operazioni che possono essere eseguite da tutte le macchine general-purpose (anche se alcuni costrutti possono risultare più efficienti su alcune CPU che su altre).

Questo è ciò che fanno i compilatori. Analizzano il linguaggio di alto livello e, in un modo o nell'altro, lo riducono al linguaggio macchina del sistema di destinazione. Spesso solo alcuni bit selezionati del compilatore devono essere scritti di nuovo per una nuova CPU. Alcuni compilatori (GCC è un eccellente esempio) sono costruiti in strati che semplificano enormemente questo lavoro. Un singolo sviluppatore altamente qualificato che abbia familiarità con i compilatori e la piattaforma di destinazione potrebbe produrre un port rudimentale abbastanza facilmente.

Al di sopra del livello di ridurre semplicemente i costrutti al linguaggio macchina nativo, ci sono, naturalmente, questioni come input/output, accesso al filesystem, ecc. Anche questi sono di solito gestiti a strati, spesso con solo i livelli più bassi -- i driver -- che vengono riscritti per una nuova piattaforma, mantenendo un'interfaccia coerente con i livelli superiori.

E anche i driver possono spesso essere condivisi, in tutto o in parte, tra tipi di macchine! Le piattaforme x86 non sono le uniche che hanno avuto, per esempio, un bus PCI. E anche quando il bus è diverso, i dispositivi agganciati ad esso spesso finiscono per essere gli stessi. Linux condivide un certo numero di driver di dispositivi tra diversi tipi di macchine con pochi o nessun cambiamento. Il compilatore gestisce i dettagli della traduzione in codice macchina e i livelli più interni del kernel cercano di astrarre tutte le altre differenze comportamentali che possono, l'autore del driver deve solo attenersi alle interfacce stabilite.

Dopo questo, si arriva alla questione se, all'interno di una data piattaforma, un particolare sistema abbia particolari dispositivi opzionali (o categorie di dispositivi). Per esempio, sarebbe stupido per la maggior parte dei server avere acceleratori 3D. Alcuni sistemi potrebbero avere un generatore di numeri casuali hardware, altri no. Alcuni potrebbero non avere uno storage fisso. Non qualificato, tuttavia, "dipendenza dalla macchina" di solito non si rivolge a questo livello di dipendenza.

Di Sacks Butor

Qual è la differenza tra le istruzioni di assemblaggio movq e movl? :: Qual è la differenza tra linguaggio macchina, linguaggio assembly e linguaggio di alto livello nei computer?
Link utili