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 utenteelaboratore 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, C
Ø Applicazioni su Web: PERL
Ø Applicazioni distribuite: C.
Va menzionata l'importanza storica del COBOL (COmmon Business Oriented Language),
per il fatto che e' stato un comitato a formalizzarlo, e questo ha stabilito un precedente per
la formazione di comitati, ed anche per il fatto che, grazie al supporto della IBM e degli altri
produttori di Mainframe, la diffusione e' stata globale e rapida.
PARADIGMA DI PROGRAMMAZIONE
Il significato scientifico del termine "paradigma" è relativamente recente :
"insieme di idee scientifiche collettivamente accettato per dare un senso al mondo dei
fenomeni".
Nel caso particolare dell’informatica si sente la necessità di distinguere fra diversi modi di
intendere la programmazione dato che non esiste un unico modello computazionale (il
classico Von Neumann) cui riferirsi. La questione si è posta già negli anni '60 con la
programmazione funzionale, ma il contributo più decisivo in questo senso è stato dato
probabilmente negli anni '70 dalla cosiddetta programmazione logica prima, e dal boom di
quella ad oggetti, dopo. Oggi i paradigmi di programmazione citati con una certa
frequenza sono almeno una decina, anche se non sempre sono chiari i loro confini o la
loro indipendenza. I paradigmi offrono una chiave di classificazione dei linguaggi: diremo
che un linguaggio afferisce ad un paradigma se consente di scrivere i programmi in
accordo ad esso.
Semplificando al massimo, possiamo limitarci a considerare due tipi di paradigmi di
programmazione :
Ø quelli di tipo dichiarativo che privilegiano il punto di vista per cui i programmi
devono essere delle specifiche eseguibili del problema. Ci si preoccupa cioè di
cosa risolvere; il "come" risolverli viene in qualche modo scaricato sull'esecutore del
linguaggio. In generale questo approccio comporta una certa inefficienza.
Ø quelli di tipo procedurale che privilegiano il punto di vista per cui i programmi sono
considerati alla stregua degli algoritmi. Ci si preoccupa quindi direttamente del
come risolvere il problema trascurando o sottointendendo le specifiche del
problema, cioè il "cosa".
I principali paradigmi di tipo dichiarativo sono quelli funzionale e quello logico, basati
rispettivamente sul concetto di espressione e di predicato.
5
I principali paradigmi procedurali sono quello imperativo e ad oggetti. Il paradigma di
programmazione imperativo è quello classico in cui rientrano i linguaggi macchina dei
comuni microprocessori e i linguaggi ad al alto livello più vecchi e diffusi come FORTRAN,
COBOL, BASIC, PASCAL. Quello ad oggetti è un'evoluzione di quello imperativo.
Entrambi i paradigmi sono infatti basati sul concetto di stato e sulla possibilità di
modificarlo attraverso l'esecuzione di comandi. Le differenze riguardano soprattutto la
"distribuzione" e le modalità per l'accesso dello stato complessivo .
Il paradigma di programmazione funzionale trova le origini storiche nel lambda-calcolo, il
linguaggio introdotto negli anni '30 dal matematico Alonzo Church come formalismo
universale e la cui caratteristica essenziale, ritrovabile anche in moderni linguaggi
funzionali, è che tutto è un'espressione, e come tale denota un valore ottenibile da un
processo di valutazione.
Il paradigma di programmazione logica si basa sull'idea di considerare i predicati logici del
primo ordine (ristretti ad una certa forma sintattica) come delle specifiche eseguibili. Negli
anni 60'-70' si è scoperto che ciò può avvenire in modo relativamente efficiente applicando
un'unica regola di inferenza, nota come principio di risoluzione (Robinson, 1960)2, poco
naturale per l'uomo, ma molto adatta per l'esecuzione automatica.
Rispetto alle normali computazioni, il "calcolo logico", ha le caratteristiche del cosiddetto
non-determinismo:
Ø può terminare con insuccesso
Ø può concludersi con più di un caso di successo
Rispetto alla varietà dei problemi e delle applicazioni concrete, ogni paradigma presenta
propri vantaggi e svantaggi. L'adozione di un linguaggio che metta a disposizione in modo
coerente un unico paradigma (linguaggio "puro") può comportare, in particolare, il ricorso a
tecniche oscure e/o inefficienti per sopperire alla mancanza di paradigmi diversi da quello
ospitato. In pratica si preferisce aggiungere caratteristiche "impure" a linguaggi già
esistenti che consentano di ospitare, almeno parzialmente, dei paradigmi "secondari"
rispetto a quello principale. A volte lo stesso scopo è raggiunto aggiungendo particolari
librerie. Ad esempio alcuni linguaggi ad oggetti mettono a disposizione delle librerie a
supporto della programmazione logica.
Un'altra soluzione, spesso adottata, è quella di interfacciarsi con altri linguaggi. Molti
PROLOG prevedono, ad esempio, l'interfacciamento con routine scritte in C o in PASCAL.
L'ideale sarebbe di disporre di linguaggi multiparadigma, cioè che consentano di applicare
il paradigma più adatto al sotto-problema che interessa "cucendo" poi le soluzioni con
appositi meccanismi di interfacciamento (integrazione) tra paradigmi.
Al momento esistono solo alcune proposte di ricerca e non sembra vicino il giorno in cui si
potrà contare su uno standard accettato e sufficientemente diffuso.
2
Principio di risoluzione(semplificato) dalla coppia di clausole (genitori) A
dedurre la clausola (risolvente) B or C.
or B, (not A) or C si può
6
CONFRONTO TRA LINGUAGGIO IMPERATIVO E FUNZIONALE
Imperativo
Funzionale
procedura
ciclo
test (if, case)
assegnamento
sequenzializzazione
array
Funzione
Ricorsione
espressioni condizionali, pattern matching
legame (param. formale-param. attuale)
composizione di funzioni
lista
CLASSIFICAZIONE
Classificazione linguaggi di programmazione
In
base
a
quanto
descritto
precedentemente
riportiamo
una
classificazione a livello concettuale
aggiungendo nuovi tipi di linguaggi
(applicativi, markup, scripting), che
per le loro caratteristiche possono
pensarsi “indipendenti” da quelli citati.
Nello schema proposto, i linguaggi
concorrenti, distribuiti e paralleli, sono
visti come “trasversali” ai tipi di
linguaggi presentati nei paradigmi
(imperativi,
ad
oggetti,
logici,
funzionali), intendendo per trasversale
una nuova dimensione di sviluppo che
aggiunge
ai
tipi
già
presenti
caratteristiche specifiche ulteriori.
Ø IMPERATIVI (PROCEDURALI): Il modello computazionale è basato sui
cambiamenti di stato della memoria della macchina. E’ centrale il concetto di
assegnazione di un valore ad una locazione di memoria. Il compito del
programmatore è costruire una sequenza di assegnazioni che producano lo stato
finale (in modo tale che questo rappresenti la soluzione del problema).
Ø PARALLELI: consentono di realizzare tutti quei programmi che possono essere
eseguiti in parallelo.
Ø CONCORRENTI: consentono di eseguire tutti quei programmi che entrano in
competizione per l’uso di una data risorsa.
Ø DISTRIBUITI: linguaggi largamente diffusi grazie allo sviluppo delle reti di
calcolatori e di Internet che possono essere visti come ambienti di calcolo globali.
Tali linguaggi devono offrire la possibilità di esprimere naturalmente nozioni di
località, capacità, sicurezza e velocità.
Ø FUNZIONALI (DICHIARATIVI): il programma è considerato come il calcolo del
valore di una funzione; in un linguaggio funzionale puro l'assegnazione esplicita
risulta addirittura completamente assente (si utilizza soltanto il passaggio dei
parametri). In tale modello rivestono particolare importanza la ricorsione, in pratica
7
Ø
Ø
Ø
Ø
Ø
l'utilizzo di funzioni che richiamano se stesse e, come struttura dati, la lista
(sequenza ordinata di elementi).
APPLICATIVI: progettati per andare incontro a richieste specifiche.
LOGICI (DICHIARATIVI): hanno come obiettivo la possibilità di eseguire le
specifiche direttamente, senza bisogno di raffinarle trasformandole in descrizioni
procedurali di più basso livello. Il modello computazionale è basato sui concetti di
funzione e relazione. Il programmatore non ragiona in termini di assegnazioni di
valori, ma di relazioni di entità e di valori di una funzione.
SCRIPTING: tipo di codice che può essere eseguito direttamente da un programma
(interprete) in grado di interpretare il linguaggio con cui è stato creato lo script. Non
è necessario compilare gli script per poterli eseguire.
MARKUP: lavorano su dati (di solito testi, o comunque materiale destinato alla
visualizzazione) dei quali specificano la funzione o il ruolo attraverso etichette,
denominate tag.
AD OGGETTI: metodo che porta ad architetture software basate sugli oggetti
manipolati da sistemi (ed anche da sottosistemi) software, piuttosto che su
architetture basate sulle funzioni che questi oggetti devono svolgere.
8
LINGUAGGI IMPERATIVI PROCEDURALI
Il nome di linguaggio imperativo o statement oriented (orientato al comando, all’istruzione)
deriva dal ruolo dominante in essi attribuito alle istruzioni imperative. L’azione unitaria in
un programma scritto in questo linguaggio è l’istruzione gli effetti delle singole istruzioni si
combinano per raggiungere i risultati desiderati. Esempi di linguaggi di programmazione
imperativi sono: BASIC, COBOL, FORTRAN, PASCAL. I linguaggi imperativi sono
strettamente legati al modello architetturale della macchina (Von Neumann) e
quest’influenza si può vedere in tre caratteristiche comuni:
1. Variabili3
2.
Assegnamento4
3. Iterazione5
Alla classe dei linguaggi imperativi appartengono quelli basati sulla nozione di istruzione di
macchina e di memorizzazione di valori in celle di memoria (linguaggi imperativi di basso
livello).
Un programma scritto in linguaggio macchina è costituito da un elenco di istruzioni che
l’elaboratore esegue in sequenza e che realizzano tre diversi tipi di operazioni :
1. il trasferimento di dati in unità centrale e memoria;
2. le operazioni aritmetiche eseguibili dall’unità di calcolo;
3. l’alterazione della normale sequenza di esecuzione delle istruzioni per mezzo
di salti (condizionati o meno) o con l’arresto del programma.
Anche nei linguaggi imperativi di alto livello si ritrovano i concetti su cui è basato il
linguaggio macchina. Infatti, le variabili sono astrazioni della cella di memoria e l’istruzione
di assegnazione corrisponde al trasferimento di un valore in memoria.
Dal punto di vista della strutturazione dei dati in un linguaggio imperativo il programmatore
ha a disposizione un insieme di tipi di dato primitivi e di meccanismi di composizione che
gli consentono di organizzare in modo agevole i dati relativi al suo problema.
Per quanto riguarda la strutturazione del controllo sono presenti un insieme di primitive
come l’iterazione e la selezione che, consentono la realizzazione di qualsiasi flusso di
controllo, definiscono in modo chiaro e leggibile la sequenza delle istruzioni da eseguire.
3 VARIABILI.
Un componente fondamentale dell'architettura di Von Neumann è la memoria, formata da una grande
quantità di celle che contengono i dati. Ogni cella ha un nome (l'indirizzo) che serve per individuarla
univocamente e ritrovare le informazioni in essa memorizzate. La necessità di dare un nome ad ogni cella è
più evidente se si programma in linguaggio assemblatore; i valori memorizzati in ogni cella sono accessibili
facendo riferimento al nome della cella desiderata. Nei linguaggi ad alto livello le nozioni di cella di memoria
e nome sono rappresentate dal concetto di variabile, forse il più importante nei linguaggi di programmazione.
Una variabile di un programma è essenzialmente una cella di memoria con un nome in cui sono memorizzati
dei valori. Così, anche se il nostro scopo, nella programmazione, è quello di produrre dei valori, non ci
limitiamo a questi, ma trattiamo anche delle celle in cui risiedono. I problemi come effetti collaterali e aliasing
sorgono proprio dall'esistenza delle variabili.
4 ASSEGNAMENTO.
Strettamente legata all'architettura della memoria è la nozione che ogni valore calcolato deve essere
«memorizzato», cioè assegnato a una cella. Ciò spiega la grande importanza dell'istruzione di
assegnamento nei linguaggi di programmazione. Le nozioni di basso livello di cella di memoria e
assegnamento permeano tutti i linguaggi di programmazione, e forzano il programmatore ad adottare uno
stile di pensiero modellato sui dettagli dell'architettura di von Neumann.
5 ITERAZIONE.
Un programma in un linguaggio imperativo di solito porta a termine il compito affidategli eseguendo
iterativamente una sequenza di passi elementari. Anche questo deriva dall'architettura di von Neumann, in
cui le istruzioni sono immagazzinate nella memoria; l'unico modo di realizzare qualcosa di complicato è la
ripetizione di una sequenza di istruzioni.
9
Questo tipo di linguaggi esprime come computare i risultati di un dato problema (linguaggi
procedurali). Si basa, essenzialmente, sulle procedure le quali a differenza delle funzioni
possono modificare l’istanza in ingresso. In questi linguaggi è posta maggior enfasi sulle
procedure (viste come scatole nere capaci di manipolare dati) rispetto ai dati. I linguaggi
procedurali sono modellati secondo i diagrammi di flusso che mostrano il passaggio dei
dati nel sistema da una procedura ad un'altra.
Esistono sei istruzioni fondamentali che caratterizzano i linguaggi procedurali:
1. Assegna: assegna ad una variabile (ad una locazione di memoria) il valore di
una espressione.
2. Leggi: legge in input dall'esterno un valore e lo memorizza in una variabile
(locazione di memoria).
3. Scrivi: scrive in output il valore di una espressione o di una variabile (locazione
di memoria).
4. Se... allora... altrimenti...: modifica il "flusso" del programma sulla base del
valore di una espressione logica.
5. Vai al passo...: modifica il "flusso" del programma incondizionatamente.
6. Fermati: termina l'esecuzione del programma.
Hanno riscontrato notevole successo nelle applicazioni scientifiche (es. calcolo equazioni
differenziali algebra lineare ecc.…).
I limiti di questi linguaggi sono:
Ø richiedono in ogni caso al programmatore di "pensare come il calcolatore", ovvero
di modellare il problema in base al modo di lavorare della macchina
Ø le procedure lavorano sugli stessi dati: questo può portare a problemi in fase di
manutenzione perché l’aggiornamento di una procedura può richiedere
l’aggiornamento dell’intero programma
Esempi di linguaggi imperativi procedurali:
ABC, ALEF, ALGOL, APL, APPLE SCRIPT, ASSEMBLY, BASIC, BCPL, C, CLU, CMS,
COBOL, CORAL, CPL, CT, FORMAC, FORTH, FORTRAN, ICI, ICON, IDL, INTERCAL,
JCL, JOVIAL, LIMBO, MESA, MODULA 2, MODULA 3, MUMPS, OBERON, PASCAL,
PILOT, PL/1, PROGRAPH, RUBY, SETL, SML, SNOBOL, TCL.
LINGUAGGI PER LA PROGRAMMAZIONE PARALLELA
Rientrano in questa categoria tutti quei linguaggi ottimizzati per la programmazione
parallela, ossia la possibilità di eseguire contemporaneamente più programmi (o più parti
dello stesso programma). Si prestano ad architetture di macchina evolute (o sistemi più
complessi come reti di calcolatori), in possesso cioè di più processori (ad esempio) da
assegnare a ciascun task (processo). E’ usuale, parlando di linguaggi paralleli, ritrovare
concetti di:
Ø multiprocessing: che possono essere eseguiti su macchine con processori
separati ma con la condivisione della memoria.
Esempi di linguaggi per la programmazione parallela:
ALEF, ALGOL68, C*, CILK, OCCAM.
LINGUAGGI CONCORRENTI
Sono linguaggi ottimizzati per la programmazione concorrente di piattaforme o sistemi che
dispongono di risorse limitate (processore), o in cui i task entrano in concorrenza per il
possesso della risorsa.
I linguaggi concorrenti differiscono da quelli paralleli anche dal modo in cui sono
creati/sincronizzati i processi ed in base alla modalità di interazione/sincronizzazione degli
stessi. E’ usuale, parlando di linguaggi concorrenti, ritrovare concetti di:
10
Ø multiprogramming: che possono
processore.
Esempio di linguaggio concorrente:
CONCURRENT PASCAL, SR.
essere
eseguiti
con
la
condivisione
del
LINGUAGGI DISTRIBUITI
La ricerca nell'ambito dei sistemi distribuiti ha ricevuto nuovo impeto dallo sviluppo, sia
tecnologico che di mercato, delle reti telematiche. Internet è la più diffusa e popolare di tali
reti, e rappresenta il più grande sistema distribuito mai costruito. I suoi protocolli di
comunicazione, permettono di astrarre strutture informative globali a partire da insiemi
eterogenei di calcolatori e di sottoreti. Per esempio, il protocollo FTP realizza un file
system globale, il protocollo Telnet realizza un multiprocessore globale, e il protocollo
HTTP realizza un dominio globale di ipertesti (il World Wide Web). Ben presto è sorta
l'esigenza di rendere programmabili tali strutture informative globali, cioè di utilizzarle
come “global computer”. Mentre i calcolatori tradizionali collegati in rete sono “semplici”
dispositivi di calcolo autonomi che accedono a risorse locali ed occasionalmente
comunicano tra loro, i global computer costituiscono piuttosto una piattaforma di calcolo
globale, integrando e coordinando risorse sia locali che remote. Essi possiedono sia le
caratteristiche dei sistemi distribuiti (distribuzione delle componenti, concorrenza,
mancanza di uno stato globale, e asincronia dei cambiamenti di stato locali), che quelle
dei sistemi aperti (eterogeneità e autonomia delle componenti, cambiamento dinamico
della configurazione del sistema, mobilità di programmi e dati). Le problematiche poste da
questi tipi di sistemi sono da una parte la “mobilità del codice” che caratterizza una nuova
generazione di applicazioni distribuite e dall'altra il coordinamento di componenti
distribuite. In letteratura sono stati proposti dei linguaggi di programmazione di nuova
concezione, generalmente chiamati Mobile Code Languages (MCLs), dotati di meccanismi
che permettono mobilità del codice e riconfigurazione a tempo d'esecuzione del legame
tra componenti software dell'applicazione e la loro locazione fisica nella rete. Resta aperto
il problema di definire un contesto linguistico uniforme ed espressivo dove poter descrivere
sia politiche di coordinamento che componenti quali dati, capaci quindi di essere
trasmessi, elaborati ed eseguiti su nodi distinti della rete. Contributi in questa direzione
sono stati proposti recentemente.
Esempi di MCLs sono: telescript (general magic 1996), il primo linguaggio basato su
codice mobile, Java (linguaggio ad oggetti Sun 1994), che permette la programmazione di
applicazioni per il WWW, Obliq (linguaggio ad oggetti Luca Cardelli, 1993), che permette
la costruzione di uno stato “distribuito” sui nodi di una rete; Agent Tcl, che estende il
linguaggio di scripting Tcl permettendo la mobilità di codice che è eseguito con garanzie di
sicurezza. 6
Esempi di linguaggi distribuiti:
ERLANG, LIMBO, MUMPS, REBOL.
LINGUAGGI FUNZIONALI (DICHIARATIVI)
Un linguaggio di programmazione funzionale si basa sulle proprietà matematiche delle
funzioni.
Esso è caratterizzato dalle seguenti componenti:
§ un insieme di funzioni primitive7,
§ un insieme di forme funzionali8,
6
TELESCRIPT, JAVA, OBLIQ, AGENT TCL sono orientati agli oggetti e per tanto non sono presi in ulteriore
considerazione.
7 Le funzioni primitive sono predefinite dal linguaggio e applicabili direttamente.
11
§
§
l’operazione di applicazione9,
un insieme di strutture dati10.
La scarsa varietà di tipi di dati disponibili è una caratteristica dei linguaggi di
programmazione funzionali; sono pochi, ma hanno una struttura semplice e regolare.
L'essenza della programmazione funzionale è la definizione di nuove funzioni tramite le
forme funzionali. Oltre ai quattro componenti visti, un linguaggio funzionale fornisce anche
un meccanismo per collegare un nome alle nuove funzioni definite dall'utente. Questa
caratteristica, peraltro non essenziale, influisce sul modo di usare linguaggio, evitando di
dover ripetere la definizione di una funzione ogni volta che la si applica. Lo stile di
programmazione offerto dai linguaggi di programmazione funzionali basato sulle funzioni
matematiche non è legato alla particolare architettura di macchina, è quindi
completamente diverso da quello dei linguaggi imperativi (basati sul modello di Von
Neumann).
I linguaggi funzionali, per dirsi veramente tali, devono prevedere le funzioni di ordine
superiore: accettare funzioni come argomento, restituire funzioni come risultato e
incorporare le funzioni nelle strutture dati. Queste possibilità, previste con certe limitazioni
anche in altri paradigmi, consentono spesso di ottenere del codice con sorprendenti
caratteristiche di eleganza e di generalità. Occorre tenere presente che i moderni linguaggi
funzionali prevedono la lazy evaluation ("valutazione pigra" o non-strict) cioè la possibilità
di ritardare la valutazione degli argomenti attuali di una funzione fino al momento in cui
essi si rendono effettivamente necessari.
La parola "funzionale" si deve al fatto che ogni simbolo di operazione che compare in
un'espressione corrisponde ad una funzione, sia nel senso matematico del termine che in
quello informatico ("sottoprogramma che restituisce un valore"). Le espressioni e i
sottoprogrammi funzionali sono del resto presenti anche nei primi linguaggi procedurali. Il
risultato è quello di avere dei programmi che godono della seguente proprietà, nota come
"sostituibilità di uguali con uguali" nel tradizionale ambito algebrico: “in una espressione H
si possono sempre sostituire le occorrenze di una sottoespressione E con il suo valore V
senza che cambi il valore di H.”
Per il fatto che i linguaggi funzionali sono basati sul concetto di funzione matematica e su
quello di applicazione ad una funzione di argomenti , essi sono spesso indicati linguaggi
“applicativi”. In questa classificazione per linguaggio applicativo si è inteso un significato
diverso, ossia riferito ad applicazioni di sviluppo e per linguaggio funzionale il linguaggio
funzionale per antonomasia: il LISP (In origine il LISP conosciuto come LISP puro, era
completamente funzionale. Per aumentare l’efficienza in esecuzione, però, nelle attuali
versioni del linguaggio sono state inserite caratteristiche non funzionali.).
Il LISP è un buon esempio di come poche e semplici primitive unite a potenti possibilità di
strutturazione dei dati, possano portare a un linguaggio allo stesso tempo potente ed
elegante.
Esempi di linguaggi funzionali:
APL, AUTOLISP, AWK, BEFUNGE, BLISS, CHARITY, CPL, ERLANG, EUPHORIA,
FORMAC, HASKELL, IDL, LISP, LOGO , MIRANDA, ML, POP, REBOL, SCHEME, SML,
SUPERLOGO.
8 Le forme funzionali sono tutti quei meccanismi che si possono utilizzare per combinare funzioni e crearne
di nuove.
9 L’operazione di applicazione è il meccanismo predefinito che permette di applicare una funzione ai suoi
argomenti e ottenere un risultato.
10 Le strutture dati rappresentano tutti i possibili elementi degli insiemi dominio e condominio di ogni
funzione.
12
LINGUAGGI APPLICATIVI
Come già detto precedentemente, non intendiamo per programmi applicativi il sinonimo
dei linguaggi funzionali (come molti testi e varie fonti riportano) bensì tutti quei programmi
nati o meglio sviluppati per usi specifici.
In genere i programmi applicativi hanno delle proprie funzioni. Alcune di queste richiedono
di eseguire un certo numero di istruzioni in sequenza. Se tale sequenza è di uso molto
comune, un modo per renderne più comodo e rapido l'accesso consiste nel creare delle
macroistruzioni. Una macroistruzione o macro è una sequenza di istruzioni memorizzate in
un singolo comando. Questo comando è a tutti gli effetti un programma interpretato vero e
proprio. La differenza tra questo e un programma eseguibile è che le istruzioni del
programma eseguibile sono comprensibili direttamente al processore, mentre le istruzioni
della macro sono comprensibili al programma applicativo o al sistema operativo.
I macrolinguaggi sono la forma in cui le macro sono espresse, per poter essere
memorizzate in un file. L'interprete del macrolinguaggio è il programma applicativo stesso
(o anche il sistema operativo). Esso avrà un comando particolare, esegui macro, che
avvierà l'interpretazione. Altri macrolinguaggi sono dei veri e propri linguaggi di
programmazione tradizionali, estesi con i comandi del programma applicativo. Per
esempio, i programmi applicativi di Microsoft Office possono tutti eseguire macro scritte in
Visual Basic for Applications o VBA11
Esempi di linguaggi applicativi:
ACSL, AMOS, AUTOLISP, AWK, GPSS, GUILE, ICON, IDL, LOGO, LUA, MATLAB,
OCTAVE, PILOT, RPG, SNOBOL, SQL, SUPERLOGO, TEX, VERILOG, VHDL.
LINGUAGGI PER LA PROGRAMMAZIONE LOGICA (DICHIARATIVI)
I linguaggi di programmazione dichiarativi nacquero con lo scopo primario di permettere di
definire le specifiche di un problema. Alcuni di questi linguaggi furono concepiti con il solo
scopo definitorio, senza dunque fornire la possibilità di esecuzione del codice. Altri invece
nacquero e si evolvettero come linguaggi di programmazione veri e propri, in grado ovvero
di eseguire effettivamente la specifica fornita, e di permettere in breve tempo e con bassi
costi di avere in mano un prototipo che realizzi fin da principio il funzionamento del
prodotto software finale.
La programmazione logica, nella sua accezione più semplice, si può descrivere nel
seguente modo: il programmatore dichiara (linguaggio dichiarativo) semplicemente i fatti e
le proprietà che descrivono il problema da risolvere. Queste informazioni sono poi usate
dal sistema per risolvere il problema (per inferire una soluzione), senza che siano
necessari aiuti o consigli su come gestire le informazioni fornite. Per descrivere il problema
si usa un formalismo di tipo logico, come per esempio il calcolo dei predicati (detti anche
asserzioni).
Il linguaggio opera per mezzo di comandi descrittivi relativamente ai dati e per mezzo di
relazioni tra i dati. L’algoritmo è nascosto dalla semantica del linguaggio, consistente di
istruzioni che specificano l'obiettivo desiderato.
Per esempio scrivendo “3 = x + 2”, l’equazione è una condizione che x deve rispettare.
L'interprete (in questo caso sarà un programma di soluzione di equazioni) deve trovare da
solo il valore da assegnare a x.
Il programma è considerato come la dimostrazione della verità di una asserzione; il
sorgente è costituito da una sequenza di asserzioni, di fatti e regole. Non è necessario
indicare esplicitamente il flusso di esecuzione, ma dato un obiettivo di partenza (il goal) è il
sistema che cerca di individuare i fatti e le regole rilevanti. Il fatto che vi sia una netta
11 VBA è un vero linguaggio Basic. È esteso con l'aggiunta di istruzioni per la programmazione sotto
interfaccia grafica (quindi è Visual). Infine, è esteso con l'aggiunta di istruzioni per l'esecuzione dei comandi
specifici di ciascun programma applicativo, p.es. Word o Excel (quindi è for Applications).
13
separazione tra la parte dichiarativa (il cosa fare) e la parte procedurale (il come) rende un
programma scritto in un linguaggio logico particolarmente leggibile. I linguaggi logici
risultano particolarmente adatti a risolvere problemi che riguardano entità e le loro
relazioni. Nelle normali applicazioni risultano essere di difficile utilizzo, anche perché
comportano un modo di programmare completamente diverso dal solito. L'esemplare più
noto di questa famiglia è il PROLOG (PROgramming in LOGic).
Altri linguaggi logici:
MERCURY
LINGUAGGI DI SCRIPTING
Uno script è un normale file di testo che contiene una sequenza di comandi (istruzioni) che
saranno eseguiti da una shell (interprete).
Nella classificazione proposta, si intende per linguaggi di scripting tutti quei linguaggi
aventi la caratteristica comune di scrivere degli script in base alla definizione appena data.
Per tale motivo molti tipi di linguaggi, che trovano in altre classificazioni la loro
“indipendenza”, sono qui visti come scripting. Molti linguaggi definiti come scripting
possono essere classificati mediante i paradigmi precedentemente proposti in base alla
filosofia procedurale o dichiarativa che seguono. In genere quando si parla di linguaggi di
scripting, si intendono quei linguaggi di ausilio per applicazioni Web o interazione con
database. Di linguaggi scripting ne esistono parecchi, alcuni più simili a veri e propri
linguaggi di programmazione, altri meno articolati. Il PERL, ad esempio, è il tipico caso di
linguaggio complesso, ma molto efficace, utilizzato per la creazione di cgi (common
gateway interface.
Esempi di linguaggi di scripting:
APPLE SCRIPT, CSH, GUILE, ICI, JCL, LUA, PERL, PHP, SCHEME, TCL.
LINGUAGGI MARKUP
Il codice sorgente di un linguaggio di markup contiene delle istruzioni per definire il ruolo
delle parti del testo (markup) da visualizzare contrassegnando il testo per mezzo di alcuni
elementi che prendono il nome di tag. Ad esempio in HTML attraverso questi elementi e
relativi attributi è possibile formattare un testo e trasformarlo in ipertesto.
L’esempio più tipico di questi linguaggi è HTML (Hypertext Markup Language).
Esempi di linguaggi di markup:
HTML, MUMPS, SGML, XML.
14
I VARI LINGUAGGI
ABC
Linguaggio imperativo originariamente progettato per essere un sostituto del BASIC. ABC
è adatto alla programmazione generale di tutti i giorni. Non è un linguaggio di
programmazione di sistema. E' un ottimo linguaggio di insegnamento, e poiché è
interattivo è eccellente anche per la creazione di prototipi. E' molto più veloce dello UNIX
'bc' per fare calcoli.
I programmi ABC sono tipicamente molto compatti, circa un quarto della dimensione
dell'equivalente programma in PASCAL o in C. Tuttavia, questo non va a scapito della
leggibilità del programma, ma al contrario. ABC è semplice da imparare per il piccolo
numero (5) di types nel linguaggio. I 5 types sono:
1. numeri: di lunghezza illimitata;
2. testi(stringhe): di lunghezza illimitata;
3. composti: record senza nomi di campo;
4. liste: insieme scelto di uno qualunque dei types di items (bags o multi-sets);
5. tavole: arrays generalizzati con uno dei type di chiave, uno dei type di items
(mappings finiti).
ACSL
(Advanced Continuous Simulation Language) Linguaggio applicativo per simulazioni di
tipo matematico creato nel 1981 dalla Mitchell and Gauthier Associates. Inizialmente fu
implementato come semplice preprocessore del FORTRAN per il modellamento di sistemi
continui. L'ACSL è stato usato sino al 1990. Il linguaggio è un misto di elementi di
specificazione di sistema e blocchi di processing procedurale. I nuovi prodotti ACSL
presentano una nuova visuale front-end ma usano ancora sintassi come quella del
FORTRAN per i loro stessi programmi. L'ACSL è un linguaggio di proprietà della MSA
Software.
ALEF
Linguaggio di programmazione strutturato a blocchi creato intorno al 1995 da P.
Winterbottom per conto dei Laboratori Bell di Lucent. E’ un linguaggio compilato per la
programmazione simultanea in apparenza simile al C, progettato per lo sviluppo di
applicazioni network sotto il sistema operativo PLAN 9. I data types supportati da ALEF
includono interi, reali, chars, stringhe, tuples, strutture, unioni, arrays, e canali di varie
dimensioni. Il linguaggio supporta la definizione di data types astratti, ADT parametrizzati e
funzioni. I costrutti di controllo dell'ALEF includono un vasto insieme di condizionali, goto,
e dichiarazioni di loop, cosi come sistemi di handling error e sincronizzazione di lavori
paralleli. ALEF è anche caratterizzato da un unico statement di tail recursion (ricorsione di
coda). ALEF è stato allargato ad una larga varietà di hardware tramite il sistema operativo
PLAN 9, e anche allo SGI IRIX. Il sistema di sviluppo del linguaggio ALEF è disponibile
come parte della distribuzione del PLAN 9.
ALGOL
(ALGOrithmic Language, linguaggio algoritmico)
Il primo linguaggio rivolto alla programmazione strutturata fu introdotto nel 1958, era stato
concepito come linguaggio di programmazione universale, in grado cioè di poter essere
usato su tutti i computer. Alla prima versione, l'ALGOL 58, seguì due anni dopo quella
definitiva, l'ALGOL 60. Uscirà anche l'ALGOL 68, ma oggi si può considerare questo
linguaggio praticamente scomparso. Con le sue strutture di controllo del flusso di gestione
e l'articolazione del programma in blocchi funzionali autonomi, diventò lo standard di
15
riferimento per il confronto dei linguaggi successivi. E' considerato il precursore del
PASCAL.
ALGOL 68
ALGOL68 è un linguaggio strutturato a blocchi creato tra gli anni 1965-68 da A. Van
Wijngaarden. ALGOL68 era una versione largamente estesa ed arricchita del linguaggio
strutturato a blocchi ALGOL. Molte capacità furono aggiunte al framework del suono
dell'ALGOL60 per creare un linguaggio più efficace per applicazioni generali e
programmazione di sistemi. L'ALGOL68 introduceva un vasto numero di nuove
caratteristiche rispetto alle precedenti versioni: sintassi e semantica formalizzate, costrutti
per la programmazione parallela, nuovi data types e metodi di strutturazione, e
dichiarazione di type. I primitivi data types supportati dall'ALGOL68 includono booleani,
interi, reali, numeri complessi e richiami. Gli arrays dinamici, le strutture, e le unioni sono
disponibili la costruzione strutture dati complesse. ALGOL68 supporta inoltre moduli di
compilazione separati, come faceva l'ALGOL60. Come il suo antenato, anche l'ALGOL68
è fortemente tipizzato. Esistono poche implementazioni dell'ALGOL68 oltre a vari suoi
dialetti, inclusi alcuni per PC e mainframes.
AMOS
L'AMOS è un dialetto BASIC per computer AMIGA che cerca di catturare, attraverso il suo
vocabolario, un certo numero di quelle funzioni che potrebbero essere necessarie nella
creazione di giochi o nel software multimediale. Tra le proprietà principali del linguaggio vi
sono sicuramente la flessibilità, l'immediata accessibilità alla maggior parte delle risorse
del computer e la facilità con la quale si impara.
APL
Nel 1961 la IBM realizza la versione completa del linguaggio "APL" (Aprogramming
Language) inizialmente utilizzato per la soluzione di problemi matematici a livello
scolastico. Successivamente viene adottato dalle principali compagnie aeree per la
programmazione degli orari e di percorsi di volo.
APPLE SCRIPT
E’ un linguaggio di scripting sviluppato per Macintosh. E’ in grado di “capire” frasi in
italiano o in altre lingue, può tradurre automaticamente da un dialetto (lingua) ad un altro.
APPLESCRIPT, per le sue caratteristiche, è utile a tutti gli utenti Macintosh se accoppiato
con Finder.
ASSEMBLY
Il linguaggio macchina, il primo utilizzato in ordine cronologico, non richiede interventi
aggiuntivi tra programmatore ed elaboratore: le istruzioni vengono redatte in modo che la
CPU possa decodificarle ed eseguirle direttamente. Un programma in linguaggio
macchina è costituito da una serie di 0 e 1. Le difficoltà di questo metodo di
programmazione sono legate alla difficoltà di correggere un listato che è poco leggibile al
programmatore stesso, il quale è inoltre costretto a sapere i codici delle istruzioni e degli
indirizzi di memoria che vanno calcolati. Ogni operazione viene scritta in termini di
istruzioni elementari della CPU e i testi dei programmi sorgente si allungano a dismisura.
Per superare queste difficoltà è nato l'Assembler, linguaggio di programmazione di
seconda generazione. E' un linguaggio simbolico, in cui le istruzioni sono rappresentate da
nomi che richiamano una parola inglese e i dati sono identificati da lettere assegnate a
campi di memoria centrale. L'Assembler è un linguaggio orientato alla macchina e per
programmare è necessario conoscere a fondo la struttura dell'elaboratore; inoltre, il
16
rapporto tra istruzioni Assembler e istruzioni di CPU è in genere 1:1 e il programma
Assembler deve essere quindi molto dettagliato.
AUTOLISP
L'AUTOLISP nasce alla fine degli anni'80 come dialetto del LISP e come linguaggio esteso
all'applicazione AutoCAD(tm) e altri programmi Autodesk. Era in origine supportato
solamente dalle versioni 11-13 di AutoCAD. In aggiunta alle normali caratteristiche del
LISP, AUTOLISP offre molte facilitazioni per la manipolazione degli oggetti nel disegno
CAD e più in generale nei files CAD, e per l'interazione con l'utente attraverso l'interfaccia
AutoCAD. AUTOLISP è molto popolare tra la comunità di utilizzatori di Autodesk.
AWK
Il nome AWK deriva dalle iniziali dei suoi tre inventori originali, Aho, Weinberger e
Kernighan, tutti personaggi abbastanza famosi nel campo della computer-science. L'idea
che sta alla base di AWK è quello di elaborare una riga alla volta dei files di input,
eseguendo azioni diverse a seconda che la riga stessa soddisfi certe condizioni o
contenga certi patterns. I programmi scritti in AWK sono strutturati un po' diversamente
rispetto a quelli dei linguaggi tradizionali. Non esiste infatti un inizio e una fine del
programma stesso, e non è necessario dichiarare le variabili, gestire tutta la solita trafila
dell'I/O e del parsing dei dati. A tutto questo ci pensa automaticamente AWK. Quello che
resta da fare al programmatore è solamente specificare come devono essere elaborati i
dati di input a seconda dei vari patterns in essi contenuti. Un programma AWK è quindi
costituito solamente da una lista di regole composte da un pattern ed una corrispondente
azione da eseguire se il pattern è soddisfatto. La potenza di AWK rispetto ad altri
strumenti simili (grep, sed, cut, ecc.) è la possibilità di definire delle azioni completamente
arbitrarie da effettuare sui dati di input utilizzando un vero linguaggio di programmazione,
senza tuttavia essere costretti a dover gestire tutte le complicazioni tipiche dei linguaggi
tradizionali. Il linguaggio di AWK è inoltre dotato di un ricco insieme di funzioni di base, fra
cui quelle per la gestione di pattern matching ed espressioni regolari, e permette di gestire
in modo molto semplice stringhe ed array associativi. È infine possibile definire delle
proprie funzioni, come in qualsiasi linguaggio di programmazione che si rispetti, ed e'
sempre possibile richiamare un programma esterno quando non si è in grado di fare una
cosa direttamente con AWK.
BASIC
(Beginner's All-purpose Symbolic Instruction Code, codice di istruzioni simboliche per
principianti adatto per tutte le applicazioni)
Sviluppato nel 1964 da un gruppo di ricercatori coordinati dai due insegnanti John Kamey
e Thomas Kurtz del Dartmouth College, nel New Hampshire, come strumento per
l'insegnamento della programmazione, è un linguaggio di tipo conversazionale, ovvero
fortemente interattivo con l'utente. Permette di avvicinarsi alla programmazione senza
particolare sforzo, anche a chi è privo di conoscenze nel settore dell'informatica. La
semplicità di apprendimento e di uso, unita ad una grande adattabilità a diversi tipi di
applicazioni, giustificano la sua grande diffusione.
BCPL
Nel 1963, in Inghilterra, durante un progetto che coinvolgeva ricercatori di Cambridge e
dell'Università di Londra, fu sviluppato un linguaggio chiamato CPL, cioè "Combined
Programming Language''. CPL era basato su ALGOL 60, uno dei primi linguaggi di
programmazione moderni ben definiti. Quattro anni più tardi, nel 1967, un programmatore
di Cambridge, Martin Richards, creò BCPL, ``Basic CPL'' e BCPL diede origine a un altro
17
linguaggio, che divenne noto con la singola lettera B. Il linguaggio B fu ripreso ai
Laboratori Bell, dove Ken Thompson e Dennis M. Ritchie lo modificarono e lo
ridenominarono NB. All'inizio degli anni '70, Thompson utilizzò NB per riscrivere la parte
basilare di Unix per la seconda edizione. Poco tempo dopo, a partire dall'NB, Ritchie
sviluppò il C, che divenne presto il linguaggio per scrivere nuove utility e applicazioni oltre
al Sistema Operativo. Questo nuovo linguaggio, oltre ad essere ad alto livello e strutturato,
offriva costrutti che permettevano di manipolare i bit e i byte e di interagire direttamente
con l'hardware. Concepire un linguaggio di programmazione completamente nuovo non
avrebbe permesso di avvalersi direttamente dei pregi dell'esistente e non avrebbe
garantito il superamento di tutti i difetti; inoltre avrebbe richiesto molto più tempo.
BEFUNGE
BEFUNGE è stato creato da Chris Pressey nel 1993. BEFUNGE è un linguaggio di
programmazione interpretato di basso livello che usa un unico modello dati e un insieme di
istruzioni per realizzare computazioni su una griglia di coordinate. Il modello di macchina
BEFUNGE ipotizza l'esistenza di uno stack di pushdown, e una griglia di celle
bidimensionale. Ogni cella può contenere un numero di dati, che può essere trattato come
un istruzione o come dato a seconda dell'esecuzione del programma. “L'Instruction
Pointer" può muoversi in ognuna delle quattro direzioni: su, giù, destra, sinistra. L'insieme
delle istruzioni del BEFUNGE include la manipolazione dello stack, aritmetica, una
rudimentale I/O, rami condizionali (sia in verticale che in orizzontale) e molte altre
operazioni. Nel BEFUNGE-93 la dimensione della griglia era fissata: 80x24, ma il
BEFUNGE-97 consente una dimensione di griglia indefinita.
BLISS
Il BLISS è un linguaggio di programmazione strutturato a blocchi nato verso il 1970 alla
DEC, Digital Equipment Corp. BLISS è in linguaggio procedurale di basso livello
sviluppato e usato dalla DEC per il system programming. E’ Largamente usato dalla DEC
per lo sviluppo di software OS, strumenti per PDP, DECsystem, linee VAX per computers
approssimativamente tra gli anni 1971-1988. Non è più stato così largamente usato.
BLISS supporta vari data types, ma non per questo rafforza il type checking. Possiede un
potente macro sistema che veniva pesantemente usato nel system coding, ma che
rendeva più difficile il compito del compilatore di questo linguaggio. Poiché è stato
concepito come un linguaggio di programmazione di sistema, possedeva delle
caratteristiche che consentivano al programmatore di fare ciò che veniva inteso come il
lavoro del compilatore negli anni '90: allocazione dei registri, definizione dei data structure
packing, etc.
C
Creato da Dennis M. Ritchie nel 1972 durante lo sviluppo dell'UNIX, è un linguaggio
strutturato per la programmazione di sistemi (compilatori, sistemi operativi, ecc.) Pur
essendo un linguaggio di alto livello, è in grado di controllare anche le operazioni più
elementari di una macchina. E' derivato dal linguaggio BCPL (Basic Combined
Programming Language).
C*
Il C* è un tipo di linguaggio per la programmazione parallela e per il multi-programming. Le
sue origini risalgono al 1987 ad opera della Thinking Machines Corporation.
C* è un dialetto del C con caratteristiche aggiuntive riguardanti la sintassi e la semantica
per supportare il processing parallelo. E' stato progettato per lo sviluppo di applicazioni
sulla Connection Machine line di computer paralleli SIMD. Due proprietà fondamentali
18
distinguono C* dal C originale: data elements paralleli, e domini di computazione parallela.
Nel C* ogni variabile può essere o 'mono'(scalare) o 'poli'(parallela). Il programmatore può
definire un numero qualunque di nomi di domini, con domini locali paralleli e variabili
scalari, e quindi definire computazioni che si sviluppino in quei domini.
C* supporta gli stessi data types e strutture di controllo del C.
CHARITY
è un linguaggio di programmazione tuttora in via di sviluppo da parte del Charity
Development Group presso il Department of Computer Science, University of Calgary,
Canada. E’ di tipo funzionale nello stile, nel senso che i programmatori che hanno
familiarità con i paradigmi funzionali (programmatori logici e funzionali) trovano CHARITY
facile da imparare. E’ basato sulla teoria dei forti datatypes categorici. Questi ultimi sono
divisi in due classi: i datatypes induttivi (creati dal costruttore nella maniera familiare) e i
datatypes co-induttivi (buttati giù dai distruttori). I programmi sopra questi datatypes sono
rispettivamente espressi da folds (catamorfismi), e da unfolds (anamorfismi). Le principali
caratteristiche del linguaggio CHARITY possono essere così riassunte:
Ø "puro", e supporta una valutazione semplice;
Ø higher-order;
Ø Tutte le computazioni CHARITY hanno una fine(up to user input).
Si può dire che CHARITY realizza un elegante, puro framework per lo sviluppo software,
per l'insegnamento, e la ricerca di nuovi linguaggi. Questo framework supporta il diretto
ragionamento sui programmi ed è altamente responsabile della specificazione,
trasformazione e verifica dei programmi.
CILK
CILK è insieme un linguaggio multithreaded e un runtime system. Il linguaggio specifica un
grafo dataflow, ed il runtime system esegue il grafo in parallelo. Il linguaggio CILK è C con
un paio di nuove keyword, spawn e sync (in realtà ci sono altre estensioni per la scrittura
di programmi non-deterministici e per l'esecuzione speculativa. Aggiungere spawn ad una
chiamata di funzione specifica che la funzione chiamata può essere eseguita in parallelo
alla funzione chiamante. L'istruzione sync specifica che tutte le funzioni (procedure, nella
terminologia di CILK) che sono state invocate con spawn devono essere completate prima
che l'esecuzione possa continuare.
CLU
è un linguaggio strutturato a blocchi compilato creato tra gli anni 1974-77 da B. Liskov.
E’ imperativo con caratteristiche aggiuntive per la definizione della gestione di data types
astratti. E' stato concepito per lo sviluppo di applicazioni generali, ed anche come mezzo
di ricerca nel design di linguaggi per computer.
Quando era un discendente dell'ALGOL , il CLU possedeva una sintassi che era simile in
molti aspetti a quella dell'ALGOL 60, ma aggiungeva l'astrazione dei data types, exception
handling, e altre proprietà avanzate.
Il nome CLU è l'abbreviazione di "CLUster", che fu scelto perché il programma CLU
consiste normalmente di procedure, clusters iteratori. CLU supporta un numero di
caratteristiche avanzate per i linguaggi strutturati del suo tempo, inclusa la garbage
collection, una forma di successione, iteratori, forte typing, generici, e garbage collection.
Il sistema operativo di ricerca SWIFT era scritto in CLU, così come altri strumenti e
utilities.
CMS
Il CMS è un linguaggio strutturato a blocchi realizzato dalla Rand Corporation intorno al
1974 per conto della US Navy. Il CMS è un linguaggio imperativo procedurale usato quasi
19
esclusivamente per applicazioni real-time e finalizzate per la US Navy. Un modulo CMS
consiste di due moduli: un blocco di dichiarazione globale "SYS-DD" e blocco codice
"SYS-PROC". Sia i dati globali che locali, cosi come le procedure, possono comparire nel
blocco SYS-PROC. A seconda del compilatore, vi sono varie facilities per l'inclusione di
codici sorgente e il cross-module linking. Nel VMS i data types includono: interi, numeri a
virgola fissa e mobile, stringhe di lunghezza fissa, ed enumerazioni. Gli identificatori sono
fortemente tipizzati, la maggior parte delle versioni del CMS hanno una facile
dichiarazione dei types. L'unica data types aggregato è l'array. Il CMS ha un
convenzionale complemento di dichiarazioni imperative per il controllo del flusso, ma con
una sintassi particolare. Le dichiarazioni di loop offrono speciali facilities di exit/resume; é
perfino possibile far partire nuovamente un loop anche dopo esserne usciti. CMS offre
inoltre diversi tipi di dichiarazioni di salti.
COBOL
(Common Business Oriented Language, linguaggio comune orientato alle applicazioni
commerciali)
E' stato il primo programma di vasta diffusione per applicazioni commerciali,
amministrative e gestionali. Realizzato nel 1959 su commessa del governo degli Stati
Uniti, doveva rispondere all'esigenza di programma unico per tutti i settori dell'apparato
militare americano. Venne sviluppato dopo sette mesi di lavoro e i primi compilatori furono
disponibili un anno più tardi.
CONCURRENT PASCAL
Il CONCURRENT PASCAL è un linguaggio adatto alla programmazione concorrente o al
multi-programming. Le sue origini risalgono al 1974, e sono da attribuire a P. Brinch
Hansen. Il CONCURRENT PASCAL è un dialetto della struttura del linguaggio PASCAL,
esteso per supportare data types astratti, multi-tasking, e monitors. E' stato concepito per
la programmazione di sistemi operativi e per la ricerca. La sintassi del CONCURRENT
PASCAL è essenzialmente la stessa del PASCAL originale, eccetto per le proprietà ADT e
di simultaneità, e qualche altra proprietà. Il linguaggio è fortemente tipizzato e sicuro:
Records e puntatori variabili cosi come nel PASCAL originale non sono supportati. Il
CONCURRENT PASCAL aggiunge le seguenti nuove fondamentali proprietà: process
types, monitors, class types, dichiarazioni di init e di ciclo e code.
Alcune proprietà fondamentali del PASCAL sono state perse: la ricorsione, gli statements
di goto, i packed arrays, i puntatori e i file types. La versione originale del CONCURRENT
PASCAL era implementata su vari mini-computers e mainframes hardware negli anni '70.
CORAL
Linguaggio di programmazione imperativo procedurale nato tra gli anni 1964-66 presso la
Royal Signals & Radar Establishment, Malvern UK. E’ un linguaggio di programmazione
strutturato e compilato, della famiglia ALGOL, usato per lo sviluppo di sistemi real-time.
Viene descritto come un linguaggio semplice e leggero derivato dall'ALGOL e dal JOVIAL.
Supporta le convenzionali strutture di controllo, e i data types macchina come gli interi,
floats e puntatori. Include inoltre una facility per l'aggiunta di codice assembly in-line,
possibilmente dovuto all'uso tipico per scrivere software di controllo. CORAL fu
implementato per molti differenti mini-computers negli anni '70, e fu anche reso disponibile
sul VAX sotto il sistema VMS. Oggigiorno non sembrano esserci versioni gratuite
disponibili del CORAL.
CPL
(Combined Programming Language)
20
E’ un linguaggio di programmazione molto complesso, sintatticamente basato sull’
ALGOL-60, dotato di un subset puramente funzionale. E' un linguaggio fortemente
tipizzato ma possiede un type "generale" che consente una leggera forma di polimorfismo.
Le funzioni possono essere definite sia come normali che con ordine applicativo. CPL
supporta arrays tipizzati e strutture liste polimorfiche. La selezione di liste avviene
attraverso strutture di matching. Il CPL è stato parzialmente implementato sul computer
Titan(Atlas 2) a Cambridge. Ha condotto al più semplice BCPL.
CSH
Linguaggio interpretato appartenente alla categoria dei linguaggi Scripting progettato e
implementato come parte degli sforzi per lo sviluppo del sistema BSD UNIX. Fu
originariamente progettato come un linguaggio Command interattivo, ma è anche
largamente usato per automatizzare l'amministrazione di sistemi e compiti di sviluppo
software in ambienti Unix. Supporta solamente un primitivo data type: la stringa. Ha
operatori aritmetici che possono trattare le stringhe come numeri interi in alcuni costrutti.
Come altri linguaggi in ambiente Unix, CSH ha due spazi per le variabili: locale ed
esportato(ambiente). In un programma CSH tutte le variabili locali hanno lo stesso data
type: un vettore di stringhe. Nel CSH le dichiarazioni sono normalmente delimitate da linee
di confine, ma spesso possono essere usate anche delle semi-colonne. I costrutti di
controllo del flusso supportati includono if-then-else, due tipi di loop, goto, un'istruzione di
case ed un'istruzione molto semplice per interrupt handling. Tutti i costrutti di controllo del
flusso, così come la sintassi delle espressioni sono modellati approssimativamente su
quelli del linguaggio C. Diversamente dalla maggior parte degli altri linguaggi di
programmazione non possiede un'esplicita sintassi per le subroutines. Invece, ogni
separato file sorgente può essere trattato come un tipo di subroutine. CSH è disponibile
essenzialmente per tutti i sistemi Unix e relativi sistemi operativi. A dispetto del suo largo
uso, buoni tutorials di programmazione su shell C non sono altrettanto largamente
disponibili sul web.
CT
Il linguaggio di programmazione CT è un linguaggio imperativo procedurale come il C,
PASCAL, FORTRAN, e Basic ma notevolmente migliorato da capacità multimediali, inclusi
supporti easy-to-use per le grafiche a colori, interazioni col mouse, e talvolta movies in
QuickTime o video in formato Windows. Quindi il linguaggio CT offre una facile creazione
di programmi multimediali, con la relativa portabilità su Macintosh, Windows, Linux, e Unix.
L'ambiente di programmazione CT offre un aiuto on-line con esempi di programmi
esempio eseguibili, un editor grafico per la generazione automatica di comandi grafici,
un'ulteriore compilazione per consentire un rapido turn-around, e un dettagliata diagnosi
degli errori.
ERLANG
ERLANG è un linguaggio di programmazione realizzato per lo sviluppo di robusti
programmi che possano essere distribuiti tra differenti computers in una rete. Così
chiamato in onore del matematico danese Agner Krarup Erlang, il linguaggio fu sviluppato
dall' Ericsson Computer Sciences Lab per la costruzione di software destinato ai propri
prodotti di telecomunicazioni. In uso per un certo numero di anni presso la Ericsson e altre
compagnie, ERLANG è oggi insegnato in oltre 80 università colleges sparsi in tutto il
mondo ed è disponibile gratuitamente come Open Source code. ERLANG è simile al
JAVA in quanto usa una macchina virtuale e supporta il multithreading. Tuttavia, mentre la
comunità di sviluppo del JAVA si focalizza principalmente sulle applicazioni WEB,
ERLANG si indirizza sul mercato per il progetto di servers robusti e sistemi sicuri.
21
ERLANG può essere descritto come linguaggio di programmazione funzionale, nel senso
che dà più importanza alla valutazione delle espressioni piuttosto che all'esecuzione dei
comandi. Le espressioni usano funzioni per derivare i valori base.
EUPHORIA
E’ un tipo di linguaggio di scripting, creato intorno al 1993 da R. Craig presso la Rapid
Deployment Software.
EUPHORIA è un linguaggio per PC, interpretato e strutturato a blocchi. E' stato concepito
per lo sviluppo di applicazioni generali e la programmazione di giochi.
Il modello dati usato da EUPHORIA è estremamente semplice: tutti gli elementi dati sono
o atomi o sequenze. Tutti gli atomi sono numerici: chars, interi, floats. Le sequenze
possono essere di lunghezza qualunque e possono contenere atomi o altre sequenze.
Una stringa è semplicemente una sequenza di caratteri. Strutture dati molto più complesse
possono essere costruite da sequenze nidificate. Indexing e lo slicing sono caratteristiche
molto importanti, cosi come la capacità di distribuire operazioni scalari su sequenze di
numeri. EUPHORIA realizza il type checking, può fornire i domini degli indici di una
sequenza e i valori di ritorno di una funzione. Infine, esso consente al programmatore di
definire operazionalmente dei data types astratti, dichiarando per ognuno di questi type
una funzione booleana che determini la membership del type. EUPHORIA è concepito per
essere un linguaggio molto semplice da imparare. Supporta di rado caratteristiche di
controllo sequenziale: loops e condizionali. Non supporta alcuna caratteristica avanzata
come il thread, l'exception, o funzioni di ordine più elevato.
FORMAC
Linguaggio applicativo matematico adatto alla simulazione. Fu creato da Jean Samnet nel
1964 per conto della IBM. Il FORMAC è un dialetto del FORTRAN con un vasto insieme di
estensioni per la computazione simbolica e manipolazione di espressioni. Fu progettato e
implementato negli anni '60 per supportare la computazione scientifica e ingegneristica sui
mainframes IBM. I data types supportati includevano tutti i types numerici del FORTRAN,
più i numeri razionali, simboli, arrays, ed espressioni. I programmi FORMAC potevano
includere subroutines e funzioni, e potevano usare altre facilities del FORTRAN come le
aree comuni. Il FORMAC fu inizialmente implementato come un preprocessore in testa al
FORTRAN; le chiamate di funzioni formula e simboliche venivano trasformate in chiamate
ad una libreria di manipolazione simbolica. Per le relazioni di I/O, il FORMAC poteva
avvantaggiassi delle usuali facilities del FORTRAN, e poteva anche stampare le sue
espressioni simboliche. Alla fine degli anni '60, i ricercatori IBM crearono un simile
preprocessore per il PL/I, chiamato PL/I-FORMAC. Diversamente dai successivi sistemi
matematici simbolici, il FORMAC supportava la creazione di espressioni ma non di metaespressioni. Questo è indicativo del suo stato iniziale nell'evoluzione della computazione
simbolica, e a dispetto della mancanza di caratteristiche ebbe una grossa influenza sui
suoi immediati successori. Il FORMAC è stato usato sino ai primi anni '90.
FORTH
(dall'inglese fourth, quarto)
E' stato realizzato verso la fine degli anni Sessanta dall'astronomo Charles Moore per
controllare strumenti scientifici il cui posizionamento va effettuato con grande precisione.
E' nato quindi come linguaggio per il controllo di strumenti di misura e l'acquisizione di dati.
FORTRAN
(FORmula TRANslator, traduttore di formule)
22
Fu sviluppato nel 1954 da John Backus e il team di collaboratori messagli a disposizione
dall'IBM. Due anni più tardi venne reso disponibile il primo compilatore, per l'elaboratore
IBM 704x. Da allora in poi vennero commercializzate successive versioni del FORTRAN,
alcune delle quali avevano il compito di imporre uno standard sul mercato, come il
FORTRAN 66 e il FORTRAN 77. Il linguaggio è idoneo ad applicazioni scientificomatematiche: è stato il primo linguaggio di programmazione in ambito scientifico. Il
FORTRAN permise di orientare la ricerca sui linguaggi di programmazione, ritenuti dai
programmatori dell'epoca non utilmente impiegabili. I primi ambiti di applicazione furono di
carattere amministrativo e gestionale.
FORTRAN77
Il FORTRAN 77 ,al contrario del forse più noto BASIC, non è direttamente eseguibile ma
necessita di una prima fase di compilazione per il controllo della ortografia e di una
successiva fase di mapping che ne controlla la sua struttura con il sistema operativo della
macchina stessa. Dopo questi due passaggi si ottiene un modulo che è direttamente
eseguibile. Il FORTRAN77 permette una programmazione STRUTTURATA e per la sua
struttura algebrica è particolarmente adatto alle applicazioni scientifiche. La struttura di un
programma non si manifesta solo nella sua suddivisione in SUBROUTINE e FUNCTION
ma nella presenza di una certa gerarchia nelle diverse parti che lo compongono.
La traduzione di un metodo di calcolo (algoritmo) con una sequenza di istruzioni che il
calcolatore può interpretare e che termina con la parola end definisce una struttura di
calcolo cioè un programma. Il programma principale (main), le subroutine e le function
costituiscono le unità di programma. Le istruzioni si possono suddividere in 2 categorie:
eseguibili ,cioè che descrivono una azione che il programma può eseguire; non eseguibili,
cioè che definiscono delle variabili o delle strutture di dati o delle dichiarazioni.
GPSS
GPSS stà per "General Purpose Simulation System". Il sistema creato nel 1961, sostenuto
e sviluppato da Geoffrey Gordon (IBM) per più di dieci anni. Anche le versioni GPSS/360 e
GPSS/V furono sviluppate presso la IBM. Oggigiorno esistono versioni di GPSS per quasi
ogni tipo di sistema operativo. L’interfaccia grafica semplifica la disposizione WWW, lo
rende di largo uso, diventando completamente indipendente dalla piattaforma. Durante la
metà degli anni '70 James Henrikson (Wolverine Software Corp.) sviluppò il suo GPSS/H.
Le caratteristiche che lo differenziano dai suoi predecessori sono la sua efficienza in
runtime,
aumentata
significativamente,
e
l'integrazione
di
un
linguaggio
di
programmazione universale. Come linguaggio di programmazione il GPSS/H può essere
usato per generare files traccia di animazione, che portano un po’ di vita nei layouts di
animazione Proof.
GUILE
GUILE è una implementazione SCHEME disponibile in una libreria, in modo tale che
qualunque applicazione può avere al suo interno un interprete SCHEME. È il linguaggio di
estensione ufficiale del Progetto GNU e viene utilizzato da molte applicazioni Gnome.
Aggiungere un linguaggio di estensione al proprio programma può suonare molto
complesso, ma GUILE rende il tutto molto facile. (Molte applicazione Gnome supportano
anche PERL e Python; è molto facile supportare svariati linguaggi quando si è aggiunto il
primo. Ma GUILE occupa un posto particolare nel cuore dei programmatori di Gnome.)
HASKELL
Linguaggio di programmazione funzionale o lambda-based venne creato nel 1990
dall'HASKELL Committee, composto da Hughes, Wadler e Peterson.
23
L'HASKELL non è un linguaggio strettamente funzionale, progettato dagli esponenti più
rappresentativi della comunità della programmazione funzionale. La motivazione alla
nascita dell'HASKELL era l'intento di unificare la programmazione funzionale attraverso
l'introduzione di un linguaggio moderno, standard e aperto.
HASKELL è un linguaggio fortemente tipizzato con un ricco type system. Come in tutti i
linguaggi funzionali, le computazioni vengono svolte solamente da espressioni: ogni
espressione ha un type. I data types primitivi supportati dal linguaggio includono: interi,
reali, caratteri, liste, enumerazioni, coppie ordinate e vari mappings di funzione. Le
implementazioni del linguaggio HASKELL realizzano il type cheking statico prima
dell'esecuzione. Le funzioni HASKELL sono definite come mappings tra parti dello spazio
del type. Ovviamente, sono supportate la composizione, le curried functions, le forme
lambda e funzioni di ordine più elevato. HASKELL usa la lazy evaluation. Esso consente
anche la definizione di operatori come funzioni (overloading di operatori), una proprietà
conveniente che è inusuale in sistemi di programmazione funzionale. La modularità è
espressamente supportata. I programmi consistono di moduli nominati(named). La facility
del modulo fornisce distinti nomi degli spazi e un mezzo per la definizione di data types
astratti incapsulati. Le proprietà dei moduli consentono qualche grado di programmazione
orientata agli oggetti.
HTML
Il linguaggio HTML (Hyper Text Markup Language) permette di realizzare "pagine" di
informazioni sia testuali che grafiche in cui si possono attivare dei link ad altre pagine
diffuse in rete; questo agevola il recupero delle informazioni e garantisce, grazie ad una
serie di protocolli (il più noto dei quali è HTTP -Hyper Text Transfer Protocol-), la
possibilità di accesso da parte degli utenti a un enorme numero di documenti. HTML è il
codice base per l'elaborazione delle informazioni su Internet.
A voler essere precisi HTML non è un vero e proprio linguaggio di programmazione, è un
formato di dati che consente lo scambio di informazioni attraverso il World Wide Web. I tag
HTML sono semplicemente dei marcatori che comunicano al browser alcune informazioni
di formattazione. HTML, dunque, non può essere definito un linguaggio di
programmazione, ma un sistema di markup (contrassegno). Vale la pena spendere due
parole anche sullo standard XHTML.
XHTML é un nuovo standard di riferimento del W3C che ha ufficializzato nel documento
"XHTML 1.0: The Extensible HyperText Markup Language", definendole "una
riformulazione di HTML 4.0 in XML 1.0". Il W3C ha voluto avvicinare XML al modello
attuale di HTML, rimuovendo le limitazioni che finora hanno impedito la diffusione di XML.
Prima fra tutte, quella che vede XML incompatibile con la stragrande maggioranza di
browser in circolazione. La volontà dichiarata del W3C (consorzio di aziende per lo
sviluppo di standard per il Web) è quello di sostituire al più presto HTML con un linguaggio
basato su XML.
ICI
L'ICI è un linguaggio imperativo procedurale interpretato con reminiscenze del C. E'
essenzialmente un linguaggio di scripting, concepito per lo sviluppo di applicazioni.
La sintassi dell'ICI è simile a quella del C, ma fornisce un modello di dati di livello più alto
teso a ridurre gli sforzi e gli errori del programmatore. In ICI i data types primitivi includono
interi, reali, stringhe, files, safe pointers e espressioni regolari. Gli aggregati di data types
sono arrays, insiemi e tabelle associative. Gli insiemi possono essere eterogenei, nidificati
e supportano le usuali operazioni d'insieme: unione, intersezione, etc. In ICI tutte le
strutture dati sono dinamiche e l'ambiente del linguaggio provvede alla gestione della
memoria e alla garbage collection. Le strutture di controllo includono i soliti loops e le
24
dichiarazioni condizionali, più un semplice costrutto di gestione degli errori. Il linguaggio
supporta subroutines e moduli nested. Tutte le variabili sono lessicalmente finalizzate alla
subroutine o al livello del modulo, ma diversamente dalla maggior parte dei linguaggi
strutturati, l'ICI consente di correggere il programma in corso.
Benchè non sia un linguaggio object-based, molte caratteristiche della programmazione a
oggetti possono essere emulate usando strutture dati con caratteristiche di successione
chiamate super strutture. Per supportare lo sviluppo di applicazioni, sono presenti dei files
di I/O e un'interfaccia di sistema simili a quelli del C. Il linguaggio possiede anche una
modesta libreria standard di funzioni built-in.
ICON
E’ un linguaggio di programmazione ad alto livello che assomiglia a molti altri linguaggi di
programmazione ma offre molte caratteristiche che permettono un grosso guadagno in
produttività. Al contrario del nome, Icon non è un linguaggio di programmazione visuale; il
suo look-and-feel deriva dal PASCAL e dal C. La cosa importante di ICON è che la sua
sintassi è facile da imparare. La semantica di ICON, che generalizza le idee di SNOBOL,
aggiungendo considerevole potenza alla notazione familiare trovata nei maggiori linguaggi
di programmazione. Questo è notevole perché molti linguaggi lo fanno con una sintassi
così differente che i programmatori devono imparare un nuovo modo di pensare prima di
usarli. ICON è stato sviluppato in diversi anni all'Università dell'Arizona da un team gestito
da Ralph Griswold. Oggi gira su molte piattaforme ed è utilizzato dai ricercatori per
algoritmi, compilatori, dai linguisti come dagli amministratori di sistema e dagli
appassionati.
IDL
E’ stato sviluppato per l'esecuzione di ricerche scientifiche, è array-oriented ed ha un
linguaggio di programmazione di quarta generazione. IDL è disponibile per numerose
piattaforme, tra le quali: Microsoft Windows, Unix, VMS.
Tra le proprietà principali possiamo evidenziare:
linguaggio di programmazione procedurale con possibilità di eseguire comandi interattivi e
di chiamare routines;
funzioni matematiche built-in per la gestione di matrici (es. inversione) , differenziazione,
integrazione e gestione dei numeri complessi;
2D plot: Line plots, scatter plots, histograms, bar graphs, polar plots, con controlli di colori,
fonti etc ;
Contour plots, filled contours, shaded surface representations;
GUI toolkit per interfacce definibili dall'utente e che rendono l'applicazione indipendente
dalla piattaforma di costruzione;
statistica: deviazione standard, distribuzione di probabilità (binomiale, gaussiana, T di
Student), analisi della varianza, etc.
INTERCAL
Il nome intero del compilatore è "Compiler Language With No Pronounceable Acronym",
che per ovvie ragioni viene abbreviato con INTERCAL.
Il linguaggio di programmazione INTERCAL fu progettato la mattina del 26 maggio 1972
da Donald R. Woods and James M. Lyon alla Princeton University.
Diciotto anni dopo Eric S. Raymond realizzò una versione UNIX-hosted di un compilatore
INTERCAL. Da allora l'implementazione del C-INTERCAL è stata mantenuta ed ampliata
da una comunità internazionale di "tecno-masochisti", che include Louis Howell, Steve
Swales, Michael Ernst, e Brian Raiter. La nascita di INTERCAL fu ispirata da
un'ambizione: avere un linguaggio compilatore che non avesse nulla in comune con
25
qualunque altro dei linguaggi principali. Per "principale", s'intendeva qualunque linguaggio
con cui gli autori avessero familiarità, es., FORTRAN, BASIC, COBOL, ALGOL, SNOBOL,
APL, LISP, e PL/I. Per la maggior parte, INTERCAL è rimasto fedele a questo obiettivo,
condividendo solamente gli elementi base come le variabili, gli arrays, e l'abilità di
compiere operazioni di I/O, ed evitando tutte operazioni convenzionali.
JCL
Il Job Control Language (JCL) è il linguaggio con cui l'utente comunica al sistema
operativo la definizione di ogni lavoro da compiere. In particolare, esso permette di
Identificare:
Ø il singolo lavoro (scheda JOB)
Ø Rendere noto come un job è stato suddiviso in diverse unità elaborative o step
(scheda EXEC)
Ø Evidenziare quali sono le risorse richieste dal job e da ogni singolo step (scheda
DD)
Ø Comunicare dove risiedono i dati da elaborare
Ø Ottimizzare l'uso delle unità, dei volumi e dello spazio su unità ad accesso diretto
Ø Passare data-set da uno step all'altro
Ø Copiare informazioni già fornite in precedenza con un sistema di riferi mento
all'indietro
Ø Richiamare, specificandone semplicemente il nome su di una scheda EXEC, gruppi
di schede costituenti uno o più step con la possibilità di apportarvi modifiche
temporanee (procedure catalogate e in stream)
In breve, un JCL rappresenta nient'altro che la descrizione del flusso di istruzioni
necessarie per richiedere al sistema operativo l'esecuzione di un programma al quale
vengono riservate determinate risorse (tempo CPU, spazio su disco, eventuali unità a
nastro, stampanti). In sostanza potremmo assimilare un listato JCL ad un programma
batch eseguito nel mondo MsDos; tuttavia, nonostante la possibilità del DOS di
reindirizzare input ed output su periferiche diverse e di eseguire operazioni anche
complesse come operare scelte in base ai codici di ritorno, un listato DOS è decisamente
più semplice e intuitivo di un listato JCL, ed il parallelo proposto per assimilarli nella
struttura sequenziale dei comandi deve necessariamente fermarsi a quel punto. In un
listato JCL, è infatti possibile descrivere il tipo di periferica richiesta, il tempo-macchina
oltre il quale il job viene concluso automaticamente dal sistema con un messaggio di
errore (ABEND, o ABnormal END), il tipo di condivisione di un file o di un intero data-set.
JOVIAL
JOVIAL stà per " Jule's Own Version of IAL". Il linguaggio fu infatti creato da Jule's I.
Schwartz tra gli anni 1959-1960. E’ basato fondamentalmente sull'ALGOL 60, con
estensioni per ciò che riguarda la programmazione in real-time su larga scala. Gli elementi
dati sono registrazioni, ingressi(records), e tavole. JOVIAL viene usato largamente dalle
US AIR FORCE. La maggior parte del software per gli AWACS è in JOVIAL, e gira su
sistemi IBM(360 compatibile).
LIMBO
Linguaggio di programmazione pensato per far girare applicazioni a sistemi distribuiti su
piccoli computers. LIMBO supporta programmazione modulare, forte controllo dei type al
momento della compilazione e dell'esecuzione, comunicazione tra i processi attraverso
canali caratterizzati, e semplici types di dati astratti. E' stato progettato per garantire
un'esecuzione sicura anche su piccole macchine prive di protezione della memoria
hardware.
26
Nella sua implementazione iniziale per il sistema operativo INFERNO, i programmi oggetti
generati dal compilatore LIMBO giravano usando un interprete per una fissata macchina
virtuale. INFERNO e l'associata macchina virtuale giravano o stando soli su un semplice
hardware o come applicazione sotto un convenzionale sistema operativo come Unix,
Windows 95, Windows NT, e Plan 9. Per svariate architetture, incluse INTEL x86 e MIPS, i
programmi oggetti LIMBO vengono trasformati "al volo" in istruzioni per l'hardware
sottostante
LISP
In informatica, è l'acronimo di List Processing, un linguaggio di programmazione sviluppato
nel 1958 da John McCarthy presso il Massachussets Institute of Technology (MIT) e usato
soprattutto per manipolare liste di dati. Completamente diverso dai linguaggi procedurali
messi a punto fino al momento della sua introduzione (FORTRAN, ALGOL), LISP è un
linguaggio nel quale ogni espressione è un elenco di richiami a funzioni elementari. È stato
considerato a lungo il linguaggio standard per gli studi sull'intelligenza artificiale ed è
tuttora molto usato nel campo della ricerca scientifica. Il LISP è anzitutto particolarmente
adatto allo sviluppo incrementale. Il programmatore può scrivere una funzione in termini di
altre funzioni, sia già definite sia non ancora definite, e cosi realizzare e provare
continuamente. Non è necessaria la dichiarazione della struttura dei dati né delle variabili
prima del loro uso. Il debugging è eccellente: quando insorge un problema il LISP invita il
programmatore ad esplorare l'ambiente relativo e tutta la sua potenza resta a disposizione
per risolverlo. In effetti un errore si manifesta come un punto d'interruzione da cui partire
per esaminare il problema. Un'altra particolarità è in grado di gestire automaticamente i
suoi spazi di memoria. I programmi in LISP possono creare o manipolare altri programmi
in LISP, in quanto dati e programmi sono rappresentati allo stesso modo. Può usare
simboli arbitrari, senza specificarli e trattarli come array di caratteri ed il programmatore
può attribuire loro proprietà e manipolare le relazioni definite tra essi. Infine si può
facilmente estendere e le funzioni create dal programmatore vengono trattate come quelle
definite nel sistema. Ci si potrebbe chiedere a questo punto come mai il LISP, nonostante
la sua età ed i suoi vantaggi, abbia solo da poco cominciato ad essere usato nella
programmazione tradizionale. . Una prima ragione è che, fino a poco tempo fa, era
disponibile solo su macchine potenti e costose .La seconda ragione è che gran parte dei
sistemi in LISP sono poco adatti all'elaborazione in tempo reale e dove la sicurezza è
importante, aspetti che oggi sono oggetto di una intensa attività di ricerca.
LOGO
(dal greco logos, pensiero, discorso)
Progettato nel 1967 da Seymour Papert al MIT nell'ambito di un progetto di ricerca
finanziato dalla National Science Foundation è, prima di tutto, un metodo psicologico per
l'alfabetizzazione informatica. Attraverso la creazione di immagini tramite un cursore (una
tartaruga) mosso da istruzioni elementari derivate dal LISP, cattura l'attenzione e stimola
all'uso del computer anche i bambini in età prescolare. Sia il FORTH che il LOGO
presentano notevoli somiglianze in quanto vennero originariamente progettati per
controllare due apparecchi, rispettivamente un telescopio e una tartaruga da pavimento.
LUA
Appartiene alla categoria dei linguaggi Scripting, elaborato nel 1994 da W. Celes, R.
Ierusalimschy, L.H. de Figueiredo al PUC-Rio. E’ un linguaggio strutturato e interpretato
progettato per lavorare in altre applicazioni. E' stato concepito per essere usato come
un'estensione specialmente per applicazioni con requisiti per la memorizzazione di dati
strutturati. Poiché è stato inteso per essere usato come linguaggio estensione per altre
27
applicazioni, LUA non possiede la notazione di 'main' program o di punto di entry; mentre
si assume che tutti i codici vengono invocati dall'applicazione principale. La sintassi del
LUA è qualcos a di simile a quella del PASCAL, ma il sistema dei data type è molto
diverso. Come molto linguaggi di scripting, è vagamente tipizzato: le variabili non hanno
bisogno di essere dichiarate, e possono assumere qualunque tipo di valore. I data types
supportati includono i numeri reali, stringhe, funzioni, e tabelle(arrays associativi).
Possiede anche un distinto valore tipo 'nil', e un ulteriore data type 'userdata' che può
memorizzare puntatori C per l'uso da parte dell'applicazione principale. Gli arrays
associativi di LUA sostituiscono altri data types come arrays e tuples. Le strutture di
controllo supportate includono vari costrutti condizionali e di looping. Il linguaggio non
possiede costrutti per la gestione degli errori, mentre gli errori vengono solitamente
indirizzati verso funzioni di gestione predefinite. Come il PERL, LUA supporta il multiplo
ritorno di valori da funzioni e da un numero variabile di argomenti di funzioni.
Programmare in LUA è molto semplice: tutte le variabili sono o globali o locali rispetto ad
una particolare applicazione. Il default è globale, le variabili locali vanno esplicitamente
dichiarate. La definizione di funzioni sono giusto l'assegnazione di variabili globali. I data
values in LUA sono tali da supportare speciali estensioni per l'applicazione principale. I
tags possono essere usati per definire speciali sistemi di gestione per data types, o per
mettere a punto relazioni di successione o di delega.
MATLAB
La nascita di MATLAB (Symbolic math system) risale al 1964 (in seguito comparse la
versione MATLAB 68). MATLAB è il migliore ambiente per il calcolo numerico disponibile
sul mercato, affermatosi come uno strumento essenziale per più di 400.000 professionisti.
La felice combinazione di affidabili tecniche numeriche e di grafica avanzata, consente agli
utilizzatori di analizzare e visualizzare i dati; analizzare e ottimizzare i disegni e gli
algoritmi dei sistemi ingegneristici; esplorare nuovi concetti nella ricerca scientifica; creare
modelli matematici, risolvere sistemi di equazioni; eseguire calcoli scientifici ed
ingegneristici. Come ambiente di visualizzazione, MATLAB consente di creare sofisticati
grafici a colori utilizzando moderni strumenti grafici 3D, come la sfumatura delle superfici,
gli pseudocolori, le sorgenti di luce, i contorni 3D, l'image processing, l'animazione, la
visualizzazione volumetrica ed altro ancora. Questi strumenti a 3D, 4D e perfino 5D,
permettono un'analisi estremamente dettagliata anche di grosse quantità di dati. I grafici
possono essere animati per meglio illustrare i cambiamenti in relazione al tempo o ad
un'altra variabile. Si possono specificare le sorgenti di luce e i colori, al fine di rendere più
dettagliati i dati e facilitare l'interpretazione.
MERCURY
Il linguaggio MERCURY fu sviluppato nell'ambito dell'omonimo progetto nel 1993 presso
l'Università di Melbourne. E’ un linguaggio di programmazione logico con alcune
caratteristiche di linguaggio funzionale. E' stato progettato per dargli i vantaggi della
semantica dei linguaggi dichiarativi e la velocità e l'error -checking dei linguaggi
procedurali. La sintassi del MERCURY è simile a quella del PROLOG, ma supporta
costrutti addizionali con cui dichiarare tipo, modo, e altri vincoli. Diversamente dalla
maggior parte dei linguaggi di programmazione logici, MERCURY non è interpretato, il
compilatore traduce i moduli del codice in C trasportabile. Questo gli da al una addizionale
trasportabilità e velocità, ma impedisce di creare ed elaborare nuovi codici “al volo”.
MESA
Fu creato nel 1977 presso la Xerox PARC. E' un linguaggio di programmazione concepito
per sistemi e applicazioni particolari. Il MESA possiede una sintassi simile a quella del
28
PASCAL e una semantica simile a quella dell'ALGOL-68. I moduli MESA consentono la
compilazione separata. Nel MESA il type checking può essere disabilitato.
MIRANDA
E’ un linguaggio di programmazione funzionale o lambd-based, creato nel 1985 da David
Turner presso l’Università di Kent.
E’ stato concepito per l'insegnamento della programmazione funzionale e per lo sviluppo
di applicazioni. Come linguaggio puramente funzionale non possiede costrutti imperativi di
controllo. Gli “scripts” di MIRANDA consistono di un insieme di equazioni che definiscono
varie strutture dati e operazioni. I data types disponibili includono booleani, identificatori
(simboli), interi, caratteri, reali, stringhe, liste, tuples, e funzioni. E’ un linguaggio
fortemente tipizzato(typed). MIRANDA fornisce una potente sintassi di definizione per le
liste dette comprensioni di lista, diversamente dal LISP e dalla versione originale del ML,
usa una valutazione molto semplice per tutte le espressioni. Questo consente al sistema
del linguaggio di supportare infinite liste e indefiniti parametri. Supporta molte
caratteristiche di livello più elevato che vengono richieste a linguaggi funzionali avanzati:
curried functions, funzioni prima classe, sofisticati modelli di matching per l’applicazione
delle regole, e definizione di tipi algebrici. La sintassi di MIRANDA è molto elegante e
compatta. La sintassi base per l'applicazione delle funzioni è prefissata, ma la notazione
non-fissa può essere usata nella maggior parte dei casi.
ML
E’ il nome per una famiglia di linguaggi funzionali: ML, SML, SML/NJ, CAML, EML e altri.
Le proprietà e l'utilizzo delle differenti versioni varia in qualcosa. I linguaggi ML sono
generalmente interpreti. ML è un linguaggio funzionale puro. Supporta molte delle capacità
avanzate che si richiedono ad un buon linguaggio funzionale: ricorsione, forte typing, una
buona varietà di data types built -in, facilities per costruire aggregati e types funzionali,
composizione di funzioni, funzioni di ordine elevato e gestione delle eccezioni(exception
handling). Fornisce files e network I/O per supportare la scrittura di programmi reali; la
scrittura di dati costituisce un contro effetto della valutazione dell'output di una funzione.
Supporta inoltre caratteristiche memorizzazione variabile. Tutti i sistemi ML condividono
una libreria comune di funzioni built-in e moduli chiamati “SML Basis Library”. La libreria
base fornisce varie manipolazioni dati, I/O, gestione di stringhe, e funzioni di interfaccia di
sistemi operativi. Il sofisticato type sistem del ML dà al programmatore la capacità di
definire semplici funzioni che automaticamente vengono applicate al tipo giusto di dati.
Supporta inoltre una leggera forma di polimorfismo. Molti altri linguaggi funzionali
progettati dopo supportano un approccio di tipo pattern-matching per l'applicazione di
funzioni. Il nome ML stava originariamente per Meta-Language.
MODULA2
Fu sviluppato nel 1978 come linguaggio di sistema per la workstation LILITH. Il concetto
centrale è il modulo che può essere usato per "incapsulare" un set di sub-programmi e
strutture dati, e restringere la loro visibilità dalle altre porzioni di programmi. Ogni modulo
ha una parte di definizione che fornisce l'interfaccia, ed una parte di implementazione. Il
linguaggio provvede ad una limitata simultaneità del single -processor (monitors,
coroutines e espliciti trasferimenti di controllo) e accessi hardware (indirizzi assoluti ed
interrupts).
MODULA3
E’ un membro della famiglia di linguaggi PASCAL. Progettato alla fine degli anni '80
presso la Digital Equipment Corporation and Olivetti, MODULA3 corregge molte delle
29
deficienze del PASCAL e di MODULA2 per il software engineering pratico. In particolare,
MODULA3 mantiene la semplicità de i type e l'affidabilità dei precedenti linguaggi, mentre
realizza funzioni che facilitano la gestione delle eccezioni, la simultaneità e la garbage
collection. E’ sia un pratico linguaggio di implementazione per vasti progetti software che
un eccellente linguaggio di insegnamento.
MUMPS
Linguaggio adatto per database e text-processing creato nel 1969 da Octo Barnett M.D.
presso il Mass. General Hospital. MUMPS, noto anche solamente come 'M', è un
linguaggio interpretato, imperativo procedurale con caratteristiche aggiuntive per la
programmazione event-driven, il text handling, e la gestione di database. La sintassi del
linguaggio è molto semplice ma artificiosa. Le variabili possono essere semplici numeri,
records, liste o enormi database. L'accesso alle variabili globali è trasparente, liberando
così il programmatore dalla preoccupazione degli esiti della gestione dei database. Nel
MUMPS sono presenti le usuali strutture di controllo sequenziale. Sono inclusi i soliti
operatori aritmetici, ma la reale forza del MUMPS nella sua string handling. Possiede un
flessibile insieme di istruzioni per il pattern matching, il sorting, e la manipolazione di
stringhe(anche se non sviluppata come nello SNOBOL o ICON).E’ stato progettato per
supportare la multi-programmazione e la computazione distribuita. Esistono anche
implementazioni GUI disponibili per il linguaggio.
OBERON
Fu progettato da Wirth nel 1988, come discendente del linguaggio MODULA2. E’
contemporaneamente sia un linguaggio di programmazione imperativo procedurale che un
moderno operating system per workstations di singoli utenti. I suoi punti di forza sono:
Ø un integrato e modulare ambiente di programmazione
Ø un'interfaccia testuale utente molto versatile.
OCCAM
Linguaggio di programmazione che facilita la scrittura di programmi paralleli, consentendo
al programmatore di specificare se i processi vanno eseguiti sequenzialmente o in
parallelo. Basato sul CSP e EPL, fu originariamente sviluppato per il Transputer INMOS.
OCCAM (così chiamato per il filosofo inglese William of Occam), fu creato da David May
nel 1982. Le espressioni sono processi che possono essere combinati in serie o in
parallelo. I processi comunicano via chiamata attraverso canali unidirezionali. Non vi è
precedenza di operatori. Un compilatore portabile e gratuito chiamato SPOC è stato
recentemente realizzato dall'Università di Southampton e altri compilatori sono in fase di
sviluppo.
OCTAVE
Linguaggio di programmazione ad alto livello per il calcolo matematico, usato
fondamentalmente in modo interattivo. Viene usato attraverso un terminale a caratteri,
come una console virtuale di GNU/Linux, ma per ottenere dei grafici si avvale di Gnuplot.
L'interazione tra Gnuplot e OCTAVE è trasparente, se quest'ultimo viene utilizzato in una
finestra di terminale all'interno del sistema grafico X.
PASCAL
(dal nome di Blaise Pascal, matematico francese del 1600)
E' stato chiamato così in onore del matematico (1623-1662) autore a soli 19 anni della
Pascalina, uno dei primi strumenti per il calcolo automatico.
30
Il linguaggio PASCAL fu in origine progettato da Niklaus Wirth, un professore svizzero, alla
fine degli anni '70. Quando il PASCAL fu progettato, esistevano già molti altri linguaggi di
programmazione, ma pochi largamente usati: FORTRAN, C, ASSEMBLY, COBOL. L'idea
chiave del nuovo linguaggio di programmazione fu l'ordine, raggiunto tramite un forte
concetto di tipizzazione dei dati, il controllo delle dichiarazioni e la programmazione
strutturata. Il linguaggio fu anche sviluppato come strumento di insegnamento nelle
scuole. Il famoso compilatore Pascal di Borland, chiamato Turbo Pascal, fu introdotto nel
1985. Il compilatore Turbo Pascal fu un best-seller dell'epoca e rese il linguaggio popolare
particolarmente nella piattaforma PC, grazie anche all'unione di semplicità e pot enza. Il
Turbo Pascal introdusse un ambiente di sviluppo integrato (IDE) in cui era possibile
editare il codice (in un editor WordStar compatibile), compilare, vedere gli errori e saltare
alle linee contenenti gli stessi. Oggi questo può sembrare banale e scontato, ma in
precedenza si doveva uscire dall'editor tornando al DOS, compilare, annotarsi le righe di
errore e aprire di nuovo l'editor puntando alle righe incriminate. Inoltre Borland vendeva
Turbo Pascal per 49 dollari, dove Microsoft vendeva il suo compilatore Pascal per alcune
centinaia di dollari. I molti anni del successo del Turbo Pascal contribuirono alle decisione
di Microsoft di cancellare la linea dei suoi compilatori Pascal.
PERL
Linguaggio di programmazione scripting creato da Larry Wall verso la fine degli anni '80
allo scopo di analizzare file di testo per estrarne informazioni e quindi usarle per generare
report, statistiche e prospetti informativi in generale
Il nome PERL, acronimo di "Practical Extraction and Report Language", sintetizza in
maniera esemplare la caratteristica principale di questo linguaggio. Si tratta infatti di un
eccezionale strumento di sviluppo, dotato di un'ampia serie di funzioni per l'analisi dei dati
in formato testuale, utile soprattutto al programmatore impegnato nell'analisi di file di log o
nella creazione di espressioni regolari. Sebbene il PERL sia stato sviluppato all'interno del
sistema operativo Unix, il suo successo è stato tale da garantirne la diffusione anche su
altre piattaforme come Dos e Windows95/NT. La "migrazione" in Linux è stata pressoché
immediata ed è entrato a far parte di tutte le sue distribuzioni.
PHP
Linguaggio di scripting server-side che consente lo sviluppo sia di siti generati
dinamicamente, sia di applicazioni che incorporano connessioni a database e data
processing. La flessibilità e scalabilità ne fanno uno dei più popolari linguaggi di scripting
server-side su piattaforme Unix/Linux. Inoltre, la precisa definizione della sua sintassi e dei
suoi costrutti lo rendono più amichevole di altri linguaggi tipo PERL, Python, C/C++ o ASP.
L'acronimo sta per Hypertext Pre-processor. La nascita del PHP ci riporta indietro ai primi
giorni del Web, nel 1994, quando Rasmus Lerdorf utilizzò una serie di script PERL per
registrare le visite che un suo curriculum on line riceveva. L'anno seguente egli rilasciò
una serie di utility chiamata Personal Home Page Tools, riscrisse il parser e incorporò un
altro dei suoi tool, FI (Form Interpreter, utilizzato per processare l'input da form HTML), per
poi portare tutto questo sulla versione 2 del PHP/FI nell'estate del '95. Un paio di anni
dopo, la responsabilità dello sviluppo del PHP fu trasferita ad un ben distribuito e
organizzato team di lavoro, che migliorò ulteriormente il parser e migliorò le potenzialità e
la sintassi del linguaggio, creando ciò che oggi conosciamo come PHP4. Le caratteristiche
peculiari di questo linguaggio sono le seguenti:
Ø Il PHP è un linguaggio di scripting: i programmi scritti in linguaggio PHP, denominati
brevemente script, vengono eseguiti tramite un apposito software, "l'interprete"
PHP.
31
Ø E' un linguaggio "HTML-embedded: questa caratteristica si riferisce al fatto che il
codice PHP è immerso nell'HTML.
Ø Opera server-side, cioè lato server: semplicemente significa che l'elaborazione di
uno script avviene sul server, prima che questi spedisca la pagina al browser (il
"client"). Di conseguenza, chi accede ad una pagina PHP non ha la possibilità di
leggere le istruzioni in essa contenute: essendo state processate, ciò che il client
vedrà sarà il risultato dell'elaborazione.
PILOT
(Programmed Inquiry Language or Teaching). Linguaggio sviluppato negli anni sessanta
da una equipe di ricercatori del S. Francisco Medical Center (California) per facilitare la
realizzazione di corsi di istruzione secondo le metodologie CAI. Il PILOT consente ai
docenti, con scarse cognizioni di informatica, di realizzare lezioni interattive di tipo
skinneriano col computer, in modo semplice ed efficace. Possiede grafica, animazione,
colore, suono. E' dotato di un elementare repertorio di istruzioni per operare con sicurezza
e potenza. Di questo linguaggio esistono versioni per Commodore, PC-IBM, Apple.
PL/1
Un gruppo di ricercatori della IBM mette in opera il "PL/1" (Programming Language One)
che racchiude e migliora le caratteristiche di FORTRAN e COBOL. Originariamente venne
utilizzato per sviluppare programmi nei grossi calcolatori ma, in seguito, sarà adottato
anche nei minicalcolatori. Il PL/1 segnò una tappa fondamentale per il superamento della
rigida specificità commerciale e scientifica dei linguaggi precedenti e per la real izzazione
di linguaggi di programmazione destinati ad un gruppo più vasto di utenti. Si tratta di un
linguaggio che permette di gestire gli errori, utilizzato in ambiente accademico e nella
ricerca.
POP
(Package for Online Programming). La prima versione della famiglia POP risale al 1966, e
fu appunto il POP-1. E' nato ad Edimburgo e usava la notazione polacca inversa. Nel 1967
Robin Popplestone sviluppava la seconda versione: il POP-2.
Questo era un linguaggio innovativo che incorporava molte idee di Landin, inclusi i flussi,
le chiusure e le funzioni. Usava una sintassi simile a quella dell'ALGOL. La prima
implementazione fu chiamata Multi-POP, basata su una funzione REVPOL scritta in POP1, e produceva un output in notazione inversa polacca.
Il POP-10 venne creato nel 1973 da Julian Davies. Discendente del POP-2, venne usato
nel sistema PDP-10. Il POP-11 nacque nel 1975 sempre ad opera di Robin Popplestone. Il
POP-11 è per molte ragioni molto simile al FORTH (stack-oriented, estensibile, efficiente).
Per altri versi è molto simile anche al LISP(funzionale, tipizzato dinamicamente, interattivo,
garbage-collected). E possiede una sintassi simile a quella del PASCAL(strutturato a
blocchi).
PROGRAPH
Deriva dalla contrazione di Programming in Graphics. Fu sviluppato da Tomasz
Pietrzykowski presso il Technical U di Halifax. E' un linguaggio di flusso di dati visuale. Le
icone di programmazione sono connesse da datalinks attraverso i quali viaggia
l'informazione. Fu inizialmente (1982) implementato in PASCAL, più tardi in PROLO G.
Le versioni correnti sono in C e in PROGRAPH. Disponibile per MAC, e presto anche per
WINDOWS e UNIX.
32
PROLOG
(PROgramming in LOGic, programmare in logica)
E' stato sviluppato da Alain Colmerauer presso l'Università di Marsiglia nel 1970 per la
ricerca nel campo dell'Intelligenza Artificiale, in particolare per la produzione di Sistemi
Esperti: sistemi che partendo da una base di conoscenze acquisiste attraverso
l'esperienza umana, forniscono consulenze e supporto agli apparati decisionali. Ha
raggiunto grande notorietà perché è stato scelto dai giapponesi come linguaggio base per
i computer della quinta generazione. "Programmare in logica" vuole dire non specificare le
operazioni da eseguire per risolvere i problemi proposti, in quanto le procedure risolutive
vengono svolte automaticamente dal computer. I programmi in PROLOG non seguono
l’abituale flusso di controllo sequenziale, ma adottano una tecnica di ricerca inversa
(backtracking): il PROLOG cerca la soluzione in base a una serie di regole concatenate,
ponendosi di volta in volta un nuovo obiettivo da raggiungere.
REBOL
Realizza un modello universale per applicazioni distribuite sulla rete. REBOL inaugura una
nuova era di applicazioni condivise, collaborative ed interative, applicazioni che sono a
basso costo, veloci da creare ed eseguibili su ogni piattaforma. REBOL offre uno
standard, un modello unificato per lo scambio di informazioni per tutti i sistemi di internet.
RPG
Sviluppato dalla IBM come "strumento di utilità", RPG sta per report program generator
(programma generatore di stampe). La nascita risale al1965 ed il compilatore è utilizzabile
solamente su sistemi IBM 360 e questo spiega già in parte l'ostruzionismo che l' RPG ha
avuto almeno dai concorrenti IBM. In effetti il linguaggio racchiudeva delle potenzialità che
nemmeno la IBM ha saputo apprezzare per molti anni. Una caratteristica peculiare dell'
RPG è il ciclo fisso di esecuzione delle istruzioni: input, calcolo, output, con tutta la
gestione delle condizioni particolari. Con l'avvento dell' RPG III, prima, e ILE RPG, poi, il
linguaggio si è dimostrato valido anche per affrontare problematiche di applicazioni
moderne ad oggetti e di soluzioni ERP.
SCHEME
E’ un linguaggio utile per rappresentare un problema, più che per realizzare un
programma completo. La standardizzazione di questo linguaggio è riferita
fondamentalmente a un documento che viene aggiornato periodicamente: RnRS, ovvero
Revised-n Report on the Algorithmic Language Scheme, dove n è il numero di questa
revisione (attualmente dovrebbe trattarsi della quinta). Tuttavia, la standardizzazione
riguarda gli aspetti fondamentali del linguaggio, mentre ogni realizzazione che utilizza
Scheme introduce le estensioni necessarie alle circostanze. SCHEME è un linguaggio di
programmazione discendente dal LISP, inventato da Guy Lewis Steele Jr. e Gerald Jay
Sussman nel 1995 presso il MIT. E’ importante soprattutto in quanto lo si ritrova utilizzato
in situazioni estranee alla realizzazione di programmi veri e propri; in particolare, i fogli di
stile DSSSL. MIT Scheme e Kawa sono due tra i principali interpreti SCHEME.
SETL
(SET language) Fu creato nei primi anni '70. E' un linguaggio orientato agli insiemi di
altissimo livello. I tipi di dati includono sets(collezioni/insiemi non-ordinati), tuples
(collezioni ordinate) e maps (collezioni di coppie ordinate). Le espressioni possono
includere quantificator i( "for each" e "exist"). Il primo traduttore ADA fu scritto in SETL.
33
SGML
Standard Generalized Markup Language è un potente linguaggio per la codifica di testi in
Machine Readable Form, ed è uno standard internazionale ufficiale. La definizione di
questo linguaggio trae origine dal lavoro di Charles Goldfarb per lo sviluppo del linguaggio
GML nei laboratori di ricerca della IBM. Nel 1980 l'ente nazionale americano per la
standardizzazione (ANSI) decise di procedere alla definizione di uno standard per la
rappresentazione elettronica e la comunicazione di documenti, chiamando alla direzione
del progetto lo stesso Goldfarb. A partire dal 1984 l'intero progetto fu assunto come
proprio dall'International Organization for Standardization (ISO), che allo scopo ha
costituito un gruppo specifico denominato ISO/IEC JTC1/SC18/WG8. Questa
commissione ha rilasciato nel 1986, con il nome di codice ISO 8879, lo standard ufficiale
dello SGML.
SML
SML è la definizione standardizzata per il potente linguaggio funzionale ML.
ML si è sviluppato in vari modi durante la seconda metà degli anni '80; un comune dialetto
e un insieme base di proprietà vennero standardizzate nel 1990. Tale standard fu
revisionato nel 1997; i sistemi di linguaggio che seguono questo nuovo standard sono
chiamati implementazioni SML '97.
SNOBOL
(StriNg Oriented SymBOlyc Language). Linguaggio di programmazione simbolico,
orientato alle stringhe, è stato sviluppato nei Bell Laboratories all'inizio degli anni '60. Lo
SNOBOL consente la facile gestione del suono e la simulazione di automi SNOBOL ed è
utilizzato particolarmente nella linguistica, nel calcolo combinatorio, nella realizzazione di
coursware CAI e nella teoria dei giochi.
SQL
(Structured Query Language) E’ un sub-linguaggio (o linguaggio ospitato) che consente
l'esecuzione di tutte le operazioni necessarie per la gestione e l'utilizzo di una base dati
relazionale (database relazionale). Il termine "structured" (strutturato) è riferito al fatto che
si può inserire un'istruzione all'interno di un'altra. SQL è un linguaggio di interrogazione
(estrapola dati da un database); ha funzionalità di Dml (Data Manipulating Language,
linguaggio di manipolazione dei dati), ovvero un insieme di funzioni per la modifica dei dati
contenuti nel database. Inoltre sono state definite delle estensioni dei principali linguaggi di
programmazione, che consentono di includere nei programmi comandi SQL. In questi casi
l'uso di SQL viene definito incorporato (o embedded). E’ utilizzabile anche fuori da altri
linguaggi, in tal caso ci troviamo in Sql diretto (direct Sql); questo metodo prevede che il
utente fornisca interattivamente un'istruzione alla volta ad un interprete che la esegue e
risponde con visualizzazioni o messaggi; è un linguaggio interpretato dai Dbms; è privo di
qualsiasi istruzione di controllo tipica dei linguaggi procedurali (if-then-else, while-do,
for...).
SR
(Synchronizing Resources). E’ un linguaggio per la stesura di programmi simultanei. I
principali costrutti del linguaggio sono le risorse(resources) e le operazioni. Le risorse
comprendono i processi e le variabili che essi condividono; le operazioni provvedono ai
meccanismi primari per l'interazione del processo. SR fornisce un'innovativa integrazione
dei meccanismi per la chiamata e il servizio delle operazioni. Conseguentemente, sono
supportate tutte le chiamate di procedure locali e remote, i rendezvous, passaggio di
messaggi, creazione di processi dinamici e semafori. Supporta inoltre variabili globali e
34
operazioni condivise. E’ stato impiegato in un certo numero di università e laboratori per
corsi di lavoro e progetti di ricerca coinvolti nella programmazione simultanea. E' stato
usato nei corsi di programmazione simultanea per rinforzare i concetti con piccoli progetti
di programmazione e con progetti più grandi come esperimenti di algoritmi paralleli,
database replicati, simulazioni distribuite, e parti di sistemi operativi distribuiti come file
systems e interpreti dei comandi. E’ anche stato usato come strumento in diverse tesi
master e dissertazioni di dottorandi per condurre esperimenti in parallelo programmazione
distribuita e per implementare sistemi più vasti come sistemi per linguaggi di
programmazione misti, una per l'implementazione distribuita di algoritmi grafici, ed
esperimenti con strutture di programmi upcall.
SUPERLOGO
Linguaggio didattico per sistema operativo MS/DOS, prodotto dalla società SIS.CO. di
Roma. Si presenta come un sistema integrato che possiede come ambienti naturali, oltre
alla classica tartaruga, un word processor e notevoli capacità di gestione delle immagini.
SUPERLOGO ha una filosofia educativa semplice ma profonda che riunisce in sé le più
importanti acquisizioni della scienza cognitiva con il metodo pedagogico centrato
sull'attività dell'allievo e della sua inesauribile capacità di imparare.
TCL
(Tool Command Language). E' un linguaggio di programmazione interpretato, simile al
PERL ma più razionale. Trae origine dal C e da SHELL di Unix. Le applicazioni TCL sono
da considerarsi multipiattaforma. TCL é un linguaggio di programmazione interpretato di
facile apprendimento, utilizzabile sulle maggiori piattaforme e sistemi operativi esistenti.
Permette di creare velocemente programmi di vario genere, dai più semplici ai più
complessi con GUI (Graphical User Interface) ed é gratuito. TCL (che si pronuncia "ticl") è
un linguaggio di scripting. Per quanto vi siano alcuni tentativi di creare compilatori per TCL
(in realtà non sono veri e propri compilatori, bensì parser che operano alcune
trasformazioni aggiuntive), questo è un linguaggio interpretato: un motore (per esempio la
TCL-Shell) interpreta i comandi durante l’esecuzione del programma. Ciò offre tutti i
vantaggi dei linguaggi interpretati, tra i più importanti la portabilità e la possibilità di
costruire e rifinire l’applicazione in modo interattivo.
TEX
TEX non è un programma per scrivere testi, ma per comporli tipograficamente. Mentre un
comune word-processor offre una soluzione di scrittura per tutte le esigenze, dal creare un
bigliettino di auguri al redire una raccolta di poesie, TEX si concentra (e raggiunge il suo
meglio) nella composizione di testi scientifici o comunque fortemente strutturati: articoli,
relazioni o interi libri. Per scrivere un file TEX si usa Emacs, vi o il vostro editor preferito;
poi, TEX sostituisce (per quanto può una macchina) il lavoro del tipografo: arrangia i
caratteri in righe, e queste in pagine, inserisce le figure nel testo e compone le note a piè
di pagina; TEX permette di variare un gran numero di parametri che controllano questa
composizione: le dimensioni della pagina, la grandezza del carattere, la spaziatura, ecc.
VERILOG
Linguaggio di descrizione hardware usato per progettare e documentare/spiegare sistemi
elettronici. VERILOG HDL consente ai progettisti di progettare a vari livelli di astrazione. E'
l'HDL più largamente diffuso con la sua comunità di oltre 50 mila designers. VERILOG
HDL nacque all'Automated Integrated Design Systems successivamente rinominato
Gateway Design Automation) nel 1985. La Gateway Design Automation crebbe
rapidamente con il successo del Verilog-XL e fu acquisita dalla Cadence Design Systems,
35
San Jose, CA nel 1989. Il Verilog fu inventato come un linguaggio di simulazione. L'uso
del Verilog per scopi di sintesi fu un fatto completamente successivo. Abbondano le voci
riguardo ad una possibile fusione tra la Gateway e la Synopsis nei primi giorni, quando
nessuna delle due sembrava lasciar alcuna speranza di successo dell'altra.
Probabilmente a causa della continua pressione del mercato, la Cadence Design Systems
decise nel 1990 di aprire al pubblico il linguaggio Verilog, dando così luogo alla nascita
dell'OVI (Open Verilog International). Fino a quel momento il VERILOG HDL era stato un
linguaggio di proprietà, essendo appunto di proprietà della Cadence Design Systems.
Quando nel 1991 fu creato l'OVI un piccolo numero di compagnie iniziarono a lavorare sui
simulatori Verilog, includendo Chronologic Simulation, Frontline Design Automation, e
altre. La prima di queste arrivò sul mercato nel 1992, e adesso ci sono svariati tipi di
simulatori Verilog disponibili da molte sorgenti. Nel 1993 fu nominato un gruppo di lavoro
dell'IEEE sotto il controllo del Design Automation Sub-Committee per produrre lo standard
Verilog IEEE 1364. VERILOGdivenne standard IEEE 1364 nel 1995.
VHDL
(Hardware Description Language) linguaggio per descrivere i circuiti elettronici
(principalmente quelli digitali) sia a livello di schema logico, sia dal punto di vista
comportamentale. Si può dire che c'è una corrispondenza abbastanza stretta tra lo
schema logico di progetto di un circuito digitale ed un programmi VHDL. Il linguaggio
VHDL è simile ad Ada o al PASCAL, suggerisce di scrivere le specifiche comportamentali
come programmi ovvero usando uno stile procedurale. In quest'ottica si sente dire che
VHDL supporta una descrizione procedurale. In VHDL è stato incorporato un linguaggio di
programmazione perché VHDL vuole essere un linguaggio di specifica completo che
permetta di seguire lo sviluppo di una architettura dalla specifica comportamentale dei
requisiti fino alla stesura dello schema logico che implementa.
XML
XML nasce per dare uno standard ipertestuale/multimediale alla rete, cosa che non è
riuscita a fare l’HTML. Più che un linguaggio è un metalinguaggio, ovvero un linguaggio
utilizzato per definire altri linguaggi o applicazioni. Lo sviluppo dell’ XML è iniziato nel 1996
ed è diventato uno standard del W3C dal Febbraio del 1998. La tecnologia XML non è poi
cosi nuova, infatti prima di esso c'era l’ SGML, e ovviamente l'HTML. Gli sviluppatori di
XML hanno semplicemente preso le parti migliori dell’ SGML, guidati dall'esperienza
dell'HTML, e hanno prodotto qualcosa che non è meno potente dell’ SGML, ma molto più
regolare e semplice da usare. Alcune evoluzioni, d'altronde, sono difficili da distinguere
dalle rivoluzioni... Si può’ dire che l’SGML è usato principalmente per le documentazioni
tecniche e meno per altri tipi di informazioni, per l'XML è esattamente l'opposto.
36
LINKS NEL WEB
ABC
http://www.cwi.nl/~steven/abc/
ALGOL60
http://glossario.supereva.it/index.htm
ALGOL68
http://glossario.supereva.it/index.htm
Amos
http://www.amiworld.it/corsi/amos/amos01.html
APL
http://mytech.mondadori.com/mytech/dizionario/definizione.asp?Link=0408&lnk=Dizionario
ASSEMBLY
http://www.dicea.unifi.it/pub/pluto/ildp/HOWTO/Assembly-HOWTO-2.html
AWK
http://www.univ.trieste.it/~nircdc/doc/oldunix/DUcpl.15.1.html
BASIC
http://www.bioinfovet.unimi.it/binfovet/bioin/biatica/basic.htm
http://www.agora.stm.it/G.Corsi/index/b.htm
BCPL,C
http://www.telug.it/marco/LinuxIntro/LinuxIntro/node22.html
BEFUNGE
http://www.catseye.mb.ca/esoteric/befunge/
BLISS
http://etabeta.iroe.fi.cnr.it/accesso/accesso.htm
CILK
http://supertech.lcs.mit.edu/cilk/
CLU
http://www.ptf.com/ptf/products/UNIX/current/0225.0.html#0
http://citeseer.nj.nec.com/context/479298/0
CMS
http://burks.brighton.ac.uk/burks/foldoc/49/20.htm
COBOL58
http://www.racine.ra.it/curba/rivoluzioni/informatica/2_generazione/linguaggi_di_programm
azione.htm
CONCURRENT PASCAL
37
http://burks.brighton.ac.uk/burks/foldoc/63/23.htm
CORAL
http://www.cs.indiana.edu/database/Coral/Coral.html
CPL
http://www.oasis-open.org/cover/cpl.html
CSH
http://www.perl.com/pub/language/versus/csh.html
CT
http://cil.andrew.cmu.edu/ct.html
ELF
http://www.linuxjournal.it/wirefree/0004057.htm
ERLANG
http://www.dimi.uniud.it/~francesc/UCLG/prevseminar.htm
EUPHORIA
http://www.hippy.freeserve.co.uk/euphoria.htm
FORMAC
http://www.acm.org/pubs/citations/proceedings/plan/154766/p209-sammet/
http://ase.isu.edu/ase01_07/ase01_07/bookcase/ref_sh/foldoc/subjects/11.htm
FORTH
http://www.racine.ra.it/curba/rivoluzioni/informatica/3_generazione/linguaggi_di_programm
azione_3.htm#FORTH
FORTRAN 56
http://www.list2000.com.tr/it/computers_net/programming_languages/fortran/index.asp
FORTRAN 77
http://guide.supereva.it/fortran/fortran_77/
http://www.agora.stm.it/G.Corsi/index/f.htm
GPSS
http://isgwww.cs.uni-magdeburg.de/~pelo/s1e/sa3/sa3.shtml
GUILE
http://www.gnu.org/software/guile/guile.html#whatisit
HTML
http://www.crs4.it/~mameli/THESIS/lhtml.html
http://www.di.unipi.it/~simi/corsodiinformatica/html/
ICI
http://www.lib.uchicago.edu/keith/crisis/langs/ICI.html
38
ICON
http://www.cs.arizona.edu/icon/
http://www.lib.uchicago.edu/keith/crisis/langs/Icon.html
IDL
http://www.rsinc.com/idl/
INTERCAL
http://www.ptf.com/ptf/products/UNIX/current/0319.0.html
JCL
http://www.okstate.edu/cis_info/cis_manual/jcl_toc.html
JOVIAL
http://www.seadeo.com/
LIMBO
http://translate.google.com/translate_c?hl=it&u=http://inferno.lucent.com/inferno/limbo.html
&prev=/search%3Fq%3Dlinguaggio%2B%2Blimbo%26start%3D50%26hl%3Dit%26safe%
3Doff%26sa%3DN
LISP
http://www8.informatik.uni-erlangen.de/html/lisp/histlit1.html
LOGO
http://www.unipa.it/~facscfor/plebe/logo_intr/s7node2.html
LUA
http://igwe5.vub.ac.be/lua/
MATLAB
http://programmarein.supereva.it/indmat/matlab.htm
MERCURY
http://www.cs.mu.oz.au/research/mercury/information/doc/reference_manual_toc.html
MESA
http://www.dobe.org/us/az/mesa/cat/119/past
MIRANDA
http://www.cs.ukc.ac.uk/pubs/1995/59/
ML
http://www.mcdougallittell.com/lit/liactspe.htm
MODULA 2
http://murray.newcastle.edu.au/users/staff/peter/m2/Modula2.html
MODULA 3
http://www.research.compaq.com/SRC/modula-3/html/bib.html#m3-Har92
39
MUMPS
http://www.cpan.org/modules/by-category/09_Language_Interfaces/Language/LanguageMumps-1.06.readme
OCCAM
http://www.racine.ra.it/curba/rivoluzioni/informatica/4_generazione/Linguaggi.htm
PASCAL
http://www.racine.ra.it/curba/rivoluzioni/informatica/3_generazione/linguaggi_di_programm
azione_3.htm#PASCAL
http://www.allnet.it/AppuntiLinux/a2222.html#title2811
PERL
http://www.html.it/faq/perl/index.html
http://www.pluto.linux.it/ildp/journal/pj9801/perl.html
PHP
http://www.devshed.com/Server_Side/PHP/
PILOT
http://www.racine.ra.it/curba/rivoluzioni/informatica/3_generazione/linguaggi_di_programm
azione_3.htm
PL/1
http://www.racine.ra.it/curba/rivoluzioni/informatica/2_generazione/linguaggi_di_programm
azione.htm
POP
http://barada.canisius.edu/~meyer/CCSCNE/finalHTML/meyer.html
PROGRAPH
http://www.cpan.org/modules/by-category/09_Language_Interfaces/Language/LanguageMumps-1.06.readme
PROLOG
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/lang/prolog/0.html
REBOL
http://www.rebol.com/
http://www.amiworld.it/corsi/rebol/introduzione.htm
RPG
http://www-1.ibm.com/servers/eserver/iseries/db2/qrpgsrc.htm
SCHEME
http://www.racine.ra.it/curba/rivoluzioni/informatica/4_generazione/Linguaggi.htm
http://www.linuxdidattica.org/linguaggi/a2prog31.html#index1479
SETL
http://birch.eecs.lehigh.edu/~bacon/doc.html
40
SML
http://www.interfacecontrol.com/sml/Sml/mainpage.htm
SNOBOL
http://cs.fit.edu/~dclay/cse5040/snobol.html
SQL
http://www.nupedia.com/article/short/The+SNOBOL+4+Programming+Language/
http://lagash.dft.unipa.it/AL/al244.htm
SR
http://www.mcs.drexel.edu/~shartley/OSusingSR/
TCL
http://online.infomedia.it/riviste/dev/71/articolo24/articolo.htm
TEX
http://www.ntg.nl/english.html
VERILOG
http://www.verilog.com
VHDL
http://www.ntg.nl/english.html
http://www.xilinx.com/support/training/abstracts/2.1/vhdl/abvhlangcncpts.htm
http://www.interq.or.jp/japan/se-inoue/e_cpld4_3.htm
VRML
http://www.lucia.it/vrml/tutorial/lections/lections/chap3.html
41
APPENDICE: Le schede
Nelle schede riassuntive seguenti (dei linguaggi di programmazione trattati) è stato preso
in considerazione:
ANNO DI NASCITA12: anno di nascita e creatori del linguaggio.
GENITORI13: quei linguaggi che hanno portato alla creazione del nuovo linguaggio.
TIPO DI LINGUAGGIO: tipo di linguaggio in base alla classificazione proposta.
PROGRAMMAZIONE IN GRANDE(G)/PICCOLO(P): La programmazione in piccolo è
associata a quei linguaggi che hanno scopo prettamente didattico o linguaggi di
simulazione. Negli altri casi la programmazione è sempre in grande.
IN BREVE: Brevi commenti di complemento, a quanto detto in precedenza, sul linguaggio
considerato.
ABC
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
1987 Guerts, Meertens, Pemberton
B
Linguaggio imperativo
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Ha una struttura a blocchi. E’ stato creato per sostituire il
BASIC, molto semplice indirizzato ai principianti. Utilizzato in
ambienti Unix e per prototipi.
I tipi di dati utilizzati sono: stringhe, liste, array, record e
infiniti numeri. Per facilitare la programmazione top down
viene supportato un meccanismo per la dichiarazione di
operazioni in linea. Non è realmente distinto dal suo
ambiente di programmazione.
Al contrario della maggior parte dei linguaggi, che usano dei
comandi per indicare l’inizio e la fine del codice, l’ABC usa le
rientranze.
12
L’ anno di nascita di un linguaggio di programmazione è molto generico in quanto fonti riportano la data
del progetto altre la data della prima realizzazione, altre ancora ne riportano la data della prima descrizione
ufficiale.
13 I genitori sono i linguaggi dai quali un linguaggio eredita parte delle strutture dati e proprietà, sui quali
vengono poi sviluppate e aggiunte le restanti strutture dati al nuovo linguaggio.
42
ACSL
ANNO DI NASCITA
Mitchell & Gauthier, 1981
GENITORI
FORTRAN
TIPO DI LINGUAGGIO
Linguaggio applicativo per simulazione matematiche
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
ACSL è usato prevalentemente da specialisti nell'area
ingegneristica, biomedica, scientifica in genere. La sua
principale prerogativa è la capacità con cui è in grado di
modellare sistemi complessi con algoritmi numerici di
integrazione. E' una prodotto commerciale, ma sono
disponibili versioni demo di sue varianti.
43
ALEF
ANNO DI NASCITA
P. Winterbottom, Bell Labs (Lucent), 1995
GENITORI
C
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, parallelo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Nonostante somigli al C dal punto di vista lessicale, ALEF
sviluppa un differente tipo di dati e modello di esecuzione:
supporta tipi puntatori (chiamati fat pointers), processi
paralleli, blocchi protetti, tipi di dato astratti, run-time type
information, e altre facilitazioni che il C non ha.
44
Algol 60
ANNO DI NASCITA
1960
GENITORI
FORTRAN
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio di programmazione (1960), sintetico, con
struttura a blocchi, nidificazione, variabili statiche, tipi di dati
definibili, espressioni condizionali come IF...THEN...ELSE,
FOR...NEXT.
Ha avuto molte estensioni (come ALGOL 60 Modified,
ALGOL 60 Revised, ALGOL C, ALGOL D, ALGOL N,
ALGOL W, ALGOL X, ALGOL Y).
Dall'ALGOL hanno tratto ispirazione linguaggi come C e
Pascal.
L'ALGOL 60 è un linguaggio apparso alcuni anni dopo
l'introduzione del FORTRAN.
Questo nuovo linguaggio all'epoca era più complesso ed
ebbe una grande influenza sul progetto dei futuri linguaggi
di programmazione; i suoi autori prestarono molta
attenzione alla regolarità della sin tassi, alla struttura
modulare e ad altre caratteristiche di solito associate ai
linguaggi strutturati ad alto livello.
Sfortunatamente, l'ALGOL 60 non si diffuse mai veramente
negli Stati Uniti, a parere di molti per l'astrazione e la
genericità del linguaggio.
45
Algol 68
ANNO DI NASCITA
1968
GENITORI
ALGOL 60
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, parallelo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Mantiene
le
caratteristiche principali di ALGOL60:
linguaggio
di
programmazione
procedurale,
usato
principalmente per problemi matematici. Non ebbe una
grande diffusione ma ha esercitato grande influenza
culturale su alcuni linguaggi moderni come il PASCAL,
l'Ada e il C.
46
AMOS
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
BASIC
Applicativo
3 GL
IN P
Usato per la creazione di videogiochi.
E’ suddiviso in due parti distinte: la prima, rappresentata da
un editor sul quale noi stendiamo il nostro programma, la
seconda è invece un ambiente che chiameremo modo
diretto, cioè una specie di Shell del WB, nel quale è
possibile usare i comandi a disposizione di AMOS
direttamente alla premuta dell'invio.
47
APL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1960
--Linguaggio funzionale, imperativo procedurale
3GL
IN G
Acronimo
di
A
Programming
Language
(letteralmente, un linguaggio di programmazione).
Linguaggio introdotto nel 1968 per applicazioni
scientifiche e matematiche. L'APL è un linguaggio
basato su sottoprogrammi ,utilizza un grande
insieme di caratteri e una sintassi concisa ed è
disponibile per l'utilizzo su macchine compatibili
con i PC.
48
APPLE SCRIPT
ANNO DI NASCITA
Apple Computer, 1993 (MacOS System 7), 1994 (MacOS
7.5)
GENITORI
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, scripting
GENERAZIONE
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
APPLESCRIPT è un linguaggio di programmazione per
Macintosh che permette il controllo di programmi esistenti
nonché la creazione di programmi a sé stanti che
interagiscono con i programmi esistenti. Nonostante si tratti
di un linguaggio di programmazione, la conoscenza di
elementi tecniche non è requisito indispensabile. Infatti, al
posto di strani comandi APPLESCRIPT usa frasi in italiano o
in altre lingue, e può tradurre automaticamente da un dialetto
(lingua) ad un'altro
49
ASSEMBLY
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1959
Linguaggio macchina
Imperativo procedurale
2GL
IN G
Si possono realizzare le “viscere” dei sistemi operativi,
degli interpreti, dei compilatori e dei giochi, laddove un
compilatore C non riesce a fornire l'espressività richiesta.
E’ necessario conoscere tutto l’hardaware, le schede, la
cpu del calcolatore.
50
AUTOLISP
ANNO DI NASCITA
Autodesk, fine anni 80
GENITORI
LISP
TIPO DI LINGUAGGIO
Linguaggio applicativo, funzionale
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Dialetto del LISP usato come estensione di linguaggio per
AutoCAD(tm) e altri prodotti della Autodesk. Supportato
pienamente da AutoCAD 11-13(versioni).
51
AWK
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1977 Aho, Weinberger, Kernighan
--Linguaggi applicativo, funzionale
4GL
IN P
AWK è un linguaggio di programmazione nato
fondamentalmente per l'analisi e la rielaborazione di file di
testo organizzati in una qualche forma tabellare. AWK
potrebbe essere usato per fare anche di più, solo che
quando si supera un certo limite di complessità, non è più
conveniente il suo utilizzo.
AWK è un interprete, nel senso che i programmi fatti
secondo questo linguaggio, vengono eseguiti direttamente,
senza essere compilati, come nel caso degli script di shell.
Un programma AWK può essere scritto in un file di testo
normale, oppure può essere fornito come argomento della
riga di comando dell'interprete: il binario `awk'. Un
programma AWK può contenere la dichiarazione di funzioni
definite liberamente. Queste dichiarazioni vanno fatte al di
fuori delle regole normali. Il linguaggio AWK può gestire
anche gli array, che comunque sono di tipo associativo. I
programmi in AWK sono generalmente brevi, pertanto il
linguaggio si presta alla prototipazione ed alla realizzazione
di semplici utility usa-e-getta.
52
BASIC 56
ANNO DI NASCITA
1965
GENITORI
FORTRAN
TIPO DI LINGUAGGIO
Linguaggi imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
BASIC (Beginner's All-purpose Symbolic Instruction Code) Linguaggio di programmazione che si avvale di parole
inglesi del linguaggio comune. Fu sviluppato nel 1964 da J.
Kemeny e T. Kurtz al Dartmouth College per essere
destinato ai principianti. Di derivazione FORTRAN, e' un
linguaggio, semplice e potente, facilmente strutturabile. E'
utilizzato per applicazioni di ogni tipo sia sui personal
computers sia sui "main frame" tanto da essere diventato il
linguaggio più' diffuso al mondo. Il BASIC è un linguaggio
ottimale per la realizzazione di programmi brevi, ma mostra
i suoi limiti nei programmi complessi. In ambiente MS-DOS
è uno standard di fatto il GW-BASIC. Per la sua interattività
e per la facilità della programmazione è molto diffuso nelle
scuole.
53
BCPL
ANNO DI NASCITA
1967 Richards
GENITORI
CPL, ALGOL 60
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio fondamentale che ha dato origine al C. Il
linguaggio B fu ripreso ai Laboratori Bell, dove Ken
Thompson e Dennis M. Ritchie lo modificarono e lo
ridenominarono NB. All'inizio degli anni '70, Thompson
utilizzò NB per riscrivere la parte basilare di Unix per la
seconda edizione. Poco tempo dopo, a partire dall'NB,
Ritchie sviluppò il C, che divenne presto il linguaggio per
scrivere nuove utility e applicazioni oltre al Sistema
Operativo.
I tipi di dato utilizzati sono: numeri interi, reali, bit, flussi di
dati I/O, stringhe e vettori.
54
BEFUNGE
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1993 Chris Pressey,
IN BREVE
E’ un linguaggio di programmazione che utilizza una pila e
una griglia bidimensionale. Ogni elemento (cellula) della
griglia può contenere o dati o un istruzione. Si hanno diverse
versioni del linguaggio ad ognuna è associata una griglia di
dimensioni diverse
Esistono anche Unefunge (Unidimensionale) e trefunge
(tridimensionale).
Funzionale
3 GL
G
55
BLISS
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1970 Wulf, Russell ed altri
C
Funzionale
3 GL
G
IN BREVE
Linguaggio sviluppato dalla Dec per la programmazione di
sistema
Utilizzava un sistema a microistruzioni molto potente tanto
che è stato usato per la codifica di sistema, rendendo più
semplice la compilazione per linguaggi più difficili.
Inizialmente
noto
come
linguaggio
della
DEC,
successivamente è uscita una versione free Bliss-32.
56
C
ANNO DI NASCITA
1974
GENITORI
ALGOL 68 , BCPL
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Nel 1972, presso i Bell Laboratories, Dennis Ritchie
progettava e realizzava la prima versione del linguaggio C.
Ritchie aveva ripreso e sviluppato molti dei principi e dei
costrutti sintattici del linguaggio BCPL, sviluppato da Martin
Richards, e del linguaggio B, sviluppato da Ken Thompson,
l'autore del sistema operativo Unix. Successivamente gli
stessi Ritchie e Thompson riscrissero in C il codice di Unix.
Il C si distingueva dai suoi predecessori per il fatto di
implementare una vasta gamma di tipi di dati (carattere,
interi,
numeri
in
virgola
mobile,
strutture)
non
originariamente previsti dagli altri due linguaggi. Da allora
ad oggi il C ha subito trasformazioni: la sua sintassi è stata
affinata, soprattutto in conseguenza della estensione
object-oriented (C++). Nel 1983, l’Istituto Nazionale
Americano per gli Standard (ANSI) ha costituito un comitato
per una definizione del linguaggio C non ambigua e non
dipendente dalla macchina: il risultato è lo standard ANSI
per il C.
57
C*
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1987, Pensare Machines Corp.
C
Parallelo
3 GL
G
IN BREVE
Dialetto del C, di cui estende la sintassi e la semantica per
l’elaborazione in parallelo. Le differenze maggiori con il C
sono: elementi di dati paralleli e settori paralleli di calcolo. I
tipi di dati sono gli stessi del C
58
CHARITY
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
----Linguaggio funzionale
3GL
IN G
CHARITY è basato sulla teoria dei datatypes .
Questi sono suddivisi in due sottoclassi:
inductive datatypes(sviluppati dai progettisti
familiare) e coinductive datatypes
in
modo
59
CILK
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
Joerg, Leiserson, et al, MIT, 1995
C
Parallelo
3 GL
IN G
E’ un “dialetto” del C, aggiunge parecchie nuove parole
chiavi per sostenere multi-threading dinamico e asincrono.
Rispetto al C viene aggiunta la capacità di chiamata in
parallelo. Può essere utilizzato in ambiente Unix e
Windows NT
60
CLU
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1974-77 B. Liskov
Algol
Imperativo Procedurale
3 GL
G
IN BREVE
E’ un linguaggio che ha una sintassi molto simile a quella
dell’Algol 60 cui aggiunge tipi di dato astratti e alcune
caratteristiche avanzate. CLU è l’abbreviazione di CLUster,
infatti, la programmazione utilizza procedure, clusters e
interazioni.
Il SO SWIFT è stato scritto in CLU
61
CMS
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1974 Rand Corporation US Navy
IN BREVE
E’ un linguaggio di programmazione utilizzato quasi
esclusivamente in real time, utilizzato dalla forza navale degli
USA. I tipi di dati supportati sono:
Ø numeri interi
Ø numeri a virgola fissa e mobile
Ø stringhe
Il suo periodo è stato tra il 1976 e 1986, sono nate parecchie
varianti
CMS-2/Y e CMS-2/M per macchine a 16 bit e CMS-2/L per
macchine a 32 bit
Imperativo procedurale
3 GL
G
62
COBOL 58
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1958
--Linguaggio imperativo procedurale
3GL
G
IN BREVE
COBOL: Common Business Oriented Language, linguaggio
di programmazione implementato nel 1959-60, molto
diffuso anche oggi in ambiente aziendale.
Il COBOL, come il FORTRAN, è static o ossia la memoria
richiesta per l'esecuzione del programma è già nota in
compilazione.
Nonostante gli aggiornamenti e "tool" di sviluppo, che
permettono ai programmi scritti con questo linguaggio di
operare con database relazionati ed internet, le applicazioni
COBOL
vengono
definite
legacy.
Il COBOL ha introdotto per primo il prodotto cartesiano. I
costruttori del prodotto cartesiano per questo linguaggio
sono i record.
Le ennuple di attributi quali (nome, cognome, indirizzo,
città, cap, etc.) vengono de scritte da record.
63
CONCURRENT PASCAL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1975 Brinch Hansen
PASCAL
Linguaggio concorrente
3GL
IN G
Possiamo considerarlo un “dialetto” del PASCAL, rispetto
al quale vengono aggiunti:
-Elaborazione multitask
-Dati astratti
-Supporto video
-istruzione di ciclo
64
CORAL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1964 Roberts
ALGOL, JOVIAL
Logico Imperativo procedurale
4GL
IN P
Linguaggio che ha dato le origini al BCPL.
Adottato dall’esercito inglese fino all’arrivo di Ada.
Versioni Coral 64 e 66.
65
CPL
ANNO DI NASCITA
1963 (Università di Cambridge e Londra)
GENITORI
ALGOL 60
TIPO DI LINGUAGGIO
Imperativo procedurale, funzionale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio che ha dato le origini al BCPL
66
CSH
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
SH, C, PERL
Scripting
3 GL
P
E’ stato progettato per la gestione e lo sviluppo di software in
ambiente Unix. Supporta un solo tipo di dato primitivo: le
stringhe.
Il CSH non ha dei comandi particolari per i sottoprogrammi a
differenza della maggior parte dei linguaggi. Molto popolare
è anche il “csh of Twenex” noto come tcsh
67
CT
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1990-94 Andersen, Sherwood et al, Carnegie-Mellon
PASCAL, C, FORTRAN
Linguaggio imperativo procedurale
3GL
IN G
Si tratta di un linguaggio nel quale sono riscontrabili
caratteristiche del C, del PASCAL e del FORTRAN ma
notevolmente potenziato da capacità multimediali quali
:supporto grafico di facile impiego, interazioni del mouse.
Ideato per animazioni, interfaccia utente e presentazioni
multimediali.
Tipi di dato:
-numeri interi
-numeri reali
-stringhe
-booleani
Da notare che molti comandi servono per l’elaborazione di
video, suoni, dati grafici.
68
ERLANG
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
--LISP
Linguaggio funzionale, distribuito
3G
IN G
ERLANG è un linguaggio funzionale utilizzato nell'industria,
in particolare nell'implementazione di sistemi distribuiti. Il
sistema di transizione indotto da un programma ERLANG
ha, in generale, un numero infinito di stati e il model
checking non è più, di conseguenza, un problema
decidibile. E' stato studiato un sottoinsieme di ERLANG,
$\mu$-Erlang, dimostrando per esso l'indecidibilità del
Model Checking e applicando ad esso una tecnica di
interpretazione astratta. Sono state infine svolte alcune
semplici sperimentazioni, utilizzando il Model Checker
NuSMV.
69
EUPHORIA
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1993. Craig, Rapid Deployment Software
BASIC, C, PERL
Funzionale
3 GL
P
IN BREVE
E’ utilizzato per lo sviluppo di video game.
Il linguaggio considera tutti gli elementi come atomi e
sequenze, permette, inoltre, la definizione di dati astratti,
dichiarando per ognuno una funzione booleana. EUPHORIA
sta per: End User Programming with Hierarchical Objects for
Robust Interpreted Applications
70
FORMAC
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1964 Jean Sammet et al, IBM
FORTRAN
Imperativo procedurale, funzionale
3 GL
G
IN BREVE
E’ una variante del FORTRAN con parecchie estensioni,
soprattutto nell’ambito dei calcoli. I tipi di dato supportati
sono gli stessi del FORTRAN più i numeri razionali, i simboli
71
FORTH
ANNO DI NASCITA
1970 Charles Moore
GENITORI
--TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
In origine destinato alla programmazione delle osservazioni
astronomiche mediante il telescopio e, in seguito, adattato
per l’impiego nei microcomputer e in robotica. I programmi,
nonostante la sua efficienza, possono risultare difficili da
leggere. Versioni Forth 79 e 83.
72
FORTRAN 56
ANNO DI NASCITA
1956 J. Backus
GENITORI
--TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
FORTRAN (FORmula TRANslation) - Traduttore di formule.
Linguaggio imperativo orientato alla matematica, alla
ricerca scientifica e tecnologica, basato sull'impiego di
notazioni simili a quelle dell'algebra e dell'analisi
infinitesimale. E' un linguaggio modulare che consente di
utilizzare sottoprogrammi esterni, è poco interattivo ed è
dotato di ricorsività. E’ stato sviluppato, in ambiente IBM,
negli anni cinquanta da J. Backus e messo definitivamente
a punto dopo anni di studi e di ricerche. E' stato il primo dei
linguaggi di programmazione a divenire standard nelle
applicazioni tecnico-scientifiche.
73
FORTRAN 77
ANNO DI NASCITA
1977
GENITORI
FORTRAN 56 (influenze ALGOL 60 )
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Il FORTRAN è ancora in evoluzione; FORTRAN77 è uno
standard internazionale conforme alla quasi totalità dei
compilatori attuali, ma è già disponibile un nuovo standard,
FORTRAN90, che non è ancora completamente sviluppato.
Tuttavia molti compilatori già implementano alcune delle
nuove features del FORTRAN90 come estensioni del
FORTRAN77.
74
GPSS
ANNO DI NASCITA
1961
GENITORI
LISP
TIPO DI LINGUAGGIO
Linguaggio applicativo, funzionale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
GPSS(General Purpose Simulation System)
Linguaggio di simulazione realizzato nel 1961 da Geoffrey
Gordon(IBM) e successivamente sviluppato per circa un
decennio. Si tratta di un linguaggio di simulazione e come
tale, in grado di facilitare il compito del programmatore
capace di scrivere con poche righe di programma interi
modelli o sottomodelli che altrimenti richiederebbero tempi
di stesura assai più lunghi ,con conseguente aumento delle
probabilità di errore.
A questi vantaggi, tuttavia, si possono contrapporre alcuni
inconvenienti quali la minore efficienza e la scarsa
diffusione del linguaggio stesso dovuta al fatto che soltanto
un numero ristretto di persone è in grado di padroneggiare
efficacemente questo tipo di linguaggio.
75
GUILE
ANNO DI NASCITA
GENITORI
SCHEME
TIPO DI LINGUAGGIO
Linguaggio applicativo, scripting
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
È il linguaggio di estensione ufficiale del Progetto GNU e
viene utilizzato da molte applicazioni Gnome
76
HASKELL
ANNO DI NASCITA
1990 Hughes, Wadler e Peterson
GENITORI
--TIPO DI LINGUAGGIO
Linguaggio funzionale
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Perché si usa HASKELL?
Viene utilizzato nella realizzazione di sistemi software
di grandi dimensioni la cui realizzazione è difficile e
costosa.
E’particolarmente
adatto
alla
realizzazione
di
programmi che devono essere altamente modificabili
e mantenibili.
Cosa offre?
Aumento del rendimento del programmatore
Codice più corto, più libero, più mantenibile
Pochi errori
Più alta affidabilità
Riduzione del “semantic gap” tra programmatore e
linguaggio
Tempi d’esecuzione più corti
77
HTML
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
‘90
SGML
Markup
3 GL
G
IN BREVE
HTML sta per HyperText Markup Language è un formato per
i documenti della rete, nasce all'inizio degli anni ‘90, abbinato
in particolare al primo navigatore: Mosaic. Da quel momento
a oggi il formato HTML ha subito diversi aggiornamenti; si
ricorda in particolare la versione 2.0 del 1995 e la versione
3.2 del 1997. Allo stato attuale, lo sviluppo di questo
standard è condotto da W3C (World Wide Web Consortium).
Lo spirito alla base dello sviluppo dell'HTML da parte del
W3C, come ente indipendente, è quello di ottenere un
formato multimediale-ipertestuale adatto per la lettura
attraverso qualunque tipo di mezzo.
HTML è un linguaggio che ha fatto dilagare il Web ma che
per esempio non potrà mai imporsi come linguaggio
universale per la costruzione di applicazioni sul Web; è infatti
un linguaggio nato sostanzialmente per un publishing
elementare, ma ben presto ha dovuto lasciare spazio allo
sviluppo di tecnologie parallele che potessero assicurare in
fondo la sua sopravvivenza: stiamo parlando dei vari
Javascript e plugin tipo Shockvawe o Acrobat reader, che in
pratica hanno piano trasformato l' HTML in un assemblatore
di tecnologie, piuttosto che un linguaggio vero e proprio. Da
questi problemi nasce XML.
78
ICI
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1992 Tim Long
C, Python, PERL
Imperativo procedurale, scripting
3 GL
G
IN BREVE
E’ un linguaggio di scripting destinato soprattutto allo
sviluppo d’applicazioni. Ha una sintassi molto simile al C,
però è progettato in modo da ridurre gli errori di
programmazione. I tipi di dati supportati sono:
numeri interi e reali
stringhe
archivi
Fa inoltre largo uso di insiemi e le relative operazioni
79
ICON
ANNO DI NASCITA
’70 Griswold
GENITORI
SNOBOL, PASCAL, C
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, applicativo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
È il linguaggio di estensione ufficiale del Progetto GNU e
viene utilizzato da molte applicazioni Gnome.
Tipi di dato:
-numeri interi e reali
-stringhe
-insiemi
-liste
-record
Creato per ambiente Unix si è subito diffuso in MS Dos,
Windows e Mac.
80
IDL
ANNO DI NASCITA
1981 Nestor, Lamb, Wulf
GENITORI
TIPO DI LINGUAGGIO
Imperativo procedurale, applicativo
GENERAZIONE
4GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
IDL ( Interactive Data analysis Language) è un ambiente per
computazione
scientifiche
che
unisce
matematica,
visualizzazione dei dati, grafici scientifici, un tool per la
creazione e la gestione di interfacce grafiche per l'analisi e la
visualizzazione di dati scientifici.
81
INTERCAL
ANNO DI NASCITA
1972 Woods Lyon
GENITORI
TIPO DI LINGUAGGIO
Imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Non ha niente in comune con i maggiori linguaggi di
programmazione, difficile da utilizzare e da leggere.
Ammette solo due tipi di dato primitivi: gli interi senza segno
da 16 e 32 bit.
82
JCL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
--Imperativo procedurale, scripting
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio per la programmazione di sistema OS/360 IBM
In generale difficile da utilizzare.
83
JOVIAL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
1959/61 Schwartz
ALGOL 60
Imperativo Procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Usato dall’aeronautica USA, poi venne sostituito da ADA,
PASCAL
Versioni Jovial: 1,2, 3.
84
LIMBO
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
--C, PASCAL
Linguaggio imperativo procedurale, distribuito
3GL
IN G
Il LIMBO è un nuovo linguaggio di programmazione,
progettato da Sean Dorward e da da Phil Winterbottom.
Un’applicazione LIMBO consiste di uno o più moduli
ciascuno dei quali fornisce una parte di implementazione.
Un modulo che include un altro modulo include la relativa
parte di dichiarazione.
85
LISP
ANNO DI NASCITA
1962 John McCarthy
GENITORI
--TIPO DI LINGUAGGIO
Linguaggio funzionale (PER ECCELLENZA)
GENERAZIONE
4GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
(LISt Processor, elaboratore di liste)
Linguaggio
sviluppato
per
applicazioni
nel
campo
dell'Intelligenza Artificiale fra il 1957 e il 1960 da John
McCarthy. E' stato il primo linguaggio "non imperativo", ovvero
in grado di trattare liste di qualsiasi natura, numeri compresi.
Un programma in questo linguaggio è un insieme di funzioni
matematiche composte fra loro in modo che ciascuna di esse
ricavi i propri dati da quella precedente. Il LISP possiede una
sintassi semplice e uniforme che lo rende ideale per
manipolare informazioni e confrontare problemi
86
LOGO
ANNO DI NASCITA
1967
GENITORI
LISP
TIPO DI LINGUAGGIO
Linguaggio funzionale applicativo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
LOGO è un linguaggio per scopi didattici, ma questo non
significa che manchi di alcune funzionalità (come per esempio il
BASIC), anzi, possiede tante funzioni, soprattutto per la
manipolazione di simboli non numerici, mancanti nella maggior
parte degli altri. Le limitazioni di LOGO sono tutte nelle
prestazioni. E’ un linguaggio interpretato ed interattivo, per
rendere più facile ed immediato il suo uso, ma questo penalizza
la velocità. Un algoritmo in Logo è quindi in generale più lento
che per esempio in C. Su LOGO è rimasto famoso il motto no
threshold no ceiling, ovvero che non ha limiti superiori ed
inferiori, ed infatti è stato utilizzato con successo con bambini in
età pre -scolare, così come sono state sviluppate ricerche
avanzate in campi come Natural Language Processing.
87
LUA
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1994 W. Celes, R. Ierusalimschy, L.H. de Figueiredo, PUCRio
PASCAL, PERL
applicativo, scripting
3 GL
IN P
E’ un linguaggio utilizzato per estendere delle applicazioni,
quindi non esiste un programma principale in LUA. Molto
simile al PASCAL ha però una sostanziale differenza nei tipi
di dato. Le variabili possono non essere dichiarate e
possono assumere qualunque valore.
88
MATLAB
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1964
Linpak, Eispack
Linguaggio applicativo
4GL
IN P
MATLAB è un linguaggio ad alto rendimento per la
computazione tecnica. Integra il calcolo, la visualizzazione
e la programmazione in un ambiente di facile impiego in cui
i problemi e le soluzioni sono espressi in notazione
matematica familiare. MATLAB è un sistema interattivo in
cui l'elemento di base è un array quindi non richiede il
dimensioning. Ciò permette la risoluzione di molti problemi
di calcolo tecnici, in particolare quelli con le formulazioni
vettorali e matriciali, attraverso algoritmi molto più semplici
e snelli rispetto a quelli che sarebbero necessari in un
programma in linguaggio scalare non interattivo quali C o il
FORTRAN. Si è evoluto durante gli anni con contributi dati
da molti utenti. In ambienti universitari è l'attrezzo didattico
standard per corsi introduttivi e corsi avanzati, nella
matematica, nell'ingegneria e nella scienza.
89
MERCURY
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1993 Mercury Project, University of Melbourne
PROLOG, C
Logico
3 GL
G
IN BREVE
E’ un linguaggio classificato come logico, ma alcune
caratteristiche lo portano ad essere anche funzionale. Ha
una sintassi molto simile al PROLOG.
Il MERCURY viene distribuito con alcuni sistemi Linux, ma
ha bisogno di un buon compilatore C, infatti il compilatore del
MERCURY genera un codice in C.
90
MESA
ANNO DI NASCITA
1977 Xerox Park
GENITORI
PASCAL, ALGOL 68
TIPO DI LINGUAGGIO
Imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
MESA fu utilizzato internamente dalla Xerox per sviluppare
Viewpoint, la Xerox Star, MDE, e il controllore per un highend copier..
91
MIRANDA
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
1985 David Turner, University of Kent
ML
Funzionale
3 GL
G
IN BREVE
E’ un linguaggio progettato sia per la programmazione
funzionale che per lo sviluppo di applicazioni. Tipi di dati:
Ø booleani
Ø numeri interi e reali
Ø caratteri
Ø stringhe
Ø liste
E’ disponibile in molti sistemi Unix, Linux compreso
92
ML
ANNO DI NASCITA
1973 Edimburgo (Gordon Milner Wadswort Cardelli Burstall
McQueen Sanella)
GENITORI
TIPO DI LINGUAGGIO
Funzionale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
In realtà ML rappresenta una famiglia di linguaggi funzionali:
ML, SML, SML/NJ, CAML, EML ed altri
Si basa su parecchie librerie e supporta molti tipi di dato
93
MODULA 2
ANNO DI NASCITA
1978 Wirth
GENITORI
PASCAL, MESA
TIPO DI LINGUAGGIO
Imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio che enfatizza la programmazione modulare. Ad
alto livello, si basa sul PASCAL, caratterizzato dalla
mancanza di funzioni standard e di procedure.
94
MODULA 3
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1980
PASCAL, MODULA2
Linguaggio imperativo procedurale
3GL
IN G
Progettato verso la fine degli anni 80 presso la Digital
Equipment Corporation e presso la Olivetti corregge molte
delle mancanze del PASCAL e di MODULA2 riguardo la
tecnologia della programmazione pratica.
MODULA3 è un linguaggio di programmazione pratico per
la realizzazione di grandi progetti del software.
95
MUMPS, M
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
Octo Barnett M.D. et al, Mass. General Hospital, 1969
Linguaggio imperativo procedurale, markup, distribuito
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio molto semplice usato originariamente elaborare e
visualizzare dati di tipo medico.
Tipo di dati:
record, liste, numeri
La maggior parte delle versioni di MUMPS sono commerciali,
esistono però delle versioni free per Unix, Vms, Dos e
Windows.
96
OBERON
ANNO DI NASCITA
1988 Wirth
GENITORI
PASCAL, MODULA2
TIPO DI LINGUAGGIO
Imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Rispetto al MODULA2, OBERON elimina molte cose:
records di varianti, types di enumerazione, i loop “for”. Per
contro
aggiunge:
record
types
estensibili,
arrays
multidimensioneali aperti e garbage collection.
97
OCCAM
ANNO DI NASCITA
1982 David May
GENITORI
CSP, EPL
TIPO DI LINGUAGGIO
Linguaggio parallelo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
E’il più diffuso fra i linguaggi paralleli:in tali linguaggi vi sono
dei meccanismi espliciti per indicare compiti che possono
essere effettuati in parallelo.
98
OCTAVE
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
--MATLAB
Linguaggio applicativo
4GL
IN P
Linguaggio applicativo, il suo utilizzo principale è nel
calcolo numerico dove si dimostra versatile ed efficace. E’ il
clone di MATLAB nel senso che è in grado di operarne in
modo perfettamente identico con gli stessi comandi. Quindi
per chiunque non voglia comprare il costoso MATLAB può
optare per il gratuito OCTAVE ottenendo gli stessi risultati.
99
PASCAL 70
ANNO DI NASCITA
1971 Wirth
GENITORI
ALGOL 60
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio di programmazione sviluppato dal Prof. N. Wirth
nel 1970 al politecnico di Zurigo. Il PASCAL è elegante,
versatile, potente; consente la programmazione strutturata
con la tecnica "top down" e la modularità. E' il più utilizzato
nelle università per la soluzione di problemi, anche molto
complessi. E' stato scelto dal ministero della Pubblica
Istruzione come linguaggio ufficiale del Piano Informatico
Nazionale. La versione di maggior successo è l'UCDS
Pascal realizzato dall'Università di San Diego (California).
100
PERL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
Fine anni 80 Lary Wall
Ha dentro di sé caratteristiche prelevate da numerosi
linguaggi. Chi ha programmato con le shell script
riconoscerà qualcosa della Bourne shell e della C shell,
così come certe altre istruzioni ricordano il sed, l'AWK, il C,
passando addirittura per alcuni dialetti del BASIC.
Linguaggio scripting
3 GL
IN G
Il PERL è un linguaggio di programmazione scritto da Larry
Wall con l'ausilio di centinaia di altre persone sparse per il
mondo unite solo da una simile passione ed una
connessione
alla
grande
rete.
La caratteristica peculiare di questo linguaggio è la libertà di
espressione che consente al programmatore. E’ un
linguaggio “ridondante” dal punto di vista delle strutture
logiche e di flusso. Questo rende più facile per un
programmatore accostarsi al linguaggio.
101
PHP
ANNO DI NASCITA
1994 Lerdorf
GENITORI
C , JAVA , PERL
TIPO DI LINGUAGGIO
Scripting
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Il funzionamento è molto simile a quello della tecnologia ASP
(proprietaria della Microsoft), offrendo però molte più
funzionalità. Un altro vantaggio è che si tratta di una
tecnologia "aperta", disponibile sia per piattaforme Unix che
Windows. I siti realizzati possono quindi essere trasferiti da
una macchina Unix ad una Windows senza particolari
difficoltà. Una delle funzionalità più importanti del linguaggio
PHP consiste nella possibilità di interfacciarsi con tutti i
principali Database presenti sul mercato. Linguaggio
scripting, non browser dipendente. Permette lo sviluppo di
pagine dinamiche.Opera nel lato server, quindi prima che le
pagine giungano al browser.
102
PILOT
ANNO DI NASCITA
1969 S. Francisco Medical Center (California)
GENITORI
--TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, applicativo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Programmed Inquiry, Language Or Teaching (Linguaggio o
insegnamento, indagine programmata) Linguaggio di
program mazione
usato
principalmente
per
creare
applicazioni per istruzioni guidate dal computer. Sintassi
molto scarna. Si tratta di un linguaggio che permette di
preparare programmi di insegnamento e di apprendimento
con il supporto del computer e di quiz per esami.
103
PL-1
ANNO DI NASCITA
1964
GENITORI
FORTRAN, ALGOL 60, COBOL
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
(Programming Language)
Incorpora le migliori caratteristiche del FORTRAN e del
COBOL, ma ha avuto limitata diffusione a causa della sua
notevole complessità, che lo rende difficile da imparare.
104
POP
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
1966 Edimburgo
funzionale
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio interpretato con notazione polacca inversa
Versioni Pop: 1,2,10,9x
105
PROGRAPH
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
1982 Pietrzykowski
Pascal
Imperativo procedurale
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
106
PROLOG
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
1972 Colmerauer Roussel Università di Marsiglia
--Dichiarativo logico
5 GL
IN G
Il PROLOG è definito come linguaggio descrittivo,
perché un programma implementato in questo
linguaggio è costituito da una descrizione del
problema, anziché da una serie di passi che
specificano il modo in cui il computer deve lavorare
per risolvere il problema, come accade nei linguaggi
imperativi. Il programmatore non può gestire la
sequenza
di
esecuzione,
in
questo
senso
consideriamo il prolog come dichiarativo.
Tipi di dato:
Ø Numeri
Ø Stringhe
Ø Simboli
Ø Oggetti compositi
Versioni Prolog: I, II, III, +, ++…
107
REBOL
ANNO DI NASCITA
Giugno 1997 Carl Sassenrath
GENITORI
SCHEME, LISP e FORTH
TIPO DI LINGUAGGIO
Linguaggio funzionale, distribuiti
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio progettato per lo sviluppo e la progettazione di
applicazioni e servizi di rete. Ciò che rende decisamente
interessante il linguaggio sono sicuramente tre aspetti:
1. il supporto nativo ai protocolli di rete;
2. il supporto al parsing basato su grammatiche;
3. i tipi di dato consentiti.
I protocolli di rete supportati sono:
Ø Finger;
Ø Whois;
Ø Daytime;
Ø SMTP;
Ø POP;
Ø HTTP;
Ø FTP;
Ø NNTP.
Il linguaggio ha una sintassi simile a quella del linguaggio
LOGO e quindi vicina a quella del LISP
108
RPG
ANNO DI NASCITA
1965 Ibm
GENITORI
TIPO DI LINGUAGGIO
Applicativo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Nato per la gestione delle stampe, dopo 3 versioni il
linguaggio si dimostrò utile non solo per questo, infatti un
programma di medie difficoltà scritto in assembler richiedeva
un mese uomo, in COBOL sette in rpg 1.
Vengono supportati i seguenti tipi di dato:
Ø Numeri interi e reali
Ø Stringhe
Ø Record
Versioni Rpg: 2, 3, 400
109
SCHEME
ANNO DI NASCITA
1995
GENITORI
LISP
TIPO DI LINGUAGGIO
Linguaggio funzionale, scripting
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Scheme è un linguaggio di programmazione discendente dal
LISP, inventato da Guy Lewis Steele Jr. e Gerald Jay
Sussman nel 1995 presso il MIT. Scheme è importante
soprattutto in quanto lo si ritrova utilizzato in situazioni
estranee alla realizzazione di programmi veri e propri; in
particolare, i fogli di stile DSSSL. Il linguaggio Scheme ha una
filosofia che si basa fondamentalmente sul suo tipo di
notazione. È un dialetto del LISPed è particolarmente indicato
per sviluppare programmi inerenti all'Intelligenza Artificiale. Di
grande efficacia didattica grazie alla sua estrema semplicità
una volta conosciute le essenziali parole chiave.
110
SETL
ANNO DI NASCITA
1969; Jacob T. Schwartz, Courant Institute, 1970
GENITORI
--TIPO DI LINGUAGGIO
Imperativo procedurale
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio altamente dinamico
Tipi di dati:
Ø Numeri interi e reali
Ø Stringhe
Ø Booleani
Implementazioni disponibili per Unix, Dos e Macintosh.
Il primo traduttore Ada è stato scritto in SETL
111
SGML
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
1986 Charles Goldfarb
GML
Markup
3 GL
IN G
Lo Structured Generalized Markup Language, detto
comunemente SGML, è un metalinguaggio, definito in
svariati e corposi standard ISO, che consente di descrivere
formalmente un linguaggio tipo markup (es. HTML).
Più precisamente lo SGML è un sistema di generic markup.
E’ un linguaggio astratto che consente la definizione di un
insieme di tag (marcatori) per descrivere la struttura logica
di un testo piuttosto che la sua forma grafica. Tale struttura
astratta deve essere definita per ogni tipo di documento, e
individua una classe di documenti che presentano le
medesime caratteristiche strutturali. La struttura astratta del
testo nell’ SGML viene specificata dichiarando gli elementi
che la costituiscono e le relazioni gerarchiche tra loro in
una parte specifica del documento SGML, denominata
Document Type Definition
112
SML
ANNO DI NASCITA
1984 Milner
GENITORI
ML
TIPO DI LINGUAGGIO
Funzionale, imperativo procedurale
GENERAZIONE
3GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
E’ la versione standardizzata di Ml.
Altra versione Sml/NJ: Standard ML del New Jersey
Varie estensioni: Sml # (aggiunge polimorfismo)
113
SNOBOL
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
1962 Griswold and Faber, Bell Labs
Linguaggio imperativo procedurale, applicativo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
Consente la facile gestione del suono e la simulazione di
automi. E' utilizzato particolarmente nella linguistica, nel
calcolo combinatorio, nella realizzazione di coursware CAI e
nella teoria dei giochi.
La versione più importante è la 4(‘70), la potenza del
linguaggio e le sue caratteristiche sono tali da rendere un
programma illeggibile dopo la scrittura.
114
SQL
ANNO DI NASCITA
1974 Donald Chamberlin
GENITORI
TIPO DI LINGUAGGIO
Applicativo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN
GRANDE(G)/PICCOLO(P)
IN BREVE
Attualmente è in corso un processo di revisione del
linguaggio da parte dei comitati ANSI e ISO, che dovrebbe
portare alla definizione di ciò che al momento è noto come
SQL3. Le caratteristiche principali di questa nuova
incarnazione
di
SQL dovrebbero
essere
la
sua
trasformazione in un linguaggio stand-alone (mentre ora
viene usato come linguaggio ospitato in altri linguaggi) e
l'introduzione di nuovi tipi di dato più complessi per
permettere, ad esempio, il trattamento di dati multimediali.
Usato come interfaccia per altri linguaggi (Ada, C, COBOL)
115
SR
ANNO DI NASCITA
‘90
GENITORI
TIPO DI LINGUAGGIO
Linguaggio Concorrente
GENERAZIONE
4 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
(Synchronizing Resources). E’ un linguaggio per la stesura di
programmi concorrenti
116
SUPERLOGO
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
--LOGO
Linguaggio funzionale, applicativo
4G
IN P
SUPERLOGO - Linguaggio didattico per sistema operativo
MS/DOS, prodotto dalla societa' SIS.CO. di Roma.
117
TCL
ANNO DI NASCITA
1989
GENITORI
PERL
TIPO DI LINGUAGGIO
Linguaggio imperativo procedurale, scripting
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN G
GRANDE(G)/PICCOLO(P)
IN BREVE
Ideato da John Ousterhout nel 1989, oggi ingegnere della Sun.
Si tratta di un linguaggio di script, scritto interamente in C, la
cui sintassi ricorda molto il PERL. La sua caratteristica
principale consiste nella sua capacità di integrarsi in qualsiasi
programma C, a tal punto che quest'ultimo può usare
l'interprete tcl per eseguire uno script. A differenza del PERL,
TCL è dotato di una propria shell attivabile lanciando il
comando tclsh. Il prompt di Linux diventa un segno di
percentuale % e il sistema attende che siano impartiti comandi
validi, permettendo una sorta di programmazione interattiva
abbastanza limitata. Infatti il modo più comune per
programmare consiste nello scrivere il codice con un editor,
salvare e rendere eseguibile il file appena creato.
118
TEX
ANNO DI NASCITA
1982 Donald E. Knuth
GENITORI
TIPO DI LINGUAGGIO
Applicativo
GENERAZIONE
3 GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio di programmazione con cui si possono preparare
complesse macro per la manipolazione e la composizione
del testo. Molto usato per le formule matematiche.
Esistono varie versioni free per Unix, Mac, Linux, Windows.
Versioni: Tex 78, 82
119
VERILOG
ANNO DI NASCITA
1985 Phil Moorby
GENITORI
TIPO DI LINGUAGGIO
Applicativo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio di simulazione descrizione hardware
Fino al 1991 era un linguaggio privato, in seguito al formarsi
del Ovi molte piccole aziente utilizzano VERILOG.
Nel 1993 diventa lo standard 1364 dello IEEE.
120
VHDL
ANNO DI NASCITA
1985; IEEE Standard 1076, 1987
GENITORI
TIPO DI LINGUAGGIO
Applicativo
GENERAZIONE
3GL
PROGRAMMAZIONE
IN P
GRANDE(G)/PICCOLO(P)
IN BREVE
Linguaggio di simulazione e di modellistica destinato allo
studio ed al disegno dei circuiti integrati digitali. Il nome è un
acronimo di linguaggio di descrizione del hardware VHSIC.
E’ ampiamente utilizzato nelle applicazioni CAD per lo
sviluppo di circuiti digitali anche di notevole complessità
I vantaggi di realizzare il proprio progetto in VHDL è che il
linguaggio consente una discreta astrazione dall'HW sul
quale verrà poi sintetizzato il progetto.
121
XML
ANNO DI NASCITA
GENITORI
TIPO DI LINGUAGGIO
GENERAZIONE
PROGRAMMAZIONE
GRANDE(G)/PICCOLO(P)
IN BREVE
Febbraio 1998
SGML, HTML
Markup
3 GL
IN G
XML è l’acronimo di eXtensible Markup Language.
Creato in seno al W3C (World Wide Web Consortium), tale
sistema è stato ufficializzato con il rilascio della "XML
Recommendation 1.0". L’interesse generato da questo
nuovo linguaggio deriva dalla malcelata insofferenza verso
i limiti dell’HTML, ed in particolare della sua scarsa
personalizzazione.
L’XML è importante in due classi di applicazioni Web: la
creazione di documenti e lo scambio dei dati.
La sintassi dell’XML è molto simile a quella dell’HTML, ma
molto più rigida e severa; non è limitato a un insieme fisso
di tipi di elementi, ma permette di definire e utilizzare
elementi e attributi personalizzati; per far questo è fornita
una sintassi con cui è possibile specificare gli elementi e gli
attributi che possono essere utilizzati all’interno dei
documenti
L’XML può essere utilizzato come piattaforma per lo
scambio di dati tra le applicazioni.
122