C
C++
Alain Chillès – 祁冲 Ada
Python
Java
Théorie des langages de programmation
Pr
Le
p
g
o
l
ro
o
jet
(IV)
Forth
ParisTech Shanghai Jiao Tong 上海交大–巴黎高科卓越工程师学院
Pascal
11 octobre 2016 – 2016年10月11日 –丙申年九月十一
Lisp
APL
Fortran
1
Plan
C
Projet
Mode calculatrice
C++
Ada
Pascal
Python Prolog
Java Forth
Compilation d’une fonction LAC n’utilisant que des fonctions de
base
Lisp
APL
Fortran
2
Interprète sans définition de fonctions
C
Python
Java
Forth
On veut interpréter ma phrase suivante :
Prolog
Comment faire ?
1 Analyse lexicale : on obtient 6 lexèmes :
“2” “3” “4” “+” “*” “.” 2 Analyse syntaxique : il n’y en a pas !
C++
Ada
2␣3␣4␣+␣*␣.
3 Analyse sémantique (se fait ici en même temps que l’exécution, lexème par lexème).
Lis
“2” existe et correspond au nombre 2 (de m
empilé (de même 3 et 4) avec des types entiers ;
“p+” existe et coArrespPond àLla fonction 0 du processeur, on
vérifie le bon ty
e
pe de
s para
mètres de la fonction + et on xécute la fonction 0 du processeur, etc.
Pascal
t
Fortran
ême
,3e
t4
),
2 es
3
Installation des fonctions de base
Python
J
plir correctement la table des symboles LAC et la machine virtuelle VM.
On peut concevoir une fonction en langage C qui perm
C
Notons la declare_base
Prolog
et d
a
er
v
em
a
C
Ada
La
+
Source C
1 void declare_base(char nom [],int n_input,int
+
fonct
ion + peut alors être déclarée par : Source C
Forth
→ input [],int n_output,int output []);
1 #define INT 1
Pascal APL
2 int input[]={INT,INT};
3 int output[]={INT}; Lisp
4 declare_base(“+”,2,input,1,output); Fortran
4
Comment trouver si une fonction est déjà définie ?
Python
Si la table des symboles est définie par :
C
Java
0
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0
1
43
2
1
1
1
97
112
2
0
0
2
0
0
2
l
+
n1
t1
t2
n2
a
p
n1
t1
t2
n2
t3
t4
c
1
Cherchons la fonction +.
23
Prolog
1 0 1 4 115 119 t3 c a l s w
C++
Forth Ada
On commence à la dernière adresse définie (ici 10, début de la
fonction swap) ;
on cherche si c’est + ( 43 )… non ? on prend la valeur
1
de la case 9 = 10 − 1, c’est 1 (début de la fonction +), est-ce + ? Oui ! Son Nfa vaut donc 1, et on calcule son Cfa qui vaut
0 – case 8, obtenu en comptant à partir du N
compte de la longueur du nom, du nombre des paramètres d’entrée et de sortie…
Lisp
APL
Cherchons la fonction 1. Le même procédé, nous fait passer par
l’adresse 10, puis 1. On arrive en 0 (LAC[0]). La fonction n’est
donc pas définie !
Pascal
fa, e
nt
Fortran
en
ant
5
Comment définir une fonction du processeur ?
Source C
Python
Java
1 2
3
// Définition du processeur
C
typedef void (*base)(void); // Type de la → fonction de base
Prolog
base processeur[50]; // Taille à préciser Forth
Source C
1 // Supposons la fonction plus bien définie
C++
Ada
2 // On la place dans le processeur
3 processeur[0] = +
APL
Pascal
Source C Lisp
1 // Utilisation de la fonction du processeur
2 processeur[0]();
Fortran
6
Comment exécuter ?
Python
Java
“2” n’est pas une fonction, c’est un entier : on l’empile sur la
1C
pile de données et on empile sur la pile de types son type (de
même avec 3 et 4) ;
Prolog
2 “+” est une fonction, on vérifie que la pile de données contient au moins deux termes, on vérifie sur la pile de types
que ce sont deux objets de type entier ;
on trouve le Cfa de +, c’est 0. On va à l’adresse VM[0], on y
C++
Ada
3
trouve 0, c’est donc une fonction de base, son numéro est en
VM[1], c’est 0. On exécute processeur[0] ;
on place le type du résultat sur la pile de type et le résultat sur
la pile de données…
4 “*” n’est pas définie, on génère une erreur et on vide les piles
de données, de type et de retour… Lisp
APL
5 on définit ∗ et ., et on recommence… Cela doit marcher ! Fortran
Forth
Pascal
7
Plan
C
Projet
Mode calculatrice
C++
Ada
Pascal
Python Prolog
Java Forth
Compilation d’une fonction LAC n’utilisant que des fonctions de
base
Lisp
APL
Fortran
8
Un premier exemple simple
Et dans la machine virtuelle
Python
Soit à compiler la fonction définie par :␣2+.␣2␣+␣.␣;. Où : Java
désigne le début de la définition, 2+. son nom, ; la fin de la définition et 2 + . le corps de la fonction…
C
Le système doit pouvoir me dire que la fonction prend un entier et ne renvoie rien et la coder dans la table des symboles par
Prolog
x+6 x+7 x+8 Forth
x
x+1
x+2
x+3
x+4
x+5
?
3
50
43
46
1
1
0
y
a
l
2
+
t1
n2
c
.n
? désigne l’adresse du nom défini en dernier (Nfa).
C++
1
Ada
y
y+1
y+2
y+3
1
c1
2
c2
y+4 y+5
P
ascal
APL
Lisp 3 4
fonction (à définir) (lit) qui signale à l’exécuteur que la case
(fin) qui signifie que le code se termine, c1 est le Cfa d’une
d’après est un entier à déposer sur la pile…
c c3 4
Le 1 signale que la fonction est une fonction LAC , c2 = 0 est le Cfa de +, c le Cfa de ., c le Cfa d’une fonction (à définir)
Fortran
9
Comment fonctionne le nouvel exécuteur ?
Python
J
Soit la commande 5␣2+., 5 est donc mis sur la pile, il la fonction 2+.
faut
ex
a
C
ter
son Cfa est y, le 1 en VM[y] signale à l’exécuteur qu’il faut fonctionner autrement.
Prolog
Forth
On empile sur la pile de retour y + 1 et on exécute VM[y + 1]
(la fonction (lit)) ;
on exécute la fonction (lit), fonction de base avec
C++
Ada
processeur[n](), où n est le numéro de la fonction ;
on dépile la pile de retour (valeur z = y + 2), on empile z + 1 sur la pile de retour et on exécute VM[z + 1] (la fonction +) ;
…
on dépile la pile de retour (valeur z = y + 4), on empile z + 1
Lisp
cute VM[z + 1] (la fonction APL
sur la pile de retour
et o
n exé
(fin)), c’est une fonction de base, après son exécution il n’y a rien sur la pile de retour, l’exécuteur s’arrête !
a
Pascal
Fortran
v
écu
10
À faire
Python
Java
C
Prolog
: début de compilation ;
; fin de compilation ;
Programmer et mettre dans la table des symboles et la machine
virtuelle les fonctions :
Forth Ada
C++
(fin) signale la fin du code (non utilisable en interprété) ;
(lit) comme expliqué plus haut (non utilisable en interprété) ;
… les fonctions qui manquent ; l’exécuteur !
Pascal
Lisp
APL
Fortran
11