Embauché à la sortie des études dans le service Base de données et Langages, et plus précisément dans le groupe langage, le premier projet auquel j'ai participé à été la réalisation d'un Compilateur C pour le système IN-Pick sur la gamme IN-500 IN-5000.
C'était un défi multiple à l'époque : à la fois prouver à la direction
que la maîtrise du système allait beaucoup plus loin que sa seule maintenance,
et aussi permettre le portage d'applications externes sur notre système.
Et ce fut une réussite: IN-Pick a été le seul système PICK à posséder un
compilateur C .... le projet fut achevé en 1986
Le Compilateur C a été réalisé par une équipe de 2 personnes, plus
le chef de service (à temps partiel.....)
Dans ce projet, j'ai réalisé le générateur de code,
l'éditeur de liens, tout le runtime, ainsi que les fonctions
de la bibliothèque standard (adaptées au sgf particulier du système
Pick). j'ai aussi participé en collaboration avec le chef de service à l'analyse
syntaxique. Une autre personne était en charge de l'analyse
sémantique.
Comme son nom l'indique, l'analyse syntaxique, est la passe du compilateur,
qui repère si le source qu'on lui donne à compiler est conforme à la syntaxe
du langage.
exemples de code C non syntaxiquement correct: il manque un ;
ou for i=1 to 10 qui est du Basic et non du C, ou bien même le texte
que vous êtes en train de lire
Dans ce projet, l'outil qui a été utilisé est l'outil présent dans le
système qui était déjà utilisé pour le Basic : Meta
Je m'en suis inspiré pour développer à titre personnel
mppksag : Un générateur
d'Analyseur Syntaxique.
Comme son nom l'indique, l'analyse sémantique, est la passe du compilateur,
qui repère si le source qu'on lui donne à compiler est conforme à la sémantique
du langage. elle se sert des résultats de la passe précédente: elle n'analyse
que du code syntaxiquement correct, les différents éléments constitutifs de
la syntaxe ont déjà été repérés. elle détecte entre autre la validité
des opérations entre les différents types.
exemples de code C syntaxiquement correct et sémantiquement non correct:
void main()
{
int a;
char *p = "coucou";
char *q = "c'est nous";
a = p+q;
}
on ne peut pas additionner 2 pointeurs pour donner un entier.
Cette passe se charge aussi de l'allocation des variables en fonction de leur
taille.
Cette passe consiste à générer le code dans le langage assembleur de la
machine cible. Dans le projet en question, la difficulté venait de la structure
de la machine Pick (partitions de 512 octets), ce qui obligeait a pas mal de
gymnastique pour simuler une machine a mémoire contiguë standard. de
même la pile utilisateur étant limitée à 3 niveaux, il a là aussi fallu faire
du développement spécifique.
C'est le module qui s'occupe de résoudre les références, entre les
différents objets issus des différentes unités de compilation, ainsi qu'avec
les fonctions de la bibliothèque standard.
C'est tout l'environnement nécessaire à l'exécution correcte d'un
programme C: initialisation du contexte, allocation des différentes zones
mémoire (tas, zone statique et globale, pile, paramètres, etc.)
Là aussi, la structure très particulière du système Pick a nécessité
pas mal de développements spécifiques.
Autre gros morceau: toute la bibliothèque standard telle que définie dans le
"Kernighan & Ritchie" printf scanf, fopen, etc . et comme
d'habitude, implémenter ces fonctions en tenant compte des particularités du système Pick.
|