4.
Lezione/esercitazione del 8/10/04 [2 ore, in AULA B] per tutti i turni
di:
Algoritmi & Laboratorio
(
Modulo 2
)
"Riassunto" della lezione:
Per poter usare al meglio un linguaggio di programmazione occorre essere
coscienti di quali sono le sue caratteristiche
Alcune caratteristice di interesse sono le seguenti:
-
Il linguaggio e'
interpretato
o
compilato?
Ad es. BASIC, Perl, JavaScript sono interpretati,
mentre FORTRAN, Pascal, C sono compilati.
-
Se il linguaggio e'
compilato, allora supporta la compilazione separata?
Ad es. il Pascal Standard non supporta la compilazione separata,
mentre C la supporta.
-
Se il linguaggio e'
compilato, allora e compilato in codice macchina
oppure nel codice di una macchina virtuale?
Ad es. C e' compilato in codice macchina,
mentre Java e' compilato nel codice di una macchina virtuale.
-
Se il linguaggio e'
compilato e supporta la compilazione separata,
allora il linking e' statico o dinamico?
Ad es. in Pascal e in ANSI C il linking e' statico (attenzione, nei C della
Microsoft, le DLL sono linkate dinamicamente...),
mentre Java e' compilato nel codice di una macchina virtuale.
-
Quanto e' dettagliata la definizione (o specifica) del linguaggio?
Ad es. in Pascal e in
C e' la dimensione dei tipi base (e la rappresentazione dei loro valori)
non e' specificata (varia di compilatore in compilatore, riflettendo
l'archittetura della macchina sottostante). In Java, invece, la rappresentazione
dei tipi base e' completamente specificata.
-
Ci sono dei "apetti poco chiari" nella definizione (o specifica)
del linguaggio?
Ad esempio, nel caso di un linguaggio compilato,
viene specificata chiaramente la relazione tra
-
risultato della
compilazione separata (e del linking) dei files sorgenti
S_1,...,S_n, e
-
risultato della compilazione di un singolo file sorgente S concatenazione di
S_1,...,S_n?
-
Il linguaggio e' "safe" o "non-safe"?
Ad es. Java e Scheme sono safe, mentre C e' non-safe.
Confrontate ad es. il comportamento
dei programmi:
main(){
int a[10];
int b[10];
int i;
scanf("%d",&i);
a[i]=100;
}
e
public class Esempio
{ public static void main(String[] args)
{ int a = new int[10];
int b = new int[10];
int i;
i = ConsoleReader.readInt("");
a[i]=100;
}
}
sull'input 13.
-
Il linguaggio supporta la gestione delle eccezioni?
Ad es. Java supporta la gestione delle eccezioni, mentre C no.
-
Il linguaggio ha i tipi?
Ad esempio SmallTalk e Scheme non hanno i tipi, mentre C e Java hanno i tipi.
-
Se il il linguaggio ha i tipi, quali sono le proprita' del suo sistema
di tipi (il linguaggio e' fortemente tipato)?
A scanso di equivoci, diremo che:
-
Un linguaggio e' (staticamente) tipato se, in fase di compilazione,
ad ogni espressione viene asssegnato un tipo.
-
Un linguaggio e' (staticamente) fortemente tipato se e' tipato e,
in fase di esecuzione, non possono verificarsi errori di tipo.
Ad. esempio C non e' fortemente tipato, mentre
Pascal e Java sono quasi fortemente tipati.
Java non e' fortemente tipato (ma le circostanze in cui si puo' verificare
un errore ti tipo in fase di esecuzione sono circoscitte e documentate,
per questo dire che Java e' quasi fortemente tipato). Si consideri ad esempio
il seguente programma:
public class A { public String ma {return "A";}}
public class B { public String mb {return "B";}}
public class Esempio
{ public static void main(String[] args)
{ A[] a;
B[] b;
b = new b[10];
a = b;
a[0] = new A(); // QUESTA ISTRUZIONE GENERA UN ERRORE DI TIPO A RUN-TIME
b[0].mb();
}
}
E' anche utile sapere quali
sono le idee che hanno guidato il design del linguaggio e la sua evoluzione
nel tempo. Informazioni di questo genere si possono trovare:
-
per Java,
nel libro
[Arn],
-
per C, nel "white book" (B. W. Kerninghan, D. M. Ritchie. Il linguaggio C.
Pearson/Prentice Hall, 2004 --- va bene anche la seconda edizione stampata
dalla Jackson) --- nel seguito riferito come [Ker].
Riferimenti (LETTURE OBBLIGATORIE):
Studiare:
-
i tipi dati fondamentali del linguaggio Java:
([Hor] capitolo 3).
Riferimenti (LETTURE CONSIGLIATE):
-
La "prefazione" e il capitolo 1 ("Una rapida panoramica")
del libro [Arn].
-
Le "prefazioni", l'"introduzione" e il capitolo 1 ("Panoramica del linguaggio")
del libro [Ker].
|