1 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Jean-Jacques Girardot Cinquième séance Langages de Programmation Cours Architecture des Systèmes Informatiques
2 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Plan Introduction aux langages de programmation Compilation et génération de code Expressions arithmétiques, boucles, sous-programmes Module objet, exécutable Allocation des variables Statique, automatique, dynamique Utilisation de la pile Notion de cadre
3 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Les langages de programmation Une classification Assembleurs : “bien” utiliser les ressources de la machine Premiers langages compilés : FORTRAN (scientifique), COBOL (gestion) : écrire des applications “portables” Langages de programmation structurée : ALGOL, PASCAL : programmes aisés à concevoir et maintenir Langages à objets : C++ : programmation “dans le large” Langages fonctionnels : LISP, Caml… vers des programmes plus faciles à prouver Langages déclaratifs : Prolog… Langages spécialisés : SQL (bases de données), sh, ksh, perl (shell scripts), etc…
4 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Technologies d'implantation Langages compilés Un outil (compilateur) transforme le programme source en un programme objet, ou un programme “core image” Le résultat est directement exécutable par la machine Exemples : C, C++, Pascal, FORTRAN, ADA, COBOL, etc. Langage interprété Un outil (interprète) lit le programme source et (après transformations diverses) l’exécute directement. Exemples : APL, LISP, Perl, CAML, etc. Approches intermédiaires - ex: SIM Source -> code machine virtuelle, interprétation du code
5 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Étapes de l’exécution d’un programme compilé Compilation : traduction d’un langage source vers un langage d'assemblage ou un langage objet Assemblage : traduction d’un programme source en assembleur vers un langage objet Édition de liens : création d’un programme exécutable, rassemblant des modules objets et les sous-programmes de bibliothèque nécessaires à l’exécution Exécution : chargement en mémoire centrale du programme exécutable ; le “chargeur” lui “donne la main”
6 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilateur Lit un programme en un langage dit “de haut niveau” C, C++, Pascal, Fortran, Ada : langage source Opère en plusieurs “phases” : analyse lexicale, analyse syntaxique, génération de code Convertit les instructions du programme en commandes pour la machine : langage machine, dit langage cible A une instruction du langage source correspondent en général plusieurs instructions du langage cible.
7 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Traduction Comment réalise-t-on sur la machine la représentation des éléments du langage source ? Génération du code : Utilisation et gestion des registres Création du code machine Représentation des variables Cours 5, TP 5 variables globales statiques, variables locales automatiques Sous-programmes Représentation Appel et retour.
8 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Module objet Résultat d’une compilation ou d’un assemblage Structure de données segments de code machine valeurs d’initialisation données liste des “externes” et “points d’entrée” informations de contrôle / mise au point Format d’entrée pour l’éditeur de liens
9 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Module exécutable Résultat d’une édition de liens Structure de données segments de code machine valeurs d’initialisation des données liste des “externes” et “points d’entrée” les externes sont “résolus” informations de contrôle / mise au point Format d’entrée du chargeur Peut contenir des “externes” non résolus chargement dynamique
10 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Un langage et son compilateur : mcc mcc : “mini C compiler” Sous-ensemble du langage C types de données : entiers 16 bits, caractères 8 bits structures de données : scalaires, tableaux et pointeurs Compilateur minimal pas de pré processeur pas d'optimisation du code généré fournit de l'assembleur en format source Utilisation compilation => assemblage => simulation
11 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 1 Expressions arithmétiques int a,b,c; /* var. globales */ a = 2; b = 5; c = (a+3)*(b-1); ld r2,#2 mul r3 st.l ld r2,r1 ld r2,#5 st.l st.l ld.l add r2,#3 data 0 sub data 0 ld data 0
12 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 1 : notes Intervention nécessaire des registres Le compilateur traite chaque instruction de manière séparée Le compilateur utilise R2, R3… selon les besoins Renommage des variables : a dans le code assembleur produit ceci permet d'utiliser r2, r3 comme noms de variables Code produit correct, mais médiocre génération indépendante de chaque instruction C pas d'optimisation spécifique mise en place
13 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 2 Expressions logiques int i,j; j = i<10; ld.l ld r3,#10 cmp r2,r3 ld ld st.l Génération explicite d'une valeur logique : 0 ou 1 Création d'étiquettes par le compilateur
14 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 3 Boucles int i; i=0; while (i<10) i=i+1; ld r2,#0 ld ld.l ld.l ld r3,#10 add r2,#1 cmp r2,r3 st.l ld data 0
15 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 4 Programme complet main() { 2+3; ld r2,#2 add r2,#3 ld r14,#0 ld r15,#0 Notes positionnement des registres R14 et R15 instruction d'arrêt
16 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 5 Variables globales ; initialisation int a=5, b; main() { b=3; ld r2,#3 st.l ld r14,#0 ld r15,#0 start data data 0
17 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 6 Variables locales ; initialisation main() { int a=5,b; b=3; ld r2,#5 st.l r2,-2(r14) ld r2,#3 st.l r2,-4(r14) ld r14,#0 ld.l r15,#-4 Utilisation de R14 comme “registre de base”
18 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Structure du programme en mémoire R14 R15 Programme et données statiques Variables locales 0x0000 0xFFFE 0xFFFC Zone utilisée par la pile
19 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 7 Un exemple : PGCD de 2 nombres int x, y, z; main() { x = 7953; y = 12291; while (x != y) { if (x > y) { z=x; x=y; y=z; } y = y-x; } out (x); }
20 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Le code ld.l r2,#7953 st.l ld.l r2,#12291 ld.l ld.l cmp r2,r3 ld ld ld.l ld.l cmp r2,r3 ld ld ld.l st.l ld.l st.l ld.l ld.l ld.l sub r2,r3 ld.l ld r0,r2 trap 13,3 trap 13,2 ld r14,#0 ld r15,#0 start data data data 0
21 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation des sous-programmes Choix et contraintes Passages des paramètres, retour du résultat : où, et comment ? Possibilités : registres, pile Choix : paramètres dans les registres R2, R3, R4… résultat dans R0 Représentation des variables locales du sous-programme Initialisation des variables ? Représentation des variables statiques Initialisation ? Préservation des registres ? Qui doit le faire : appelant ou appelé ? Choix : appelé
22 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 8 Sous-programmes - Arguments int incr(int x) { return x+1; } main() { incr(3); ld.l ld r2,#3 add r2,#1 ld r0,r2 ld r2,r0 pop ld r14,#0 ld r15,r14 ld r15,#0 pop r14 push r14 ld r14,r15 push r2
23 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 8 : Notes - 1 Appel du sous-programme : paramètre dans R2 Prologue du sous-programme : Avant appel : R2=3, R14=0, R15=0 Appel : empile adresse retour (0x24) R15=0xFFFE Exécution du Prologue push r14 ld r14,r15 push r2 Après le prologue : R14=0xFFFC, R15=0xFFFA R14 R15 0x0000 0xFFFE 0xFFFC xFFFA 0024
24 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 8 : Notes - 2 Épilogue du sous-programme : Avant retour : R0=4, R2=3, R14= 0xFFFC, R15= 0xFFFA Exécution de l'épilogue pop r2 ld r15,r14 pop r14 Après l'épilogue R0=4, R2=3, R14=0, R15=0xFFFE Retour du sous-programme : résultat dans R0 R0=4, R2=3, R14=0, R15=0
25 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 8 : Notes - 3 Registre R14 : accès aux arguments premier argument = -2(R14), deuxième = -4(R14), etc… La pile contient : Adresse de retour ici 0x0024 Sauvegarde registre R14 (registre de base de l'appelant…) Valeur des paramètres ici, un seul, R2 [ Sauvegarde des registres modifiés par l'appelé ] aucune sauvegarde nécessaire dans le cas présent [ Variables locales de l'appelé ] aucune dans le cas présent
26 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 9 Sous-programmes - Variables locales int sub() { int x=3; return x+1; } main() { sub(); ld r2,#3 st.l r2,-2(r14) ld.l r2,-2(r14) add r2,#1 ld pop r2 add r15,#2 ld r15,r14 pop r14 push r14 ld r14,r15 sub r15,#2 push r2
27 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 9 : Notes Le sous-programme n'a pas de paramètre, mais une variable locale ; il a besoin d'un registre de travail Prologue : Sauvegarde R14 de l'appelant Positionne R14 de l'appelé Réserve 2 octets pour x Sauvegarde R2 Épilogue : Opérations inverses push r14 ld r14,r15 sub r15,#2 push r2 pop r2 add r15,#2 ld r15,r14 pop r14
28 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 10 Sous-programmes - Variables locales statiques int sub() { static int x=3; return x+1; } main() { sub(); ld.l add r2,#1 ld pop r2 ld r15,r14 pop r14 push r14 ld r14,r15 push data 3
29 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation 10 - Notes Une variable locale statiques est similaire à une variable globale Le compilateur génère un nom “unique” ici, ” remplace le nom “ x ” choisi par l'utilisateur
30 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 11 Tableau global int tab[10]; main() { tab[3]=5; ld r2,#5 ld r3,#3 sll r3,#1 st.l ld r14,#0 ld r15,#0 start bss 20 Notes : “sll r3,1” permet de passer de l'indice de l'élément à un déplacement en octets à l'intérieur du tableau utilisation de l'adressage indexé
31 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 12 Tableau local main() {int tab[10]; tab[3]=5; ld r2,#5 ld r3,#3 sll r3,#1 add r3,r14 st.l r2,-20(r3) ld r14,#0 ld.l r15,#-20 Notes : Le tableau est réservé dans la pile “sll r3,1” permet de passer de l'indice de l'élément à un déplacement en octets à l'intérieur du tableau utilisation de l'adressage indexé ; une instruction machine supplémentaire est nécessaire pour accéder à l'élément
32 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Compilation - 13 Tableau passé en paramètre int sub(int tab[10]) { return tab[3]; } int tab[10]; main() { tab[3]=5; sub(tab); ld r2,#3 sll r2,#1 add.l r2,-2(r14) ld r3,(r2) ld pop r3 pop r2 ld r15,r14 pop r14 push r14 ld r14,r15 push r2 push ld r2,#5 ld r3,#3 sll r3,#1 st.l la.l ld r2,r0 ld r14,#0 ld r15,#0 start bss 20