Caratteristiche e Differenza tra algoritmi e programmi

Caratteristiche e Differenza tra algoritmi e programmi

Algoritmi e programmi

Il calcolatore è un elaboratore automatico d’informazione, che esegue operazioni su oggetti (dati) per produrre altri oggetti (risultati).
L’esecuzione di azioni viene richiesta all’elaboratore attraverso opportune direttive, dette istruzioni. Il calcolatore che abbiamo descritto è detto “elettronico” in quanto gli oggetti che riceve in ingresso, elabora e fornisce in uscita sono segnali elettrici, livelli di tensione e la loro elaborazione avviene mediante circuiti elettronici a semiconduttore.
Si parla anche di elaboratori digitali: il significato che viene dato a questi livelli di tensione non è legato, infatti, al loro valore assoluto, ma al loro essere superiori od inferiori a una determinata soglia, nel qual caso al livello di tensione si attribuisce il valore 1 o 0. I dati in ingresso ed in uscita nei calcolatori elettronici sono quindi sequenze di valori 0 o 1 (bit, da BInary digiT).
Al di là della complessità raggiunta da problemi e soluzioni che stanno alla base del software che utilizziamo oggi, anche le macchine che usiamo quotidianamente lavorano facendo sequenze di operazioni su dati binari.

Uno degli scopi dell’informatica consiste quindi nel cercare di capire quali siano i problemi affrontabili dalle macchine e lo studio di come si possa impostare la loro soluzione suddividendola in passi fondamentali eseguibili dalla macchina. Si parla in questo caso di studio degli algoritmi: ne riassumiamo nel seguito gli aspetti principali.
Supponiamo di avere un determinato problema e di volerlo fare risolvere automaticamente alla macchina calcolatrice che abbiamo a disposizione. Per far questo dovranno essere verificate alcune condizioni:

  1. La soluzione del problema deve essere nota.
  2. I passi che la compongono debbono poter essere tradotti in un linguaggio comprensibile dal calcolatore.
  3. I dati in ingresso devono essere codificati in dati adatti al calcolatore (in generale numeri binari).

Se ciò è vero, possiamo trovare opportuno metodo di elaborazione che mettendo in sequenza “azioni elementari” eseguibili dalla macchina trasformi i dati iniziali nei corrispondenti risultati finali desiderati. La “sequenza di azioni elementari” così definita è detta anche algoritmo.

Caratteristiche e Differenza tra algoritmi e programmi

 

Non tutti i problemi, neppure tutti quelli, ben definiti, della matematica o della geometria possono essere risolti o tradotti per il calcolatore. Questo può essere dovuto al fatto che non si conosce neppure la soluzione del problema (ad esempio trovare tutte le coppie contigue di numeri primi) oppure perché non esiste un metodo automatizzabile.
Questo non è stato certo limitante per il diffondersi delle applicazioni del calcolo automatico: con il calcolatore è stato comunque possibile risolvere problemi molto complessi ed oggigiorno i personal computer non si limitano a risolvere qualche semplice problema matematico o logico, ma sono programmati per simulare o riprodurre operazioni complesse e sostituiscono l’attività umana in una serie di compiti sempre più rilevante.

Tutto questo non deve farci però dimenticare che tutte le attività svolte dal calcolatore nascono sempre dalla scrittura di algoritmi in opportuni linguaggi descrittivi (quella che si chiama “programmazione“), che vengono poi “tradotti” nei linguaggi a basso livello del calcolatore mediante quelle che vengono chiamate “compilazione” o “interpretazione”.
Dunque non deve stupire che magari qualche volta i programmi che utilizziamo falliscano o si blocchino, o magari ci siano errori nelle elaborazioni, la colpa, contrariamente a quanto viene talvolta detto da non addetti ai lavori, non è mai del computer, ma di errori nella scrittura degli algoritmi, nella programmazione o nella selezione dei dati.
Il lavoro degli informatici cerca di ridurre questi errori e quindi discipline fondamentali per chi studia l’informatica sono sicuramente lo studio degli algoritmi, dei linguaggi e delle tecniche di programmazione. Senza addentrarci in queste materie, ricordiamo soltanto le proprietà principali degli algoritmi.

Il concetto di algoritmo (termine che deriva dal nome di un matematico arabo, Al Khowarizmi, che contribuì alla fondazioni dell’algebra) non è legato necessariamente al calcolatore elettronico, ma ad un qualunque “esecutore”. Quest’ultimo è un entità che, in generale, dovrà essere in grado di compiere “azioni elementari” e di interpretare un linguaggio con cui queste azioni gli sono ordinate.
Per il resto, l’esecutore di un algoritmo può benissimo essere una persona, una sistema meccanico o di qualunque altro tipo. Se, per esempio, istruisco un mio conoscente ad andare a pagare una bolletta al mio posto, spiegandogli dettagliatamente dove deve andare, cosa deve scrivere, eccetera, sto facendo null’altro che istruire un esecutore a eseguire una serie di operazioni elementari che lui sa eseguire, cioè gli sto fornendo un algoritmo.

L’importante, ai fini dell’ottenimento dello scopo (nell’esempio avere la bolletta pagata) è che la mia descrizione dell’algoritmo possieda alcune proprietà fondamentali, cioè, ad esempio:

  • Non ambiguità: le istruzioni devono essere univocamente interpretabili dall’esecutore
  • Eseguibilità: l’esecutore deve essere in grado di operare ciascun passo in tempo finito
  • Finitezza: l’esecuzione deve terminare per ogni configurazione dei dati in ingresso

Queste proprietà sono necessarie sia nel caso della bolletta, sia per la programmazione del computer. Se le proprietà sono rispettate, cosa peraltro non facilmente dimostrabile nei problemi reali, posso mandare tranquillamente il mio compito in esecuzione.
Nello studio teorico si considerano, per semplicità, delle macchine “astratte” che in qualche modo modellano le macchine calcolatrici reali; le più note sono Macchina di Turing e la Macchina RAM (con memoria ad accesso casuale). Dall’analisi di tali modelli di esecutore si possono ricavare teoremi riguardanti la calcolabilità di determinate espressioni, e quindi sulla risolubilità di problemi. Fu per esempio l’analisi di un famoso problema sulla macchina di Turing a mettere in evidenza che nella logica matematica esistono classi problemi “non decidibili”, per i quali non si può trovare soluzione. Una congettura comunemente accettata è che la classe di problemi matematici risolubili con una macchina astratta sia comune per tutte le macchine di questo tipo.

In questo articolo parleremo minimamente dello studio di queste problematiche, mentre andiamo ad analizzare come si possa passare da un problema risolubile alla sua esecuzione automatica, cioè analizziamo un attimo quello che gli analisti e programmatori fanno nella pratica del loro lavoro.

Analisi e implementazione degli algoritmi

L’analisi del problema deve mettere in evidenza quali siano i dati, quale la soluzione da ottenere e con quali vincoli. Si definiscono cioè le precondizioni rispettate dai dati e le postcondizioni che devono rispettare le soluzioni. A questo punto si passa alla sintesi dell’algoritmo, che può essere libera o eseguita secondo ben codificati metodi progettuali. Una volta nota la soluzione la si dovrà descrivere in maniera chiara e comprensibile all’uomo per permettere ad altri di analizzarla e modificarla, per poi, in un secondo tempo “tradurla” in un linguaggio comprensibile al calcolatore. Il passaggio dalla descrizione dell’algoritmo alla scrittura e traduzione del programma viene spesso chiamato “implementazione”.
Facciamo un esempio: supponiamo di voler scrivere un programma che calcola la media dei voti riportati da uno studente. Dovremo, oltre a fare in modo di codificare in bit i numeri reali e i caratteri che compongono il nome, saper risolvere il problema di calcolare la media (banale: somma diviso numero di esami) e scrivere le operazioni che portano ad essa in modo da farle eseguire al calcolatore. Tutto qui, anche se, ovviamente, se dovessimo realizzare tutto noi avendo a disposizione soltanto l’hardware della macchina sarebbe complicatissimo.

Differenza tra algoritmi e programmi in informatica

Un calcolatore elettronico, di per sé, comprende soltanto serie di istruzioni per il microprocessore scritte in quello che viene detto “linguaggio macchina”, cioè una serie di codici di operazioni (una sequenza di byte) e di operandi (dati scritti anche essi in binario). Ed è in grado di lavorare su dati numerici di tipo e dimensione limitati. Abbiamo visto che in un calcolatore elettronico la CPU ha un set di istruzioni a ciascuna delle quali corrisponde un codice: questo vuol dire che un programma eseguibile lo è soltanto per quella determinata CPU, o per una CPU con le stesse operazioni e gli stessi codici. Un programma eseguibile, in linguaggio macchina, è eseguibile solo su un calcolatore con una determinata CPU e consiste quindi in una sequenza di codici operativi (numeri binari che corrispondono a una determinata operazione della CPU) e di operandi (dati codificati in codice binario. Poiché una simile sequenza non è molto comprensibile, la si indica con un linguaggio simbolico in cui stringhe di caratteri indicano le operazioni e le locazioni di memoria (ad esempio ADD R1 R3 significa addizione dei contenuti di due registri).
Programmare un applicazione moderna lavorando a questo livello avrebbe comunque sempre una complessità proibitiva.

Fortunatamente i programmatori, al giorno d’oggi, non hanno bisogno di conoscere neppure questo linguaggio, in quanto esistono linguaggi evoluti attraverso i quali si possono scrivere gli algoritmi che poi vengono trasformati in linguaggio macchina dai compilatori, oppure controllati e interpretati linea dopo linea da programmi che vengono detti “interpreti”. Questi linguaggi di programmazione vengono detti “di alto livello” (Pascal, Basic, C, C++, ecc) e ricordano più il linguaggio naturale umano che il linguaggio macchina.
Utilizzando questi linguaggi i programmatori lavorano a livelli “alti” del sistema operativo e danno istruzioni a “macchine virtuali” in cui l’hardware è utilizzato indirettamente attraverso le funzioni del software di sistema.

Il compito dei programmatori di oggi è facilitato anche dall’avere a disposizione ulteriori strumenti, come ambienti di sviluppo, sistemi di “debugging” (per trovare facilmente gli errori), “editor” per scrivere il codice in maniera assistita, eccetera.
Inoltre moltissimi tipi di dati, anche immagini, suoni, ecc possono essere codificati in modo standard per essere elaborati dalla CPU e le librerie di programmi di sistema (incluse nei cosiddetti sistemi operativi) si occupano di gestire le parti del computer a basso livello (memoria, input/output, ecc.)
Insomma generazioni di programmatori hanno fatto sì che chi vuole realizzare applicazioni per il computer possa farlo ad alto livello, scrivendo liste di comandi complessi su dati di ogni genere e questo ha facilitato moltissimo lo sviluppo di applicazioni varie per l’utente generico.

Le macchine che oggi utilizziamo non si caratterizzano quindi soltanto per un’architettura hardware, ma anche per vari tipi di programmi di gestione che costituiscono i cosiddetti sistemi operativi (ci si riferisce a hardware + sistema operativo con il termine piattaforma di sviluppo). Questi sistemi operativi forniscono l’interfaccia all’utente per interagire con le risorse della macchina in maniera astratta ed intuitiva, ed ai programmatori la possibilità di scrivere i programmi che realizzano applicazioni complesse mediante metodologie di sviluppo semplici ed organizzate.

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: https://vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *