Linguaggi Di Programmazione Non OOP
Total Page:16
File Type:pdf, Size:1020Kb
Ingegneria del Software Linguaggi di programmazione non OOP Barlini Davide-Carta Daniele-Casiero Fabio-Mascia Cristiano Abstract Scopo principale del lavoro è quello di riportare, nelle schede, una classificazione dei linguaggi di programmazione non orientati agli oggetti. Per far ciò, si è pensato di procedere gradualmente andando a focalizzare via via l’obiettivo. Si introduce il concetto di linguaggio di programmazione andando ad elencare le cinque diverse generazioni di evoluzione degli stessi. Cercando di fornire una classificazione accettabile, si discute dei paradigmi di programmazione citando il paradigma procedurale ed il paradigma dichiarativo e le loro ulteriori articolazioni. La classificazione riportata è successivamente arricchita da nuovi tipi come i “paralleli, concorrenti, distribuiti, applicativi, scripting, markup”. Per ognuno di essi si sono spese due parole di introduzione. Sono infine presentati i linguaggi trovati, ognuno dei quali ha una sua introduzione ed una scheda riassuntiva che ne individua la posizione nella classificazione proposta. 1 Indice Linguaggi di programmazione ......................................................................3 Generazioni ...................................................................................................4 Paradigma di programmazione ...................................................................5 Classificazione..............................................................................................7 I vari linguaggi................................................................................................ 15 Links nel web ................................................................................................ 37 Appendice: le schede.................................................................................... 42 2 Linguaggi di programmazione L'attività di un programmatore è quella di risolvere un problema sotto forma di algoritmo e di tradurlo in programma in un dato linguaggio1. Il termine algoritmo entrato in uso negli anni ’50 sostituì la parola algorismo, (processo di calcolare con i numeri arabi), derivato da una deformazione del nome di un matematico arabo Abu Ja’far Mohammed ibn Mˆ usˆ a al- Khowˆ arizmˆ ý (825 d. C.), ma la definizione del matematico Markov appare più appropriata. "L'insieme delle regole precise che definiscono un procedimento di calcolo destinato ad ottenere un risultato determinato a partire da dati iniziali certi". I linguaggi di programmazione costituiscono l'unico formalismo mediante il quale l'uomo può dialogare con i sistemi informatici, siano questi hardware che software. L'area dei linguaggi è in continua evoluzione e molto attiva anche dal punto di vista della ricerca poiché ogni nuova applicazione ed ogni nuova architettura (sia fisica che logica come il W.W.W.) pongono nuovi problemi e sfide ai progettisti che devono individuare i costrutti e le strutture più naturali per il tipo di problema che si vuole risolvere e per gestire e sfruttare in modo semplice le nuove tecnologie. L'aumento delle potenzialità degli strumenti di calcolo ha permesso il passaggio tra elaborazione numerica e simbolica e lo sviluppo di diverse famiglie di linguaggi di programmazione (imperativi, funzionali, logici). Ciascuna di queste può a sua volta essere utilizzata mediante diverse filosofie: sequenziale, concorrente, orientata agli oggetti. Dalla teoria dei linguaggi formali sono ereditate le tecniche automatiche che permettono di tradurre in modo equivalente il codice scritto in un dato linguaggio in un altro linguaggio (tipicamente di livello più "vicino" alla macchina). I LINGUAGGI DI PROGRAMMAZIONE Un linguaggio di programmazione è un insieme di simboli (alfabeto) e stringhe di simboli (vocabolario) che possono essere connessi tra loro seguendo regole formali predefinite e precise. Le regole per la costruzione delle frasi di un linguaggio sono espresse come produzioni di un sistema formale denominato grammatica. Le regole grammaticali descrivono solo come sono fatte le frasi di un linguaggio, cioè la sintassi, e di norma non descrivono il significato delle frasi. Le regole grammaticali devono essere concepite in modo da garantire la decidibilità del linguaggio. I programmatori inesperti tendono ad "aggrovigliare" il programma introducendo numerosi salti privi di regole (spaghetti programming). E' stato dimostrato (Teorema fondamentale della programmazione strutturata di Jacopini e Böhm) che ogni programma può essere codificato attenendosi esclusivamente a tre strutture fondamentali: 1. Sequenziale 2. Iterativa 3. Condizionale Queste tre strutture possono essere concatenate una di seguito all'altra oppure nidificate una dentro l'altra (non possono essere "intrecciate" o "accavallate"). Dopo aver scritto il sorgente attraverso un linguaggio di programmazione, è necessario che sia tradotto in codice binario. Tale azione può avvenire prima della fase vera e propria di esecuzione, come accade con il compilatore o durante la fase stessa di avanzamento, come accade con l'interprete. L'interprete traduce istruzione per istruzione dal codice sorgente al linguaggio macchina, mentre il compilatore traduce esattamente le istruzioni del programma sorgente nelle corrispondenti istruzioni in linguaggio macchina. 1 Secondo l’approccio procedurale, vedasi in PARADIGMA DI PROGRAMMAZIONE. 3 Il linguaggio macchina è diverso a seconda del microprocessore (il tipo di CPU) presente nel calcolatore, per cui i programmi eseguibili (in linguaggio macchina) sono strettamente dipendenti dalla piattaforma hardware (oltre che dal particolare sistema operativo adottato). GENERAZIONI Teoricamente si è dimostrato che tutti i linguaggi non banali sono, dal punto di vista della capacità computazionale, equivalenti; in pratica un programma scritto in un certo linguaggio può sempre essere codificato in qualsiasi altro linguaggio. Il linguaggio deve essere non troppo difficile da imparare, deve essere possibile creare applicazioni in tempi ragionevoli, deve produrre eseguibili efficienti. I linguaggi di programmazione sono un sottoinsieme di quelli formali, essi possono essere definiti come il mezzo che ci permette di comunicare al computer la sequenza di operazioni da effettuare per raggiungere un obiettivo prefissato. Una prima distinzione tra i linguaggi di programmazione possiamo farla tra i linguaggi a basso e quelli ad alto livello. In genere si parla di programmazione a basso livello quando si utilizza un linguaggio molto vicino al funzionamento interno della macchina, mentre di programmazione di alto livello quando si utilizzano linguaggi più sofisticati ed astratti, slegati dal funzionamento fisico dello stesso elaboratore. Si viene così a creare una gerarchia di linguaggi, dai meno evoluti (il linguaggio macchina e l'assembler) a quelli più evoluti (PASCAL, FORTRAN, COBOL, PERL); I linguaggi di alto livello sono simili (esistono delle differenze) tra piattaforme differenti. Un grande problema è la portabilità del software da un piattaforma ad un'altra: Ø se le piattaforme sono uguali o compatibili si potrà distribuire il programma in formato eseguibile; Ø se le piattaforme sono incompatibili si dovrà distribuire il programma in formato sorgente. Si parla di “Generazioni di Linguaggi di Programmazione” col tacito consenso che un linguaggio di, p.es., terza generazione deve per forza essere “migliore” di uno di seconda: o I generazione: vi appartengono i cosiddetti linguaggi macchina espressi con sequenza di zeri e uni (es : 001011011011). Sono fortemente dipendenti dal particolare computer, infatti ogni processore utilizza un suo diverso linguaggio macchina. o II generazione è rappresentata dal cosiddetto linguaggio assembler , che sostituisce le sequenze binarie del linguaggio della prima generazione con lettere dell'alfabeto e numeri esadecimali (es : ADD 235H). Anche questo tipo di linguaggio rimane comunque molto dipendente dal tipo di processore e sempre di difficile comprensione per il programmatore. o III generazione sono linguaggi ad alto livello che godono di una certa indipendenza dal processore ( FORTRAN, COBOL, C, PASCAL ). All'interno di questa generazione si sono create alcune tendenze partite da linguaggi non molto strutturati a linguaggi più evoluti; tali linguaggi usano delle variabili per indicare la zona di memoria. o IV generazione - caratterizzati da una somiglianza ancora più spinta con il linguaggio naturale, la minore rigidità formale, l'uso di un'interfaccia utente- elaboratore più trasparente dei compilatori. Sono metalinguaggi che usano un insieme di programmi o altri metaprogrammi integrati in un tutto armonico e funzionale a certi scopi ristretti: Shell di UNIX, FORTH, ecc. 4 o V generazione - vi appartengono i linguaggi per l'intelligenza artificiale, sono quelli più vicini al linguaggio del programmatore (es: PROLOG). Generalmente, quando si parla di linguaggi di programmazione, si intende quelli di III generazione. Sembra che vi siano stati tre ambienti originanti, che hanno avuto pochi successi e molti fallimenti: o ambiente universitario tecnico/matematico: FORTRAN, ma anche ALGOL o ambiente universitario informatico: C, ma anche LISP, SNOBOL o comitati commerciali e militari: COBOL, ma anche PL/1. Sulla base dell'ambito in cui è necessario risolvere il problema di programmazione, è opportuno adottare un linguaggio piuttosto che un altro: Ø Calcolo scientifico: FORTRAN, C Ø Intelligenza Artificiale: PROLOG, LISP Ø Applicazioni gestionali: COBOL, SQL, C Ø Sistemi, device driver: ASSEMBLER,