Post by Enrico FranchiPost by Carlo MilanesiIn un linguaggio statico invece per ogni variabile, e in realta' per
ogni espressione, e' possibile asserire quale sara' il tipo della
variabile qualunque siano i dati elaborati, e qualunque siano le
strutture di controllo di flusso utilizzate.
Secondo questa definizione C++ non e' un linguaggio statico.
Manco Java.
a = 2 + 2
a = "abc"
potrebbe funzionare in un linguaggio statico, a patto che a
sia un supertipo sia di interi che di stringhe. Nota che e'
piu' una questione "sintattica" che semantica.
In Java per esempio funziona, certo, devi dichiarare a.
Object a;
a = "ciao";
a = 2 + 2;
Forse l'esempio che avrei dovuto fare era il seguente:
Object a;
Object b;
a = 2 + 2;
b = a / 2;
a = "ciao";
b = a.substr(1, 1);
Non credo che in Java sia possibile scrive qualcosa del genere a quando
scritto sopra senza introdurre un cast che modifica staticamente il tipo
di un'espressione.
Quando si analizza l'espressione "a / 2", si fa il seguente
ragionamento. Qui si vuole applicare l'operatore "/" all'oggetto "a". Ma
l'oggetto "a" e' in grado di eseguire tale operazione? In quanto
dichiarato di tipo "Object", non si puo' asserire che tale operazione
sia ammissibile. Pero' se in fase di esecuzione viene fatta un'apposita
elaborazione, si potrebbe determinare che tale operazione e' ammissibile
e trovare il modo di fargliela fare. Se invece si determinasse che tale
operazione e' inammissibile si dovrebbero prendere drastici
provvedimenti. Questo e' il nocciolo della "dinamicita'".
Sono d'accordo che anche in C++ e in java ci sono elementi di
dinamicita', ma sono essenzialmente linguaggi statici, cioe' quasi
sempre e' possibile determinare la semantica di un'espressione
indipendentemente dai dati di input.
Post by Enrico FranchiMa il fatto di dover dichiarare le variabili non e' assolutamente
necessario per avere a che fare con un linguaggio statico (e viceversa).
Non ne dubito.
Post by Enrico FranchiInoltre, il tuo esempio presuppone che sia possibile riassegnare una
variabile, cosa che non e' affatto scontata.
E' pero' comune a molti linguaggi di ampia diffusione, cioe' quelli
imperativi, purche' la variabile non sia una costante.
Un esempio che non fa tale assunzione e' il seguente:
a = "abc"
b = a / 2
oppure, piu' semplicemente:
("abc" / 2)
Quest'ultimo caso sembra ridicolo, in quanto per qualunque dato di input
e per qualunque altra porzione di codice ci sia prima o dopo, anche
nella stessa istruzione, e' evidente che l'espressione e' errata.
Tuttavia in un linguaggio dinamico normalmente tale errore non viene
rilevato in fase di compilazione, in quanto ci si astiene dal tentativo,
spesso infruttuoso, di determinare quali operazioni sono ammissibili e
quali no.
Post by Enrico FranchiNei linguaggi statici, i tipi sono associati alle *variabili*,
in quelli dinamici sono associati agli "oggetti". In realta'
questa definizione non e' estremamente robusta, ci sono
linguaggi staticamente tipizzati che associano il valore
*anche* alle variabili.
Forse potremmo dire che nei linguaggi dinamici i tipi *non*
sono associati alle variabili. Ora tu questo lo hai spiegato
ampiamente nel tuo post e di conseguenza non mi soffermo.
Non mi dilungo sulla teoria dei linguaggi di programmazione, anche
perche' non sono un'autorita' in materia. Volevo solo aiutare l'OP nel
capire un concetto.
Post by Enrico FranchiOppure ci si potrebbe legare al concetto di errore di tipo e
andare a chiedersi quando tali errori sono rilevati.
Intendevo proprio questo, con la differenza che sostituirei la parola
"rilevati" con la parola "rilevabili". Usando un linguaggio tipizzato
staticamente, i tipi delle espressioni sono definiti nel programma
stesso, prima che sia mandato in esecuzione, e questo permette la
rilevazione degli errori di tipo semplicemente analizzando il programma.
Usando linguaggio tipizzato dinamicamente invece i tipi delle
espressioni sono definiti solamente in esecuzione, cioe' e' possibile
che un'espressione non abbia un tipo fino a quando il programma non
viene eseguito e quindi un eventuale errore di tipo non e' rilevabile
fino all'esecuzione; inoltre, per alcuni dati di input tale errore
potrebbe non essere mai rilevato.
--
Carlo Milanesi
http://digilander.libero.it/carlmila