Développement d'un compilateur C vers ByteCode pour machine virtuelle

Résolu
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 20 sept. 2009 à 19:16
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009 - 23 sept. 2009 à 21:43
Bonjour !

Je souhaiterais développer un simple compilateur C pour une machine virtuelle.

Existe-t-il des "briques logicielles" de base pour construire un tel compilateur, que je pourrais utiliser afin d'accélérer ce développement (encodage en C/C++ de la grammaire C, de l'analyseur syntaxique, etc) ?

Cordialement,
Xterminhate.

8 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 sept. 2009 à 01:35
Si tu veux réaliser un compilateur de C, je te conseille les outils suivants:
- Flex/Bison (ou lex/yacc) pour générer à partir de la grammaire un AST.
- La bibliothèque Boost, pour tout ce que ça apporte. (Boost::Assign, Boost::Bind, Boost::Spirit, et bien d'autre ...).
- Une bonne connaissance des designs patterns (notamment visitor), des templates, et des traits.
- De la patience, car c'est vraiment long à réaliser.

A noter que Boost Spirit pourrait tout à fait remplacer le couple Flex/Bison.

Je me fait un peu de pub, je sais, mais j'ai déjà réalisé un mini compilateur. Réaliser un compilateur de C, n'est pas foncièrement plus difficile, c'est juste plus long.
http://www.cppfrance.com/codes/COMPILATEUR-PSEUDO-PASCAL_49318.aspx
3
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
21 sept. 2009 à 09:27
Merci pour ta réponse, CptPingu !

En effet, je connais Boost (partiellement) et je souhaiterais l'utiliser quasi exclusivement pour réaliser ce compilateur. Je vois au moins l'intérêt d'avoir un programme homogène en pur C/C++. Flex/* est certainement une suite d'outils très puissante, mais j'ai peur de perdre trop de temps à apprendre à l'utiliser.

Je vais regarder ton code source. L'architecture de ton compilateur peut elle être réutilisée pour compiler du langage C ? Mon objectif est d'offrir un support minimum du langage C (toutes les construction grammaticales ne seront certainement pas compilables par mon projet et cela reste acceptable).

Une grammaire LL(1) pour le langage C est elle disponible sur le net à ta connaissance (prête à être programmée en C/C++ ou Flex/*) ?

Cordialement,
Xterminhate.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
21 sept. 2009 à 12:56
Le principe de mon compilateur peut être réutilisé. En revanche, certaines parties peuvent te servir, mais il n'est pas réutilisable en l'état. En effet, je me suis imposé de ne rien utiliser en dehors de la STL. J'ai donc codé le lexeur/parseur "à la main", et il n'y donc pas de Boost.

Boost::Spirit réalise le "lexer" et le "parser", et te génère normalement un AST.

La grammaire du C se trouve facilement (recherche "grammaire BNF du C" sous google, ex: http://www.google.com/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Flists.canonical.org%2Fpipermail%2Fkragen-hacks%2F1999-October%2F000201.html&ei=N1q3SsW5F8mk4Qb9lfh8&usg=AFQjCNGhjLcZmN6O68WwiA7yHczvJ5KKsg&sig2=E01Oy5bbb5PPu7T8Fy1_fA)

Il me semble avoir vu un lexer/parser de C déjà prêt en Boost::Spirit sur le site officiel, mais je ne l'ai pas testé http://spirit.sourceforge.net/repository/applications/c.zip
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
22 sept. 2009 à 12:07
Au sujet du "lexer", on trouve dans Boost une bibliothèque particulièrement adaptée : "wave". Elle doit se baser sur "spirit".

Elle transforme le code source C/C++ en une liste de "tokens" accessibles au travers d'un iterateur. Cela semble être une base solide !

Si je comprends bien, l'étape suivante consiste à transformer cette liste de "tokens" à plat en un AST (c'est ce que tu appelles le "parser") ?

Cordialement,
Xterminhate.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 sept. 2009 à 12:10
Je ne suis pas sur que tu es besoin de Boost::Wave. Boost::Spirit devrait être suffisant et il réalise normalement l'AST. As-tu testé l'exemple que je t'ai donné ? Il ne convient pas ? (Je ne l'ai pas testé).
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
22 sept. 2009 à 18:43
L'exemple parait très bien, mais impossible d'y ajouter une "action sémantique" en respectant la syntaxe donnée dans l'aide en ligne.

Bizarre, les exemples donnés avec la bibliothèque spirit marchent mieux.

Cordialement,
Xterminhate.
0
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
23 sept. 2009 à 16:40
Bonjour,

Je me demande quel est l'intérêt de fabriquer un compilateur C alors que GCC le fait très bien.

J'ai peut-être mal saisi ton concept de machine virtuel mais pour moi c'est un programme qui reproduit le fonctionnement d'une machine sur lequel on installe un OS.

Merci et bonne prog,
@++

Victor
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
23 sept. 2009 à 21:43
Victor,

La machine virtuelle, dont il est question, est spécifique. Elle reprend certains concepts de la machine virtuelle Java.

Elle expose un jeu d'instructions pour lequel il n'existe aucun OS ou logiciel compatible à ce jour.

La seule facon de l'exploiter est de programmer directement en langage machine (byte code). Cela n'est pas pratique.

D'ou l'idée de développer un compilateur pour cette machine virtuelle.

Cordialement,
Xterminhate.
0
Rejoignez-nous