prof. Nunzio Brugaletta |
LinPROG |
Il primo linguaggio di programmazione, riconosciuto come tale, è il linguaggio Assembly. Naturalmente il computer non è in grado di eseguire un programma se non in linguaggio macchina. Il sorgente Assembly è necessario che venga convertito in linguaggio oggetto, utilizzando l'Assembler che, appunto, ha questo compito.
Per poterne esaminare le caratteristiche, si riporta un esempio di programma scritto in Assembly.
section .bss somma: resw 1 ;variabile per risultato section .text global _start ;necessario al linker _start: ;entry point del programma mov eax,2 ;mette 2 in un registro della CPU mov ebx,3 ;mette 3 in un registro della CPU add eax,ebx ;somma i due numeri mov somma,eax ;conserva in memoria il risultato mov eax,1 ;chiamata al sistema (sys_exit) int 80h ;chiama il kernel
Da un esame, anche generale, del listato riportato si può notare:
L'uso, qui per la prima volta, delle variabili (nell'esempio somma). Invece di usare indirizzi per rintracciare la word in cui si conserva il risultato della somma, si assegna alla locazione un nome simbolico che la individua in modo univoco. È questa caratteristica che fa individuare l'Assembly come primo linguaggio di programmazione.
L'uso di mnemonici al posto, nelle istruzioni, dei codici operativi. La combinazione di lettere utilizzata agevola il programmatore nella comprensione dell'operazione eseguita. Per esempio è più facile ricordare che add è il codice operativo di una somma invece di un codice, anche, esadecimale.
L'uso di nomi simbolici negli operandi, anche per indicare i registri interni della CPU.
Il modo di scrivere il programma, rispetto anche all'introduzione di codici esadecimali, è cambiato: è più semplice comprendere quello che fa il programma. L'uso intensivo dei commenti agevola ulteriormente la comprensione.
L'aspetto negativo, dal punto di vista della comprensibilità, è costituito dal fatto che, anche se scritte in modo diverso ad ogni istruzione in linguaggio Assembly corrisponde una istruzione in linguaggio macchina. Il programmatore è costretto a tradurre l'algoritmo, per come lo concepisce lui, in sequenze di istruzioni che seguono la logica della macchina: l'Assembly è, infatti, una rappresentazione simbolica del linguaggio macchina e, per questo motivo, viene considerato un linguaggio a basso livello, intendendo in tale modo affermarne la vicinanza con il linguaggio macchina. Spesso si dice che l'Assembly è un linguaggio di seconda generazione.
Un'altra caratteristica peculiare dell'Assembly è il fatto che, più che di un linguaggio bisognerebbe parlare, più propriamente, di un insieme di dialetti. Essendo, infatti legato indissolubilmente al linguaggio macchina, varia da CPU a CPU. Per esempio il linguaggio macchina della CPU1 potrebbe supportare operazioni a tre operandi che, invece, non sono supportate dalla CPU2. Inoltre il legame che un programma ha con il Sistema Operativo, comporta nel caso della scrittura di un programma in Assembly, la conoscenza dei dettagli delle comunicazioni fra il programma stesso e i servizi del Sistema Operativo. Il programma di esempio termina chiamando il Sistema Operativo che riprende il controllo della macchina. La chiamata ha codice 80h in ambiente Linux, ma, per esempio, 21h in ambiente DOS e, inoltre, le convenzioni di chiamata (la penultima istruzione dell'esempio) cambiano.
Nonostante le evidenziate difficoltà nel suo utilizzo, l'Assembly, essendo l'unico linguaggio con una corrispondenza 1:1 con il linguaggio macchina, è tuttora utilizzato principalmente in ambienti in cui la velocità di esecuzione è un fattore critico. Se occorre, infatti, sfruttare tutte le potenzialità di una macchina è necessario utilizzare un linguaggio che parli direttamente alle sue componenti.
http://ennebi.solira.org |
ennebi@solira.org |