Eseguire il codice sorgente

I codici sorgenti, di solito, vengono scritti per essere eseguiti da un computer. Di solito, perché ci sono codici scritti come esempio, per insegnare, o per dimostrare qualcosa. Ma in generale, lo scopo di un codice è quello di essere eseguito correttamente. Un po' come succede nella produzione industriale, un oggetto prima di essere prodotto in serie e affidato agli utenti viene prima verificato, controllato, per assicurarsi che non vada in mille pezzi alla prima occasione.

Cosa significa esattamente? Che prima di poter usare un codice sorgente occorre verificarne la correttezza:

  • lessicale
  • sintattica
  • semantica
Se ha superato questi test, cioè se non usa parole sconosciute, rispetta la grammatica e non chiede cose impossibili, allora si può pensare a tradurlo nell'unico linguaggio che i computer sanno eseguire, cioè quello binario. Quindi si passa alle fasi finali:
  • collegare tutte le funzioni esterne necessarie
  • tradurre nel linguaggio binario specifico per un determinato computer
Questi passi possono essere compiuti ad ogni esecuzione (e allora si parla di codici "interpretati"), oppure una volta per tutte (e si parla di codici "compilati"). Può anche darsi che la versione finale non sia veramente un codice binario specifico di un certo computer, ma una versione intermedia unica che può essere eseguita da una macchina virtuale specifica per quel certo computer, come è il caso del linguaggio Java.

Gli errori più semplici sono quelli che emergono nelle prime fasi del processo. Anzi, spesso oggi non serve nemmeno arrivare fino lì: è l'IDE con cui si scrive il codice che segnale gli errori sintattici o la presenza di termini sconosciuti, o ancora gli errori di tipo semantico: una funzione che viene chiamata con un numero di parametri minore di quelli previsti nella definizione, o di un tipo diverso.

I veri problemi nascono quando tutti questi controlli sono stati superati ma ancora il risultato finale non è quello atteso; oppure quando il programma si blocca in maniera irreversibile. Sono gli errori "run-time", gli errori che dipendono dal contesto di esecuzione: ad esempio dati mancanti, o eccessivi, o di un tipo non previsto.

Al momento dell'esecuzione vengono alla luce anche tutti i problemi di velocità: un codice può essere corretto, ma impiegare un tempo inaccettabile per la sua esecuzione. In questi casi si può ricorrere ad un approccio hardware (utilizzare un computer più potente o aumentare le risorse disponibili) oppure ripensare il codice tenendo conto dell'efficienza.

Ci sono alcuni linguaggi intrinsecamente più veloci di altri: si trovano spesso dei confronti sul tempo impiegato da algoritmi identici eseguiti dulla stessa macchina in linguaggi diversi.

Velocità di esecuzione
Source: https://github.com/niklas-heer/speed-comparison
Ci sono anche Algoritmi più veloci di altri, a parità di tutto il resto. Il caso dell'ordinamento è uno dei più noti: a partire dall'algoritmo più naturale (l'inserimento), sono stati inventati algoritmi più veloci (l'ordinamento per combinazione, inventato da Von Neumann nel 1945, l'ordinamento "quick", inventato da Hoare nel 1961). Come fanno ad essere più veloci? Perché raggiungono lo stesso risultato con meno operazioni. Certo, ma come è possibile? In generale, il trucco è non perdere informazioni strada facendo: se una parte dell'insieme di elementi è già parzialmente ordinato, questa informazione viene conservata nel processo.

Prossimo pannello:  Algoritmi



Versione: 12/01/2022 - 19:23:39

Parole: 283

Pannelli

Concetti                    
MagiaDigitale               
Programmi                   
Codice                      
Linguaggi                   
Errori                      
Esecuzione                  
Algoritmi                   
🔎