prof. Nunzio Brugaletta |
LinPROG |
Fra i 3GL un linguaggio che ebbe una notevole diffusione (famoso in senso positivo e negativo) e che continua, anche questo, ad essere utilizzato anche se in forme diverse rispetto alle caratteristiche originali, è il BASIC (Beginner's All purpose Symbolic Instruction Code). Sviluppato dal 1963, nasce per essere un linguaggio semplice da imparare e per poter essere utilizzato, come evidenziato anche dal nome, dai principianti per la scrittura di programmi generici. Il BASIC comprende istruzioni, derivate dal Fortran, per calcoli scientifici e istruzioni, anche se non specializzate come nel COBOL, per il trattamento di dati residenti su memorie di massa. Gli strumenti resi disponibili dal linguaggio possono essere utilizzati anche da chi non ha buone basi di programmazione. Anche se nasce compilato le sue implementazioni più comuni sono interpretate, anche in ragione del fatto che un linguaggio interpretato si adatta maggiormente, rispetto ad uno compilato, ad essere usato da un principiante.
La diffusione del BASIC con il suo permissivismo e, principalmente, la mancanza di regole di buona programmazione portò ben presto a quello che fu chiamato spaghetti code, termine dispregiativo per indicare quei programmi in cui è difficile seguire il flusso delle istruzioni che le compongono. Le istruzioni sono intrecciate come gli spaghetti in un piatto.
20 i = 0 30 i = i + 1 40 if i <> 10 then goto 70 50 print "Programma terminato." 60 end 70 print i, " al quadrato = ", i * i 80 goto 30
Il programma dell'esempio, scritto in BASIC, calcola e visualizza i quadrati dei numeri da 1 a 9, solo che, il continuo rimando ad altre righe contenenti codice (le istruzioni goto), rende incomprensibile, e difficile da seguire logicamente, la sequenza delle istruzioni. La manutenzione di programmi che usavano in maniera intensiva l'istruzione di modifica sequenza goto diventavano quasi impossibili da mantenere.
Lungo il cammino verso la definizione di regole di buona programmazione, si incontrano due tappe fondamentali:
l'enunciazione, nel 1966, del teorema di Böhm-Jacopini che afferma che qualunque algoritmo si può scrivere utilizzando soltanto tre strutture: la sequenza (elenco delle istruzioni che evidenzia l'ordine di esecuzione), la selezione (la scelta fra due diverse sequenze di istruzioni che vengono eseguite in dipendenza da una condizione che può essere vera o falsa), il ciclo (una sequenza di istruzioni che viene ripetuta finché resta valida una condizione).
la pubblicazione, nel 1968, dell'articolo Go To Statement Considered Harmful del prof. Edsger Dijkstra, dove si attaccava l'uso della famigerata istruzione considerandola emblema di cattiva programmazione, auspicandone la scomparsa dai futuri linguaggi.
Fra gli anni '60 e '70 vengono sviluppati i concetti della programmazione strutturata, paradigma di programmazione nato per applicare le nuove regole. Il prof. Niklaus Wirth pubblica l'articolo Program Development by Stepwise Refinement sulla metodologia top down per costruire soluzioni a problemi complessi, e il libro Algoritmi + Strutture di Dati = Programmi, testo fondamentale di programmazione.
Nel paradigma della programmazione strutturata si possono utilizzare solo le tre strutture previste dal teorema di Böhm-Jacopini. Ogni struttura deve avere un solo punto di ingresso e un solo punto di uscita (non è più ammesso saltare in qualsiasi punto del programma) e, inoltre, ogni struttura può avere al suo interno solo strutture di controllo del tipo delle tre ammesse.
Il nuovo paradigma poteva essere applicato anche utilizzando gli strumenti resi disponibili dai linguaggi di programmazione esistenti, che consentivano tale paradigma ma ne rendevano l'uso difficoltoso. Occorrevano quindi nuovi linguaggi che supportassero il paradigma rendendo facile la sua applicazione. Wirth progetta, a tale scopo, nel 1970, il Pascal: linguaggio sviluppato per la didattica della programmazione.
Alla programmazione strutturata si affianca, come estensione, la programmazione modulare basata sullo sviluppo di un programma in singoli moduli indipendenti fra di loro, ognuno con interazione minima con il mondo esterno e con gli altri moduli, e sull'utilizzo di interfacce semplificate per la comunicazione fra i moduli. Wirth estende gli strumenti, resi disponibili dal Pascal, progettando il Modula-2 che supporta pienamente, come si evince anche dal nome scelto, il paradigma modulare.
Il paradigma della programmazione modulare consente lo sviluppo di linguaggi di programmazione che, anche se rientrano nella famiglia dei linguaggi procedurali, hanno caratteristiche diverse rispetto a quelli esistenti fino a quel momento:
I linguaggi di terza generazione, esistenti in tempi precedenti la definizione delle regole della programmazione strutturata, presentavano un insieme finito di parole chiavi dedicate alla risoluzione di problemi di una determinata categoria. Se occorrevano elaborazioni diverse da quelle comuni nelle applicazioni, bisognava arrangiarsi con quello che c'era o rivolgersi ad un altro linguaggio. Per esempio il trattamento dei file su memorie di massa nel Fortran è abbastanza primitivo: le informazioni possono essere elaborate come insiemi di byte e, d'altra parte, chi sceglie il Fortran lo sceglie per le potenti istruzioni matematiche disponibili. Se serve elaborare molti dati dalle memorie di massa: o ci si arrangia con quello che si ha, aumentando notevolmente il codice da scrivere o si usa un altro linguaggio più specializzato (per esempio il COBOL). Da qui la proliferazione dei linguaggi con notevoli disagi per il programmatore che, nonostante avesse acquisito esperienza nell'utilizzo di un certo linguaggio, era obbligato a imparare un nuovo linguaggio qualora gli occorrevano funzionalità diverse, sprecando il know-how acquisito.
I linguaggi di programmazione sviluppati dopo la teorizzazione della programmazione modulare partono da un'altra prospettiva: poche parole chiavi, giusto quelle necessarie per codificare le strutture di controllo e la possibilità di aggiungere moduli con funzioni che espandono il linguaggio specializzandolo per determinate applicazioni.
#include <stdio.h> #include <string.h> /*1*/ main() { char parola[50]; int l; printf("Calcola lunghezza di una parola \n"); printf("Introdurre parola "); gets(parola); l=strlen(parola); /*2*/ printf("Introdotta parola di %d caratteri \n",l); }
Il programma in linguaggio C, riportato come esempio, calcola e visualizza la lunghezza di una parola introdotta da input. Per il calcolo della quantità di caratteri viene utilizzata una funzione (2) contenuta nel modulo string di cui si include l'interfaccia, per l'utilizzo delle funzioni contenute nella libreria, nella 1. In questo modo si aggiungono al C le funzioni per il trattamento di stringhe. Aggiungendo moduli diversi si specializza il linguaggio. Si potrebbero così avere moduli per la gestione della grafica, dei database e così via.
Il linguaggio C viene creato nel 1979 da Kernighan e Ritchie. Pensato per scrivere sistemi operativi e software di sistema, si tratta di un linguaggio ad alto livello e, tuttavia, comprende caratteristiche del linguaggio Assembly che lo fanno apprezzare per la sua efficienza e lo fanno definire come linguaggio di medio livello.
http://ennebi.solira.org |
ennebi@solira.org |