phase de compilation

Cours : compilation 2

Introduction :

1.1.2 Historique

– Avant 1950

– Langage machine : suite de nombres écrits dans le système hexadécimal. Certains

nombres représentent des instructions, d’autres des valeurs, etc. (0A 43)

– Langage d’assemblage : il contient des instructions faisant intervenir les registres

de l’unité centrale de l’ordinateur, les données.

Ex : ADD #2, R1

– Introduction des étiquettes dans le langage d’assemblage dans le but de faciliter

les branchements (boucles, sauts).

– Introduction des variables

Ex : MOV R1, b

– Définition des Langages de haut niveau (1950)

– expressions

– fonctions

– structures de données

– Définition des langages à objets (1970)

– Classes, Objets, méthodes, variables d’instance

– Héritage

– polymorphisme

Compilateur

Tout programme écrit dans un langage de haut niveau doit être traduit en instructions

exécutables par un ordinateur. Le programme effectuant cette traduction est un compilateur.

Il est préférable que le programme soit indépendant du système sur lequel il doit s’exécuter.

Ce n’est pas toujours le cas. On peut introduire des instructions en langage d’assemblage

dans le langge C par exemple.

Le programme n’a pas besoin du compilateur lorsqu’il est exécuté.

La compilation est un peu plus compliquée.

fichier source 1 −! compilateur −! fichier objet 1

fichier source 2 −! compilateur −! fichier objet 2

fichier objet 1, fichier objet 2 −! programme exécutable

Exemples de langages compilés : Pascal, C, C++, ADA, Fortran, Cobol

Interpréteur

Un interpréteur travaille simultanément sur les données et sur le programme source. Il

analyse une Ãa une les instructions du programme, les “compile” et les exécute.

– L’interpréteur doit être présent sur le système où le programme s’exécute

– L’exécution est plus lente

– On peut modifier le source pendant l’exécution

Exemples de langages interprétés : Basic, Lisp, Scheme, Tcl, Perl, Prolog, Smaltalk

Langage Intermédiaire

Le code source est traduit dans une forme binaire (pseudo-code). Ce code est interprété

et exécuté. Exemple de Java : fichier source (.java) −!compilateur (javac) −!fichier objet

(.class)

Les fichiers objet (et les ressources) peuvent être regroupés dans des fichiers archives (.jar).

Les fichiers objet −! interpréteur (JVM) −! résultat.

Exemples de langages intermédiaires : Java, Python.

Phases de la compilation

Le but d’un compilateur est de traduire un programme source écrit dans un certain

langage en un programme cible écrit dans un dans un autre langage. Le plus souvent, le

langage cible est le langage machine, mais cela peut être seulement un code intermédiaire

optimisé (byte code java).

La compilation se décompose en 6 phases : 3 phases d’analyse et 3 phases de génération

de code. La figure 1.2 montre le fonctionnement typique d’un compilateur, même si dans la

pratique certaines phases peuvent être regroupées. Deux autres tâches interagissent avec

les six phases :

– la gestion d’une table des symboles. Celle-ci contient les identificateurs des variables

et leurs attributs (type, portée, etc.).

– la détection des erreurs. Une phase ne doit pas s’interrompre à la première erreur

rencontrée mais doit traiter les erreurs de façon à ce que la compilation puisse continuer.