DEFINIZIONE FORMALE DI LINGUAGGIO
Un linguaggio è
un insieme di parole costruite utilizzando i simboli ammessi dall'alfabeto, che
si legano insieme per formare le frasi.
Un linguaggio è quindi
definito dal suo vocabolario e dall'insieme delle frasi che si possono
formare.
Se il linguaggio ammette un numero finito di frasi, la descrizione
del linguaggio può essere fatta per enumerazione, cioè elencando
tutte le frasi possibili.
In generale però i linguaggi sono
infiniti, ammettono cioè un numero infinito di frasi anche per un
vocabolario molto limitato.
La descrizione del linguaggio allora può
essere fatta stabilendo le regole che indicano come si possono formare le frasi
valide. L'insieme di queste regole viene detto grammatica.
La grammatica di
un linguaggio si può definire descrivendo:
- i simboli terminali,
cioè le parole del vocabolario del linguaggio;
- i simboli non
terminali, cioè le parole che servono per descrivere il linguaggio, ma
che fanno parte di un altro linguaggio (chiamato metalinguaggio);
- lo
scopo del linguaggio, un simbolo non terminale che rappresenta la categoria
più complessa;
- l'insieme delle regole con cui si possono associare
simboli terminali e non terminali ai simboli non terminali.
Per es.
"articolo", "nome", "verbo" sono simboli non terminali, parole descrittive;
"il", "gatto", "mangia" sono parole del linguaggio, simboli terminali.
La
possibilità di sostituire un articolo alla parola articolo è una
regola di riscrittura.
ALCUNE DEFINIZIONI
alfabeto = un insieme di simboli con cui si
possono comporre le parole.
vocabolario = insieme delle parole ammesse che
è un sottoinsieme dell'insieme di tutte le parole componibili con i
simboli dell'alfabeto (cioè non tutte le parole che si possono comporre
hanno un significato in quel linguaggio).
frase = un insieme finito di
parole. La lunghezza di una frase è data dal numero di parole che la
compongono.
LA NOTAZIONE DI BACKUS NAUR
La notazione di Backus Naur, chiamata anche
notazione BNF (Backus-Naur-Form), permette di descrivere un linguaggio basandosi
sulla sua definizione formale.
Si utilizza un metalinguaggio, le cui parole
vengono chiamate simboli non terminali.
La notazione usata per la
decrizione utilizza i simboli:> racchiudono i simboli non terminali del
linguaggio;
::= è il simbolo di equivalenza che serve per descrivere
le regole di riscrittura che associano a simboli terminali altri simboli non
terminali o terminali;
| serve per indicare che più possibili
definizioni sono in alternativa;
{ } le parentesi graffe indicano che il
contenuto può essere ripetuto un numero arbitrario di volte (anche
nessuna).
Un elenco di simboli segnala semplicemente la concatenazione dei
simboli stessi.
I DIAGRAMMI SINTATTICI
I diagrammi sintattici rappresentano un metodo
grafico di descrizione dei linguaggi, usato solitamente per la descrizione del
linguaggio Pascal.
Questo metodo utilizza dei grafi per descrivere le
regole di riscrittura di un linguaggio.
Si utilizzano dei simboli
rettangolari per rappresentare i simboli non terminali e dei simboli circolari
(o ellittici) per rappresentare i simboli terminali; ognuno di questi è
un nodo del grafo; i simboli non terminali devono essere definiti in altri
grafi.
I simboli sono collegati da archi che indicano dei possibili
cammini; un nodo incontrato sul percorso fornisce una parola della frase.
Un'alternativa viene rappresentata da più archi che escono da un
nodo. Una ripetizione viene indicata da un percorso ciclico.
Per formare
una frase si entra nel grafo da sinistra; se si incontra una biforcazione si
sceglie uno dei due percorsi; se si incontra un simbolo terminale lo si
inserisce nella frase; se si trova un simbolo non terminale bisogna passare ad
esaminare il grafo che lo definisce.
LA SINTASSI E LA SEMANTICA DI UN LINGUAGGIO
La sintassi è l'insieme delle regole della
grammatica con cui si possono costruire le frasi.
L'analisi sintattica
permette di stabilire se una frase è formata secondo le regole del
linguaggio; i programmi traduttori prima di tradurre una frase dal linguaggio di
programmazione al linguaggio macchina ne fanno l'analisi sintattica per
verificarne la correttezza; se ci sono errori formali la traduzione non
può avvenire.
La semantica è il significato che le frasi
possono assumere; per i linguaggi naturali la semantica risulta molto complessa,
tanto che a volte il significato di una frase comune può essere
frainteso.
Per i linguaggi di programmazione la semantica risulta
più semplice e può essere definita descrivendo le azioni che la
CPU deve compiere durante l'esecuzione di ciascuna istruzione (semantica
operazionale).
LA PORTABILITA' DEI PROGRAMMI
La portabilità di un programma è la
possibilità di far girare lo stesso programma su macchine diverse senza
doverlo modificare (o comunque con pochissime modifiche).
I programmi
scritti in un linguaggio sono trasportabili da una macchina all'altra se su ogni
macchina è disponibile il compilatore o l'interprete per quel
linguaggio.
EVOLUZIONE DEI LINGUAGGI DI PROGRAMMAZIONE
I linguaggi di programmazione si possono
classificare in generazioni secondo il momento in cui si sono evoluti e le
modalità che li caratterizzano.
- prima generazione: linguaggio
macchina;
il linguaggio macchina permette di utilizzare soltanto i simboli
del sistema di numerazione binario e richiede di indicare tutti gli indirizzi di
memoria in modo assoluto.
- seconda generazione: linguaggi
assembler;
I linguaggi Assembler permettono di utilizzare dei nomi
simbolici predefiniti per i codici operativi delle istruzioni e definibili dal
programmatore per i nomi delle variabili e le etichette delle istruzioni, senza
la necessità di conoscerne gli indirizzi di memoria.
Rimane comunque
una corrispondenza biunivoca tra le istruzioni in Assembler e quelle linguaggio
macchina.
- terza generazione: linguaggi ad alto livello;
I linguaggi
ad alto livello offrono istruzioni complesse che permettono di descrivere la
soluzione del problema in termini più vicini alla descrizione
verbale.
Rientrano in questa categoria i linguaggi più noti: Basic,
Pascal, Fortran, Cobol ecc.
- quarta generazione: linguaggi orientati a
problemi particolari.
Rientrano in questa categoria linguaggi nati per
risolvere classi particolari di problemi, come la gestione di data base,
problemi di simulazione ecc.
- quinta generazione; linguaggi logici,
funzionali, ad oggetti;
A questa categoria appartengono linguaggi
sviluppati in tempi più recenti, utilizzati soprattutto per problemi
riguardanti il campo dell'intelligenza artificiale come Prolog, Lisp e
Smalltalk.