C++
Alain Chillès – 祁冲 Ada
Python
Java
Théorie des langages de programmation – Analyse
C
Pr
o
s
g
ém
l
o
a
nt
ParisTech Shanghai Jiao Tong 上海交大–巴黎高科卓越工程师学院
Pascal
8 octobre 2016 – 2016年10月8日 –丙申年九月初八
Lisp
APL
Fortran
ique
Forth
1
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Structures et arbre syntaxique
Vérification du sens des objets Bilan
Jeu
Lisp
APL
Fortran
2
Que fait-on lors de l’analyse sémantique ?
Vérification des types.
Python
Java
CLangages non typés (Wxmaxima).
Langages à typage dynamique (Ocaml, L Prolog
Langages à typage statique (C).
Vérification du sens des objets (existent-ils ?)Forth Dans tous les langages, il y a des objets pré-définis (reconnus au moment de l’analyse syntaxique).
Mais, il y a des objets nouveaux ! Variables, constantes, C++
Ada
fonctions, etc.
Langage souple : les objets peuvent être définis dans un ordre
quelconque (Wxmaxima).
Langage plus strict : les objets doivent être définis dans un certain ordre (C). La « définition » peut être une simple
déclaration. Lisp
APL
Fortran
Vérification de la bonne syntaxe des nouveaux objets.
AC
).
Pascal
3
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda Structures et arbre syntaxique
C++
Vérification du sens des objets Bilan
Jeu
Lisp
APL
Fortran
4
Reconnaissance des types : exemples
C
Java Prolog
Session Wxmaxima
(%i1) f(x) := x+1$
Forth Ada
Pascal
Python
C++
(%i2) f(2); (%o2) 3
(%i3) f([1,2,3]); (%o3) [2, 3, 4]
Lisp
APL
Fortran
5
Reconnaissance des types : exemples
Python
Source C C
Prolog
1 int f(int x)
Java
Forth
Ada
2{
3 return(x+1); 4}
5
C++
in
10 } Lisp
Pascal
APL
Fortran
t main()
6 7{
8 int tab[3] = {1,2,3};
9 return(f(tab));
6
Reconnaissance des types : exemples
C
Compilation C
Python
Java
$gcc -Wall -o “essai” “essai.c” Prolog
essai.c: In function ‘main’:
essai.c:9:14: warning: passing argument 1 of ‘f’
→ makes integer from pointer without a cast
→ [-Wint-conversion]
C++
Ada
return(f(tab));
^
essai.c:1:5: note: expected ‘int’ but argument
→ is of type ‘int *’ int f(int x)
Pascal
Lisp
^
APL
Fortran
Compilation terminée avec succès.
Forth
7
Reconnaissance des types : exemples
Python C
Exécution C
Java Prolog
Forth Ada
$ ./essai
(program exited with code: 65)
$ ./essai
C++
(program exited with code
9)
(program exited with code: 17)
$ ./essai
Pascal
Lisp
APL
Fortran
: 12
8
Reconnaissance des types : exemples
C
Java Prolog
Histoire de rire !
Python
Source C
8 static int tab[3] = {1,2,3};
Exécution C C++
Forth Ada
$ ./essai
(program exited with code: 49)
$ ./essai
(program exited with code: 49)
Lisp
Pascal
APL
Fortran
9
Reconnaissance des types : exemples
C
1 # let f(x) = x+1;;
2 val f : int -> int =
3 # f(2);;
4 – : int = 3 C++
Ocaml
Prolog
Python
Java
5 # f([1;2;3]);;
6 Error: This expression has type ’a list but an
Forth Ada
→ expression was expected of type int Pascal
Lisp
APL
Fortran
10
Reconnaissance des types : qu’est-ce qu’un type ?
Python C
Java
Les types de base (int, char, etc.) Prolog
Les types nouveaux, définis par description (struct, enum, Forth
etc.). Ils sont donc décrits par une grammaire !
Les types nouveaux, définis par une fonction de reconnaissance (fonction renvoyant un booléen)
C++
Ada
Il y a alors des conversions de types ou cast, implicites ou
explicites.
Lisp
APL
Fortran
Pascal
11
Reconnaissance des types : comment ?
C
Python Prolog
Java
On possède l’arbre syntaxique, issu de l’analyse syntaxique. Pour chaque nœud, on connaît le nombre de fils, et les types
des valeurs renvoyés par les fils (pour les feuilles, c’est la valeur, pour les sous-arbres, c’est à évaluer).
C++
Ada
Il suffit donc d’effectuer l’évaluation de l’arbre au niveau des
types !
Lisp
Pascal
APL
Fortran
Forth
12
Reconnaissance des types : comment ?
C
le nombre de paramètres ;
Python
Java
Il faut donc savoir pour chaque opérateur, fonction, etc.
Prolog
le type de chaque paramètre ;
le type de sortie. Celui-ci peut être
Forth
C++
Ada
déclaré (statique) comme en C ;
calculé (dynamique) comme en Ocaml et LAC .
Nous rangerons ces informations dans la « table des symboles »
(nommée LAC).
Une fois passé l’analyse sémantique, il n’y a en général plus besoin de vérifier les types intermédiaires, seulement les types des
Lisp
APL
Fortran
paramètres.
Pascal
13
Reconnaissance des types : comment ?
C
Les problèmes qui se posent :
Python
Java
P
r
o
l
o
g
certains types peuvent devoir être reconnus à l’exécution (d’où
les fonctions de
reco
éléments de [0, 2016] ;
Forth
Ada
etc.
Lisp
C++
les types ;
nn
ais
sa
nce
de type) – par exemple, les
certains opérateurs ou certaines fonctions peuvent être polymorphes – par exemple, l’identité x → x existe pour tous
on peut avoir des surcharges des opérateurs – par exemple, l’addition peut aussi bien s’appliquer aux entiers, aux flottants,
APL
Fortran
on doit donc savoir propager des informations…
Pascal
14
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Structures et arbre syntaxique
Vérification du sens des objets Bilan
Jeu
Lisp
APL
Fortran
15
Arbre syntaxique −→ arbre de types Python
a Forth
Prenons l’expression 1 + 2 × 3/5.0 et plaçons-nous dan
v
C
où les opérations usuelles sont surchargées…
J
su
a
n la
ng
age
C++ Lisp
Prolog
1/ Ada
+
× 5.0
Pascal
APL
Fortran
23
16
Arbre syntaxique −→ arbre de types Python
a Forth
Prenons l’expression 1 + 2 × 3/5.0 et plaçons-nous dan
v
C
où les opérations usuelles sont surchargées…
J
su
a
n la
ng
age
C++ Lisp
Prolog
int / Ada
+
× float
Pascal
APL Fortran
int int
16
Arbre syntaxique −→ arbre de types Python
a Forth
Prenons l’expression 1 + 2 × 3/5.0 et plaçons-nous dan
v
C
où les opérations usuelles sont surchargées…
J
su
a
n la
ng
age
C++ Lisp
Prolog
int / Ada
+
int float
Pascal
APL
Fortran
16
Arbre syntaxique −→ arbre de types Python
a Forth
Prenons l’expression 1 + 2 × 3/5.0 et plaçons-nous dan
v
C
où les opérations usuelles sont surchargées…
Prolog
C++ Lisp
+
J
su
a
n la
ng
age
int float
Ada
Pascal
APL
Fortran
16
Arbre syntaxique −→ arbre de types Python
Prenons l’expression 1 + 2 × 3/5.0 et plaçons-nous dan
C
où les opérations usuelles sont surchargées…
float
Prolog
J
su
a
a
n la
v
ng
age
C++ Lisp
Forth Ada
Pascal
APL
Fortran
16
Exemple de surcharge
C
Java
Forth Ada
Pascal
Python
Session Wxmaxima Prolog
(%i1) 1+2*3/5.0; (%o1) 2.2
(%i2) 1+2*3/5; C++
11 5
Lisp
(%o2)
APL
Fortran
17
Exemple de surcharge
Source C
Python
Java
Forth
1
#include
23 int main() Prolog 4{
5 float i = 1+2*3/5.0;
6 float j = 1+2*3/5;Ada
7 printf(“i=%f et j=%f”,i,j); C++
8 return(0); 9}
Pascal APL
Exécution C $ ./essai
Lisp
Fortran
i=2.200000 et j=2.000000
18
Exécution d’un arbre de types ou syntaxique
Python C
La notation postfixée !!!
Pour les types : 1+2×3/5.0
C++ Lisp
Pour les valeurs :
Prolog
1+2×3/5.0 −→
123 ∗ 5.0/+ Pascal
Java
Forth
−→ int int int ∗ float / + Ada
APL
Fortran
19
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Structures et arbre syntaxique
Vérification du sens des objets Bilan
Jeu
Lisp
APL
Fortran
20
Conditionnelle
Python
C
Java Forth
APL
Fortran
if
Prolog Ada
On ne peut définir son type que si les deux actions renvoient une
Lisp
valeur de même type !
21
Conditionnelle : exemples
C
Ocaml
Python
Java
Prolog
1 # let f(x) = if (x==1) then 2;;
2 Error: This expression has type int but an
→ expression was expected of type 4 # let f(x) = if (x==1) then 1 else
uni
3
→ print_string(“x ne vaut pas 1”);; C++
5 Error: This expression has type unit but an → expression was expected of type int
6
Pascal
7 # let f(x) = if (x==1) then 2 else 3;;
Lisp
APL
Fortran
8 val f : int -> int =
rth Ada
F
o
t
22
Conditionnelle : exemples
C
Prolog
Source C
Python
Java
1 int main()
2{
3 int i=1, j=2;
Forth Ada
Pascal
4 if (i==1) C++
5 j=3;
6 return(j); 7}
Lisp
APL
Fortran
23
Conditionnelle : exemples
Source C C
1
2
3
4{
5 int i=1, j=2;
6 if (i==2)
Python
Java Prolog
C++
7 8 9
10
11 }
j=3; else
#include
Forth Ada
Pascal Fortran
Lisp
printf(“j=%d\n”, j); return(j); APL
24
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Bilan Jeu
Lisp
Structures et arbre syntaxique
Vérification du sens des objets
APL
Fortran
25
Quels sont les objets du langage ?
Python C
Java
Prolog
autres que les nombres, les mots réservés…
En langage C, ce sont les objets déclarés (et donc typés à la
déclaration) ;
en Wxmaxima, tous les identificateurs autorisés produisent un objet (qui peut avoir une valeur ou non, auquel cas il a la
C++
Ada
valeur de son nom) ;
à un moment donné, les objets connus sont ceux du
dictionnaire…
Lisp
Pascal
APL
Fortran
Forth
26
Sémantique : exemples
et
n−1 Ada
Python C
Java
Forth
C++ Lisp
n−
Prolog
Soit les suites mathématiques définies par
u0 =1etv0 =1 un =u +v
∀n ∈ N∗,et
vn = 2 un−1 − vn−1.
1
Pascal
APL
Fortran
27
Sémantique : exemples
Java Prolog
C
(%i1)
(%i2)
C++
(%i3)
(%o3) Lisp
Session Wxmaxima
Python
u(n) := if n=0 then 1
else u(n-1)+v(n-1)$
Forth
v(n) := if n=0 then 1
else 2*u(n-1)-v(n-1)$
u(4);
9
Ada
APL
Fortran
Pascal
28
Sémantique : exemples
Source C C
Python
Java
1 int v(int); // Déclaration de v Prolog
Forth Ada
6
7 int v(int x) // Définition de v
8{
9 return((x == 0) ? 1 : 2*u(x-1)-v(x-1));
2 int u(int x)
3{
4 return((x == 0) ? 1 : u(x-1)+v(x-1)); 5 };
C
10 }; Lisp
++
APL
Fortran
Pascal
29
Sémantique : exemples
Python
LAC
Java Forth
Ada
C
1 2 3 4
defer u \ Déclaration de u Prolog
: v ( n — v[n])
dup 0= if drop 1 else dup 1- u 2 * swap 1-
→ recurse – then ;
(u) ( n — u[n]) C++
5 6
7
8
:
dup 0= → then;
if drop 1 else dup 1- u swap 1- v + Pascal
’ (u) is u Lisp
APL
9 10
\ Résolution de la déclaration
1
14
u
.
Fortran
30
Sémantique : exemples
C
Python
Java
Forth
and v(n) =
if n==0 then 1 else 2*u(n-1)-v(n-1);;
Ocaml Prolog 1 #letrecu(n)=
2
3
4
if n==0 then 1 else u(n-1)+v(n-1)
C++
Ada
5 val u : int -> int =
6 val v : int -> int =
8 # u(4);;
9 -:int=9
Pascal
Lisp
APL
Fortran
31
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Bilan
Jeu
Lisp
Structures et arbre syntaxique
Vérification du sens des objets
APL
Fortran
Pascal
32
Traduction de l’arbre syntaxique
C
Prolog
Python
Java
En arbre de types, pour faire de la vérification (statique) ou de
la reconnaissance (dynamique) de types.
Nécessite de connaître (et donc de stocker) toutes les
informations nécessaires !
Besoin de définir la « table des symboles » et sa structure.
C++
Ada
En expression postfixée pour évaluation (à l’aide d’une pile de
données, où sont les paramètres).
Besoin de savoir comment se comportent les opérateurs,
fonctions, etc. en fonction de leur contexte.
Besoin de stocker l’information utile, dans la machine virtuelle
ou réelle.
APL
Fortran
Lisp
Forth
Pascal
33
Plan Python C Prolog
Fonctions de l’analyse sémantique
Reconnaissance des types
Java Forth
Pascal
Analyse sémantique
Exécution d’un arbre de typesAda
C++
Structures et arbre syntaxique
Vérification du sens des objets Bilan
Jeu
Lisp
APL
Fortran
34
Que doit-on savoir ?
C
Pour savoir
P
C++
Python
Java
rolog
on ?
définir une fonction de deux variables ?
faire une conditionnelle ? (if ou switch)
Ada
même langage ? Pascal
faire une additi
Forth
faire une boucle ? (for, while ou do…
while)
passer la main à une sous-fonction (ou un sous-programme) du
passer la main à une fonction ou un programme écrit dans un
autre langage ?
Lisp
APL
Fortran
35