|
I
linguaggi simbolici di
programmazione più o meno da vicino riflettono il linguaggio naturale. Il
Pascal, tanto per citare il più comune nelle scuole, adotta parole mutuate dall'inglese. Il Cobol
addiritura prende intere frasi. L'esempio: perform
CALCOLO varying IMPORTO from 20 to 1260 by 10 until FINE-CALCOLO.
Significa:
"esegui CALCOLO variando l'IMPORTO da 20 a 1260 di 10 in 10 finchè arrivi a
FINE-CALCOLO"
Linguaggio ben più ostico per l'uomo è l'Assembler che non
imita i linguaggi naturali. Le sue istruzioni riflettono direttamente i
comandi binari eseguiti dalla macchina. I programmatori scrivono sigle che
non hanno affatto un aspetto familiare. Ad esempio la somma di due dati
decimali si indica con AP, la moltiplicazione con MP. Dal fatto che
l'Assembler riflette esattamente le esigenze della macchina, ne viene che ci
sono tanti linguaggi Assembler quanti sono i modelli hardware di sistema. Per esempio
abbiamo l'Assembler mainframe, e l'Assembler PC.
Infine abbiamo il linguaggio
macchina (o machine
code)
il quaIe è binario, viene eseguito dai circuiti, ed è impossbile da
scrivere a mano. Ovviamente il
linguaggio macchina è legato al modello di macchina come l'Assembler.
Esiste dunque un abisso tra il programma nella versione simbolica che è 'umana' ed il
programma nella versione 'macchina' letto dai circuiti. Da questo consegue che un programma
simbolico viene necessariamente tradotto da un apposito apparato per poter
essere eseguito dalla macchina. Il cosidetto compilatore
si incarica di questo lavoro.
Ad esempio il programma Basic viene tradotto in binario dal compilatore
Basic, e da PIPPO.BAS si ottiene PIPPO.EXE. Anche il programma PIPPO.ASM in
Assembler viene compilato e si ha PIPPO.EXE.
Fatta questa necessaria premessa, rivolgiamo la nostra attenzione
all'Assembler, il
linguaggio di programmazione del tutto simmetrico al machine code. Ogni sua
istruzione corrisponde ad una operazione della macchina. Per vedere come
l'Assembler rifletta direttamente il machine code - come lei ha richiesto - supponiamo di sommare il
contenuto del registro 12 nel registro 3 (i registri sono campi contenuti
nella CPU e quindi i circuiti vi operano molto velocemente). In Assembler mainframe Add Register di Reg12 in Reg3 si scrive così: AR
Reg3,Reg12 Il
compilatore Assembler lo riduce a due byte, in linguaggio macchina si ha: 00011010
00111100 I
primi 8 bit a partire da sinistra sono il codice dell'operazione, cioè
0011010 significa Add Register per la macchina. I successivi quattro bit - cioè
0011 - indicano 3 e gli ultimi quattro bit - vedi 1100 - il
registro 12. Questa è dunque una semplice istruzione in
machine code così come la vede e la esegue la CPU. Il
binario è assai complicato da scrivere ed i tecnici hanno introdotto
la codifica esadecimale che semplifica la scrittura.
Invece di annotare 4 bit, essi preferiscono usare un solo simbolo esadecimale. I 16 simboli
che codificano i quattro bit su carta sono i seguenti:
Quindi un tecnico scrive
l'istruzione macchina sopra riportata in questo modo:
1A 3C
Questa scrittura compare anche nei tabulati tecnici. Ad esempio
la mappatura della memoria centrale appare in questo modo. Ogni coppia di
simboli è un byte in memoria.

Questi tabulati vengono esaminati soprattutto dai sistemisti cioè
dagli esperti del sistema operativo, del database manager, del TCP/IP ecc. Essi per scoprire i guasti devono talora verificare "de visu"
le istruzioni che la macchina ha eseguito, una ad una. Hanno dunque familiarità con il
machine code che invece interessa il programmatore generico solo sul piano
culturale.
Indietro
anno 2004 |