Développement d'un compilateur C vers ByteCode pour machine virtuelle [Résolu]

xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 20 sept. 2009 à 19:16 - Dernière réponse : xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 21 sept. 2009 à 01:35
3
Merci
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 78 internautes ce mois-ci

Commenter la réponse de cptpingu
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 21 sept. 2009 à 09:27
0
Merci
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.
Commenter la réponse de xterminhate
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 21 sept. 2009 à 12:56
0
Merci
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
Commenter la réponse de cptpingu
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 22 sept. 2009 à 12:07
0
Merci
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.
Commenter la réponse de xterminhate
cptpingu 3794 Messages postés dimanche 12 décembre 2004Date d'inscription 10 juin 2018 Dernière intervention - 22 sept. 2009 à 12:10
0
Merci
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é).
Commenter la réponse de cptpingu
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 22 sept. 2009 à 18:43
0
Merci
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.
Commenter la réponse de xterminhate
victorcoasne 1100 Messages postés jeudi 24 avril 2003Date d'inscription 17 octobre 2012 Dernière intervention - 23 sept. 2009 à 16:40
0
Merci
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
Commenter la réponse de victorcoasne
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 23 sept. 2009 à 21:43
0
Merci
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.
Commenter la réponse de xterminhate

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.