Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Autore: Manuel Dalcastagnè. Questo materiale è rilasciato secondo la licenza CC Attribution 3.0 Unported
(http://creativecommons.org/licenses/by/3.0/ (http://creativecommons.org/licenses/by/3.0/)).
Un linguaggio di alto livello offre invece un maggiore livello di astrazione rispetto alla macchina su cui viene eseguito, in
quanto le istruzioni di programmazione non fanno riferimento alle componenti del processore. L'uso di istruzioni che
operano indirettamente sulla CPU permette di isolare la logica di programmazione dalle caratteristiche tecniche del
computer, garantendo una maggiore portabilità del codice e semplificando la programmazione per l'essere umano.
Esistono dei programmi specifici per tradurre il codice scritto con linguaggi di programmazione in codice basato sul
linguaggio macchina. Per i linguaggi di basso livello questi programmi vengono chiamati assemblatori, mentre per i
linguaggi di alto livello esistono compilatori e interpreti.
Un assemblatore semplicemente converte le istruzioni scritte dal programmatore in linguaggio macchina, basandosi
sulle istruzioni di base che uno specifico processore può eseguire.
Nel caso di compilatori e interpreti, la conversione è più complessa proprio a causa della maggior astrazione dei
linguaggi di alto livello. I comandi di programmazione non corrispondono alle operazioni elementari del processore, e
infatti il codice deve essere sottoposto a varie operazioni prima di essere tradotto in linguaggio macchina (come ad
esempio l'analisi lessicale e l'analisi semantica del codice).
Un compilatore converte il codice in linguaggio macchina prima dell'esecuzione, mentre un interprete effettua la
conversione durante l'esecuzione.
La compilazione del codice da parte di un compilatore può richiedere una quantità di tempo considerevole, ma
l'esecuzione di codice macchina compilato è più veloce dell'esecuzione di codice di alto livello interpretato. Se la
velocità di esecuzione di un programma è la priorità, un linguaggio compilato è solitamente preferibile ad un linguaggio
interpretato.
Codice Assembly
fib:
mov edx, [esp+8]
cmp edx, 0
ja @f
mov eax, 0
ret
@@:
cmp edx, 2
ja @f
mov eax, 1
ret
@@:
push ebx
mov ebx, 1
mov ecx, 1
@@:
lea eax, [ebx+ecx]
cmp edx, 3
jbe @f
mov ebx, ecx
mov ecx, eax
dec edx
jmp @b
@@:
pop ebx
ret
Codice C
unsigned fib(unsigned n) {
if (!n)
return 0;
else if (n <= 2)
return 1;
else {
unsigned a, c;
for (a = c = 1; ; --n) {
c += a;
if (n <= 3) return c;
a = c - a;
}
}
}
4) collegamento del codice oggetto con eventuali librerie di programmazione, e creazione di un file eseguibile su disco
fisso
Primo programma in C
Aprire un text editor come gedit (Linux) o blocco note (Windows) e creare uno script C chiamato hello.C
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
Compilare lo script usando un compilatore (su Linux, possiamo usare il comando gcc)
gcc hello.C
Eseguire il codice macchina generato dal compilatore (se non definito diversamente, viene salvato in un file
chiamato a.out)
/.a.out
Esercizio 2
Creare uno shell script che compili hello.C, salvi il codice macchina in un file chiamato hello, esegua hello e salvi
l'output in un file output_hello.txt.
Materiale aggiuntivo
https://en.cppreference.com/w/c/ (https://en.cppreference.com/w/c/) - informazioni ed elenco delle librerie che
compongono la libreria standard di C