[Kos-dev] Pseudo-compilateur
kos-dev@enix.org
kos-dev@enix.org
24 Dec 2001 16:43:36 +0100
salut,
ce WE j'etais chez Julien a Saverne, et nous avons donc pu commencer a
travailler sur le pseudo compilateur. ce pseudo compilateur est charg=E9
de deux taches distinctes (mais liees) :
1. convertir des fichiers de description d'interface (.ki) en
.h et en code C correspondant
2. faire quelques remplacements sur des fichiers de code (.k)
et notamment remplacement du pointeur "this", ainsi que des noms de
methodes.
Nous avons commence par reflechir sur le deroulement de la
compilation. Apres moultes reflexions, nous avons decide la chose
suivante :
Chaque .ki sera compile separement. La compilation d'un .ki ne
donnait lieu =E0 la g=E9n=E9ration que d'un seul et unique .h. Si le =
.ki
comporte des inclusions d'autres .ki, ceux ci sont simplement
recopies sous forme d'inclusion en .h dans le .h genere. Bref la
traduction d'un .ki a lieu avant le passage dans CPP. Cette methode
permet de generer une seule fois les fichiers .h. Avec d'autres
methodes, on en serait arrive a regenerer plusieurs fois les memes
.ki en .h.
D'autre part les .k seront compiles ensuite. Les .ki inclus dans ces
.k seront analyses (et representes sous forme de liste en memoire)
afin de faciliter le remplacement du pointeur this et des noms des
methodes. En aucun cas cette analyse ne donne lieu a la generation
de .h. Pour realiser cette analyse nous avons besoin de toute la
chaine des interface et interface virtuelle pour retrouver les
membres pointes par this. Pour cela, chaque .ki inclus dans un .k
est d'abord passe par CPP.
On peut constater qu'il a des taches identiques entre les deux parties
:
- prendre un .ki et generer un flux de token (module Klex)
- prendre un flux de token et generer une representation en
memoire des structures de donnees (module Synt)
Pour la realisation de la premiere partie, un autre module a ete
realise : Out. Il prend la representation en memoire des structures de
donnees, et genere le .h correspondant.
Pour la seconde partie, on a le module Ktest (nom temporaire). Grosso
modo ce module prend un .k en entree, et fait des grosses bidouilles
pour trouver les .ki. Ensuite pour chaque .ki il lance CPP puis lance
l'analyse du module Klex puis Synt. On se retrouve donc pour chaque
.ki inclus avec une representation en memoire des structures de
donnees. Plus tard ce module devra aussi effectuer les remplacements
de pointeur "this" et les remplacements de noms de methodes.
Pour l'analyse d'un .ki TOUS les mots sont analyses : il y a un vrai
analyseur lexical, un vrai analyseur syntaxique.
Pour l'analyse des .k on fait ca "gros goret". En effet c'est plutot
lourd de devoir analyser tous les token du langage C pour juste
effectuer quelques remplacements mineurs. Je sais pas ce que ca va
donner dans le futur, mais ca vaut le coup d'essayer.
Pour tester :
- compiler la chose : make clean all
- compiler un .ki : ./kicompil fichier.ki fichier.h (et zou)
- compiler un .k : ca sert pas a grand chose le fichier genere est
presque identique au fichier d'entree. par contre on peut s'amuser en
mode interactif pour constater que le machin reconstruit bien une
representation en memoire des structures de donnees.
Pour tester en mode interactif :
Pour le compilo de .ki :=20
#load "klex.cmo";;
#load "synt.cmo";;
open Klex;;
open Synt;;
let blarf =3D=20
read_ki_file(analyze_flux(create_stream(
open_file "test/test.ki")));;=20
=20=20
Et zou ca genere une representation des donnes pour l'interface
designee par test.ki (et seulement celle la).
Pour le compilo de .k :
C'est rigolo d'essayer parce que la representation en memoire qui
est generee comprend l'interface designee par le .ki inclus mais
aussi toutes les interfaces virtuelles qui sont parentes de cette
interface.
La c'est un peu plus chaud. Deplacer tous les fichiers du repertoire
test/ dans le repertoire ou se trouvent les sources. Ensuite en mode
interactif :
#load "klex.cmo";;
#load "synt.cmo";;
#load "ktest.cmo";;
open Klex;;
open Synt;;
open Ktest;;
let in_flux =3D create_stream(open_file "test.k");;
let out_file =3D open_out_file "log";;
analyze_flux2 out_file in_flux;;
Et zou le fichier est genere. Pour voir la liste des
interfaces/interfaces virtuelles :
!ki_list;;
ATTENTION : tel quel le compilo de .k n'est pas utilisable en mode
non interactif : il faut decommenter la derniere fonction puis
recompiler. Les fichiers .k et .ki doivent etre dans le meme
repertoire que l'executable, sinon il y a des problemes de chemins.
Voila, j'espere qu'on aura un peu de feedback (au moins de toi d2)
concernant ce truc pour savoir si il faut qu'on continue dans cette
voie ou non.
Les sources sont dispo dans kos-dev (pas d'integration dans le module
kos pour le moment, c'est du beta pre alpha).
A bientot,
Thomas
--=20
PETAZZONI Thomas
thomas.petazzoni@enix.org UIN : 34937744
Projet KOS : http://kos.enix.org
Club LinUT : http://club-linut.enix.org