Sei sulla pagina 1di 4

Introduzione al C

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/)).

Linguaggi di basso e alto livello


Un linguaggio di basso livello è un linguaggio di programmazione che fornisce un basso livello di astrazione rispetto
all'architettura di un processore, o Central Processing Unit (CPU). In questi linguaggi, le istruzioni di programmazione
operano direttamente sulle componenti del processore, come i registri della Arithmetic and Logic Unit (ALU).

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.

Schema logico di una CPU - (Supix (https://en.wikipedia.org/wiki/it:User:Supix), Wikipedia in italiano


(https://en.wikipedia.org/wiki/it:), it.wikipedia (https://it.wikipedia.org), GFDL (http://www.gnu.org/copyleft/fdl.html))

Assemblatori, compilatori e interpreti


Un computer può eseguire solamente codice in linguaggio macchina, basato su istruzioni relative all'architettura di ogni
specifico processore e scritte in codice binario o esadecimale.

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.

Esempi di linguaggi di diverso livello


Ecco di seguito diverse versioni dell'algoritmo per calcolare il numero di Fibonacci, con linguaggi a diversi livelli di
astrazione:

Codice macchina esadecimale per un elaboratore con architettura a 32-bit

8B542408 83FA0077 06B80000 0000C383


FA027706 B8010000 00C353BB 01000000
B9010000 008D0419 83FA0376 078BD989
C14AEBF1 5BC3

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;
}
}
}

Alcune informazioni sul C


Nato nel 1972, allo scopo di essere usato per creare sistemi operativi
Varie parti di molti dei sistemi operativi di oggi sono scritti in C (Linux, Windows, Android)
Molto usato per programmare sistemi embedded (sistemi di navigazione, sistemi di allarme, gamepads, ...)
Costruito per essere efficiente, è un linguaggio compilato
Molti linguaggi di programmazione sono basati sul C (C++, Java, JavaScript, Python, PHP)

Come creare ed eseguire un programma in C


Principali fasi della pipeline di programmazione di un linguaggio compilato:

1) scrittura del codice

2) preprocessing del codice

3) compilazione (creazione codice macchina - o codice oggetto)

4) collegamento del codice oggetto con eventuali librerie di programmazione, e creazione di un file eseguibile su disco
fisso

5) caricamento del file eseguibile nella memoria primaria (RAM)

6) esecuzione del file eseguibile da parte della CPU

Pipeline di programmazione in C - (C: How to program, P. Deitel and H. Deitel, 2016)

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.

SUGGERIMENTO: usare le opzioni del comando gcc

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

Potrebbero piacerti anche