Nom : N° Etudiant: Programmation bas niveau - L2 informatique Premier Contrôle Continu Ecrit - Correction Jeudi 31 octobre 2013 (1 heure – aucun document autorisé) Exercice 1 : Questions de cours (5 points) Répondre en quelques lignes à chacune des questions ci-dessous. 1. Qu’est-ce qu’un langage de programmation bas niveau ? Donner un exemple de langage de bas niveau et un exemple de langage de haut niveau. Un langage de programmation bas niveau est un langage proche du matériel : son jeu d’instruction est proche de celui de la machine sur lequel il s’exécute. Le langage Jasmin est un langage de bas niveau. Python est un langage de haut niveau. 2. Qu’est-ce qu’une machine virtuelle ? Citer au moins deux avantages et un inconvénient d’une telle machine. Une machine virtuelle est un programme exécutant un autre programme avec le fonctionnement et la structure d’une machine physique traditionnelle. Les avantages sont la portabilité (le programme exécuté a le même code quelque soit le système d’exploitation considéré) et la richesse des bibliothèques de fonctions. L’inconvénient est la vitesse d’exécution : il y a une interprétation supplémentaire du code. 3. Qu’est-ce qu’un bytecode ? Donner la commande Java générant du bytecode à partir d’un fichier écrit en java. Un bytecode est le code d’une opération sur 1 octet (byte). La commande Java générant du bytecode à partir d’une fichier .java est javac. 4. Qu’est-ce qu’un langage assembleur ? Citer un exemple de langage assembleur. Un langage assembleur est un langage composé de mnémoniques correspondant à un langage machine binaire. Il est donc lisible et manipulable par des humains. Le langage Jasmin est un langage assembleur. 5. Citer quatre types de base de la machine virtuelle Java. Types de base de la JVM : byte, short, int, long, char, float, double, class. Exercice 2 : Analyse de code (5 points) Trouver, corriger et expliquer chacune des 5 erreurs du programme ci-dessous. 1/3 Nom : 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 N° Etudiant: .class public prg1 .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 35 ; la pile compte 5 éléments max : out, nb1, 5.0, 5.0, 5.0 getstatic java/lang/System/out Ljava/io/PrintStream; bipush 4 bipush 3 idiv ; ajouter i2f après ça ldc 3.141593 fmul ; on multiplie un entier par un flottant, on met i2f avant bipush ldc 5.0 ; bipush ne peut traiter que des entiers dup dup fmul fmul fmul fmul ; ce fmul est en trop : il n’y a qu’un seul nombre dans la pile à ce moment invokevirtual java/io/PrintStream/println(IF)V ; on affiche un flottant, pas un entier return .end method Exercice 3 : Programmation (3 points) Le volume V d’un cylindre dont la hauteur est h et dont la base a pour rayon r est 𝑽 = 𝛑 𝐫𝟐 𝐡 Ecrire une suite d’instructions jasmin qui calcule et affiche à l’écran le volume d’un cylindre dont la hauteur est h = 7 et dont la base a pour rayon r = 3. getstatic java/lang/System/out Ljava/io/PrintStream; bipush 3 bipush 3 imul bipush 7 imul i2f ldc 3.1415 fmul invokevirtual java/io/PrintStream/println(F)V Exercice 4 : Programmation (7 points) Ecrire un programme jasmin qui implémente l’algorithme ci-dessous. n = 135 tant que n > 1 : afficher n si n est multiple de 3 alors n = n/3 sinon n = 2 × n + 1 afficher n 2/3 Nom : N° Etudiant: .class public Programme .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 2 ; le nombre dont on part: sipush 135 istore 1 start: iload 1 iconst_1 if_icmple end getstatic java/lang/System/out Ljava/io/PrintStream; iload 1 invokevirtual java/io/PrintStream/println(I)V iload 1 iconst_3 irem ifne calcul2 calcul1: iload 1 iconst_3 idiv istore 1 goto start calcul2: iload 1 iconst_2 imul istore 1 iinc 1 1 goto start end: getstatic java/lang/System/out Ljava/io/PrintStream; iload 1 invokevirtual java/io/PrintStream/println(I)V return .end method 3/3