Livello di architettura dell'insieme di istruzioni
Scrivere programmi direttamente in linguaggio macchina è:
- Ostico
- Spesso inutile
In quasi tutti i calcolatori vengono scritti programmi ad alto livello (di astrazione) che vengono compilati da opportuni programmi. In linea teorica sarebbe possibile progettare macchine in grado di eseguire direttamente programmi scritti ad esempio in C, ma:
- Richiederebbe la realizzazione di CPU estremamente complesse;
- Un calcolatore sarebbe in grado di eseguire solo programmi scritti in quel linguaggio.
Per questo motivo si ricorre a un livello intermedio che costituisca un'interfaccia tra il software (a più alto livello) e hardware (a più basso livello). Tale interfaccia definisce l'architettura stessa del sistema e prende il nome di ISA (Instruction Set Architecture).
Posizionamento
Proprietà del livello ISA
In maniera informale, si definisce livello ISA l'aspetto che la macchina assume al programmatore che programma in linguaggio macchina: a questo livello è nascosta la microarchitettura del processore (pipeline, scalabilità, ...) ma sono invece visibili la memoria, i registri, i tipi di dato ecc.
ISA e Assembly
Spesso l'ISA e il linguaggio Assembly vengono confusi: essi non sono la stessa cosa, anche se esiste una corrispondenza quasi 1:1 tra i due (basso gap semantico). L'Assembly è costituito da codici mnemonici che corrispondono alle istruzioni ISA, così da facilitare la vita dei programmatori. L'Assembler è il programma che traduce tali codici mnemonici in istruzioni ISA: queste ultime costituiscono il codice oggetto eseguibile.
Esempi di gap semantici
Progettazione
Idealmente, all'atto della costruzione di una nuova macchina, i progettisti dialogano con sviluppatori di compilatori e ingegneri elettronici. Bisogna però tener conto delle necessità di retrocompatibilità con i precedenti software.
Compatibilità del livello ISA
Un ISA è progettato appositamente per una famiglia di processori (es. Intel). Questo significa che le istruzioni sono compatibili per tutta la famiglia di processori e i codici portabili. Più in generale, un ISA deve:
- Essere retrocompatibile con i vecchi modelli della famiglia (vecchi programmi eseguiti senza modifiche)
- Mettere a disposizione caratteristiche innovative sfruttabili dal nuovo software
Perché conoscere ISA?
Ci sono vari motivi per cui un programmatore dovrebbe conoscere il livello ISA:
- È importante per capire a fondo il funzionamento di un sistema di elaborazione
- Un programma scritto in assembly è dalle 2 alle 3 volte più efficiente del corrispondente scritto in C
- L'ottimizzazione di piccole porzioni di codice può migliorare drasticamente le performance
- L'analisi del codice prodotto da un compilatore permette di verificare la correttezza della compilazione
- L'assembly è l'unico linguaggio di programmazione per sistemi industriali embedded basati su micro-controllori
- È indispensabile per sviluppare sistemi real-time con componenti critiche
Modelli di memoria
Tutti i calcolatori suddividono la memoria in celle indirizzate in modo consecutivo. In generale, i byte vengono raggruppati in parole di 4 byte (32 bit) o 8 byte (64 bit).
Allineamento
Molte architetture richiedono che le parole siano allineate lungo le loro estremità:
- Una parola di 4 byte inizia agli indirizzi 0, 4, 8, ...
- Una parola di 8 byte inizia agli indirizzi 0, 8, 16, ...
Per motivi di compatibilità i programmi possono indirizzare in memoria ogni singolo byte indipendentemente dall'allineamento: il fatto che questo sia possibile non significa che sia una soluzione efficiente.
Ordinamento dei byte
Quando una parola contiene più byte si pone il problema di enumerare i byte al suo interno:
- Big endian: memorizzazione che inizia dal byte più significativo per finire col meno significativo (Motorola)
- Little endian: memorizzazione che inizia dal byte meno significativo per finire col più significativo
-
Livello discorsivo
-
Nutrizione a livello dell'organismo
-
Nutrizione a livello metabolico
-
linguaggi di basso livello e di alto livello