Kimanuka Abre Ussen
UNIVERSITE LUMIERE DE BUJUMBURA
ukimanuka@[Link]
• Introduction
• Analyse lexicale: langages réguliers
Analyse Syntaxique: langages non contextuels
Analyse statique(par exemple typage): Grammaires attribuees
Eléments de génération de code
• Introduction a la sémantique
• Introduction, langage While et sémantique des expressions
Sémantique opérationnelle
Equivalence entre la sémantique naturelle et la sémantique opérationnelle
structure
Kimanuka Abre Ussen
UNIVERSITE LUMIERE DE BUJUMBURA
ukimanuka@[Link]
• Langages de programmation
• Types de langages et paradigmes de langages de programmation
Exécutions des langages
Les compilateurs
Structure de principe d’un compilateur
• Recommandation et Description brève de certains langages
Definition (Langage de programmation)
• Médium permettant de communiquer avec l’ordinateur à propos d’un calcul à
réaliser, ou encore entre humains sur des algorithmes de calcul
Les techniques de ce cours s’appliquent a :
• Des langages de programmation: Pascal, Ada,…
• Des langages de commande: JCL, Sh, Csh,…
• Des langages de description de données: SQL (DDL), XML
• Des langages de spécification: VDM, Z, Albert….
• Des formats de message (reseaux)
• Des langages de documents: EQN, HTML,..
1. impératifs: Algol, Pascal, Ada, Fortran, Cobol, Module, C
axes sur l’affectation
2. Fonctionnels: Lisp, ML, Hope, Miranda, Haskell, FP
basés sur l’ évaluation des expressions
3. Logiques: Prolog, Godel
basés sur la prevue de formules
4. Orientés objet: Simula, Smalltalk, C++, Eiffel, CLOS, Java
basés sur l’héritage
NB: les paradigms ne sont pas mutuellement exclusifs
1. Les interpréteurs: lisent le programme au fur et a mesure – les programmes
peuvent être crées dynamiquement
2. Les compilateurs: traduisent l’ensemble du programme
– soit en langage d’une machine concrète 486, 96, POWER
- ou soit en langage d’une machine abstraite SECD, WAM JVM, P-
MACHINE
• Définition: Un compilateur est un programme qui lit un programme écrit dans
un premier langage (le langage source) et le traduit en un programme
équivalent dans un autre langage (le langage cible).
• Le compilateur doit aussi vérifier que le programme a un certain sens et
signaler les erreurs qu'il détecte.
• Dans le sens le plus usuel du terme, la compilation est une transformation que l'on fait
subir µa un programme écrit dans un langage évolue pour le rendre exécutable.
• Fondamentalement, c'est une traduction : un texte écrit en Pascal, C, Java, etc.,
exprime un algorithme et il s'agit de produire un autre texte, spécifiant le même
algorithme dans le langage d'une machine que nous cherchons µa programmer.
• En généralisant un peu, on peut dire que compiler c'est lire une suite de caractères
obéissant a une certaine syntaxe, en construisant une (autre) representation de
l'information que ces caractères expriment.
• Il y'a deux parties dans la compilation: l'analyse et la synthèse.
La partie analyse partitionne le programme source en ses constituants et en
crée une représentation intermédiaire.
La partie synthèse construit le programme cible à partir de cette
représentation intermédiaire.
• La nature de ce qui sort d'un compilateur est très variable. Cela peut être un
programme exécutable pour un processeur physique, comme un Pentium III ou
un G4, ou un fichier de code pour une machine virtuelle, comme la machine
Java, ou un code abstrait destine µa un outil qui en fera ultérieurement du
code exécutable, ou encore le codage d'un arbre représentant la structure
logique d'un programme, etc.
• En entrée d'un compilateur on trouve toujours la même chose : une suite de
caractères, appelée le texte source.
Voici les phases dans lesquelles se décompose le travail d'un compilateur, du moins
d'un point de vue logique
• L'outil le plus important pour la programmation est certainement le langage de programmation utilisé. Les fonctionnalités du langage sont
importantes, car elles déterminent la structure des programmes laquelle détermine à son tour la lisibilité et la maintenabilité.
• Alors qu'il existe des langages de programmation spécifiques pour un domaine donné (bases de données, interfaces graphiques, etc), ici,
nous allons traiter uniquement le cas des langages de programmation généraux (en anglais : general-purpose programming languages).
• Les langages de programmation généraux sont très différents les uns des autres, même si l'on peut identifier certaines catégories contenant
plusieurs langages similaires. Le choix du langage pour un projet de programmation n'est donc pas une chose innocente. Un informaticien
doit maîtriser plusieurs, voire plusieurs dizaines de, langages généraux, ou au moins avoir une idée de leur structure générale. Cela lui
permet de faire un choix bien réfléchi du langage pour un projet donné.
• Il y a une tendance parmi les néophytes (et souvent aussi parmi les programmeurs plus expérimentés) à s'attacher à un langage de
programmation particulier, souvent le premier appris, à l'exclusion de tout autre langage. Les psychologues expliquent cette tendance
comme une réticence naturelle les humains à l'apprentissage de nouvelles choses. En effet, pendant une période d'apprentissage la
personne court le risque d'être considérée comme incompétente par son entourage tandis que l'utilisation d'un outil connu depuis longtemps
apporte une impression de sécurité et la possibilité d'être admiré par son entourage.
• Un informaticien doit à tout prix résister à ce type de tendance. L'informatique évolue tellement vite qu'il est absolument essentiel
d'appréhender en permanence de nouvelles choses. Un informaticien qui se déclare attaché à un langage particulier à l'exclusion de tout
autre langage qu'il ne connaît pas, commet donc une aberration qui risque de le faire ridiculiser par des collègues plus expérimentés. En
fait, en informatique, il est courant de parler du nombre de langages appris par an plutôt que du nombre de langages maitrisés.
Lorsqu'un informaticien souhaite s'informer à propos d'un langage de programmation, il n'a pas forcément
besoin de l'apprendre pour se faire une idée de ce à quoi ressemble le langage. Il lui suffit de déterminer
une liste de fonctionnalités (ou d'absences de fonctionnalités) du langage par rapport à d'autres langages.
Pour comprendre cela, il faut d'abord connaître les éléments essentiels d'un langage de programmation. Il
faut pour cela distinguer la syntaxe de la sémantique d'un langage. La syntaxe est liée à la forme d'un
programme écrit en ce langage. C'est la syntaxe qui détermine si l'on utilise des accolades ou des mots-
clés comme begin et end pour déterminer un bloc d'instructions, etc. La sémantique, par contre, détermine
la signification d'un programme écrit en ce langage.
Pour un informaticien, la syntaxe est presque sans sans importance. En fait, on s'habitue assez vite à une
nouvelle syntaxe. Il y a bien sûr des langages où la syntaxe est extrême, par exemple excessivement
verbeuse (COBOL) ou excessivement brève (APL). Mais pour une grande majorité de langages, la syntaxe
ne pose pas de problème. L'informaticien qui souhaite se renseigner sur la syntaxe du langage sera
intéressé par une très brève description de la syntaxe, parfois avec des points particuliers où le langage
est très différent de la plupart des langages qu'il connaît.
La sémantique, par contre, est très importante. C'est souvent elle qui détermine s'il est facile d'écrire des
programmes maintenables. La sémantique détermine si le langage est capable de supporter des styles de
programmation différents, comme la programmation impérative, la programmation fonctionnelle ou encore
la programmation orienté-objets.
• Il y a plusieurs paramètres d'un langage de programmation que l'on peut utiliser pour décrire brièvement le langage.
• On peut caractériser sa syntaxe. Cette caractérisation se fait souvent par une comparaison avec des langages connus.
Si la syntaxe ne ressemble à aucun autre langage, on peut donner une description brève des points les plus importants.
• La signification de l'affectation peut varier d'un langage à un autre. Dans certains langages, l'identité d'un objet est
préservée par l'affectation. Nous allons appeler cette fonctionnalité sémantique par référence uniforme, car l'affectation
manipule des références à des objets et non les objets eux-mêmes. Certains autres langages définissent l'affectation
comme une copie de l'objet affecté. Nous allons appeler cette fonctionnalité sémantique par copie.
• Certains langages imposent que le programmeur libère explicitement la mémoire allouée. Nous parlons alors
de gestion manuelle de la mémoire. Si par contre le langage s'occupe lui-même de cette libération, nous parlons
de gestion automatique de la mémoire.
• Pour certains langages, le type (par exemple entier, flottant, chaîne de caractères, etc) de chaque variable doit être
connu du compilateur, donc avant l'exécution du programme. Ces langages sont dits à typage statique. Si de plus c'est
au programmeur d'indiquer le type, on parle de typage explicite. On dit typage statique mais typage implicite si c'est le
compilateur qui s'occupe de déterminer le type des variables. Un langage dont les variables ne sont pas typées, mais
dont les objets valeurs de ces variables le sont est dit à typage dynamique.
• Un langage dont le moyen d'abstraction principal est la procédure est appelé langage procédural. La plupart des
langages impératifs classiques sont procéduraux. Un langage dont le moyen d'abstraction principal est la fonction (une
fonction étant une procédure sans effet de bord, c'est-à-dire qu'elle ne peut modifier l'environnement à partir duquel
elle est appelée) est appelé un langage fonctionnel. La programmation avec un tel langage consiste à construire et à
composer de petites fonctions. Un langage orienté-objets est un langage dont l'abstraction principale est l'objet.