prenant en donn´ee le code source d’un programme et en
produisant en sortie un ex´ecutable.
Remarque : en g´en´eral, un compilateur ne fonctionne que
pour un seul langage et pour une seule plate-forme. Ainsi,
un compilateur C ne saura pas compiler un programme
´ecrit en Basic. De la mˆeme mani`ere, l’ex´ecutable produit
par un compilateur pour microprocesseurs Intel 8086 ne
pourra pas ˆetre ex´ecut´e par une machine Apple munie d’un
microprocesseur Motorola.
D.2 Compilation efficace
Parmi les facteurs de qualit´e des logiciels, nous avons
la performance. Or, pour un code source donn´e, plusieurs
traductions vers le langage machine sont possibles,
certaines ´etant plus performantes que d’autres. Un
compilateur est d’autant plus efficace qu’il produit du code
machine performant.
Toutefois, plus le langage de programmation est
´eloign´e du langage machine, plus les techniques de
compilation permettant de produire du code efficace
deviennent difficile `a trouver. Ainsi, il est malheureusement
fr´equent que les cr´eateurs de langages de programmation
prennent en compte les contraintes de compilation pour
sp´ecifier leur langage ce qui entraˆıne in´evitablement
un appauvrissement du langage (moins d’expressivit´e)
voire une complexification (cr´eation de nombreux cas
particuliers).
D.3 Compilation s´epar´ee et globale
code
binaire
code
binaire
code
source
code
source
programme
source du
code
binaire
exécutable
compilation
de liens
édition
compilation
Fig. 5. La compilation s´epar´ee
La compilation est un processus complexe et, pour de
nombreuses raisons pratiques, un programme n’est jamais
compil´e d’un coup. On pr´ef`ere compiler un programme par
petits bouts puis produire un ex´ecutable en liant ensemble
les petits bouts compil´es : on appelle ¸ca la compilation
s´epar´ee (voir figure 5). Les avantages d’une telle fa¸con de
faire sont nombreux : si l’on modifie un programme, seul le
bout de code modifi´e a besoin d’ˆetre recompil´e ; une seule
compilation d’un bout de code est n´ecessaire mˆeme si celui-
ci est partag´e par plusieurs programmes (cela arrive tr`es
fr´equemment) ; un bout de code compil´e s´epar´ement peut
ˆetre vendu tel quel `a d’autres programmeurs (le vendeur
qui le souhaite peut ainsi garder le code source secret).
S’il existe une (( compilation s´epar´ee )), c’est qu’il existe
une (( compilation globale )). Celle-ci consiste `a compiler
d’un coup un programme en entier. L’avantage de la
compilation globale consiste `a profiter de la connaissance
de la totalit´e du code source pour faire des analyses plus
profondes et ainsi tenter de produire du code machine plus
efficace. Malheureusement, la compilation globale n’offre
pas la souplesse de la compilation s´epar´ee, `a tel point que
dans l’industrie, l’utilisation de compilateurs globaux est
marginale.
III. PRM, le langage
PRM, pour (( Programmation, raffinement et modules )),
est le langage de programmation que nous avons d´evelopp´e.
C’est un langage de programmation orient´e objet et
statiquement typ´e. Il se place donc dans la mˆeme famille
que C++, Java, C# ou Eiffel6(les autres langages que nous
citons ne faisant pas partie de cette famille). Toutefois,
contrairement `a ces quatre langages, PRM se distingue
de deux mani`eres : sa simplicit´e, puisque les concepts
manipul´es par le langage, ainsi que la syntaxe qui en
d´ecoule, ont ´et´e sp´ecifi´es de fa¸con `a ˆetre le plus clair possible
(en particulier parce que nous n’avons pas pris en compte
dans la sp´ecification du langage les ´eventuels probl`emes de
compilation), et son expressivit´e, puisque celui-ci contient
entre autre des traits de langages avanc´es qui n’existent que
dans quelques langages voire sont compl`etement in´edits !
La syntaxe du langage est fortement inspir´ee de celle
des langages `a typage dynamique et des langages de script
(en particulier Ruby7). Ces langages sont g´en´eralement
r´eput´es pour leur facilit´e d’apprentissage et d’utilisation.
Toutefois, PRM revendique Pascal comme l’un de ses
lointains ancˆetres8. Au final PRM est sans doute un tr`es
bon langage pour d´ebuter la programmation, d’ailleurs
malgr´e sa jeunesse il est d´ej`a utilis´e en tant que langage
d’apprentissage `a l’IUT de B´eziers.
Bien que les concepts de base du langage soient (`a
dessein) peu nombreux, celui-ci en int`egre certains qui sont
plus ou moins rares :
– h´eritage multiple (existe en Eiffel et en C++) :
les classes peuvent h´eriter de plusieurs classes. Cela
permet par exemple d’exprimer que les poulets sont `a
la fois des oiseaux et des animaux de basse-cour.
– les types primitifs sont des classes (existe en Eiffel et
Ruby) : les autres langages traitent de fa¸con diff´erente
les types primitifs (comme les entiers) des classes ce
qui am`ene parfois `a des complications inutiles pour le
programmeur.
– g´en´ericit´e born´ee (existe en Eiffel et dans la derni`ere
version de Java, existe aussi de fa¸con non born´ee en
C++) : c’est un concept qui permet d’augmenter le
niveau d’abstraction du code source.
– red´efinition covariante (existe en Eiffel mais pas
exactement pour les mˆemes raisons) : cela permet par
exemple d’exprimer des choses comme (( les animaux
mangent de la nourriture et les vaches mangent de
l’herbe ))9.
– it´erateurs automatiques (existe en Ruby et dans la
derni`ere version de Java) : cela permet de manipuler
6Bjarne Stroustrup a d´evelopp´e C++ au cours des ann´ees 1980 en
tant qu’extension du langage C. Java est un langage con¸cu en 1995
chez Sun Microsystems par James Gosling et Patrick Naughton. C#,
cr´e´e par la soci´et´e Microsoft, est un langage proche de Java. Eiffel,
d´evelopp´e par Bertrand Meyer `a partir de 1985, est un langage qui se
concentre sur la qualit´e logicielle.
7Yukihiro Matsumoto a commenc´e l’´ecriture de Ruby en 1993 avec
un objectif de coh´erence et d’intelligibilit´e.
8Pascal est un langage cr´ee par Niklaus Wirth en 1970 `a l’universit´e
de Zurich. Il a ´et´e con¸cu pour servir `a l’enseignement de la
programmation de mani`ere rigoureuse mais simple.
9Toute la subtilit´e d’une telle banalit´e consiste `a remarquer qu’il
existe malgr´e tout un sophisme : les animaux mangent de la
nourriture, or les vaches sont des animaux, donc les vaches mangent de
la nourriture, or les saucisses sont de la nourriture, donc on pourrait
nourrir les vaches avec des saucisses.