12
votes

Comment écrire un compilateur simple en C / ++?

Duplicaté possible:

Apprendre à écrire un compilateur

Hi Stack Whideflow, maintenant Ne me méprenez pas, je n'ai pas l'intention d'écrire un compilateur pour C ++ (bien que j'ai l'intention de l'écrire en C ++) ou Java ou un autre langage de programmation complexe de haut niveau. Je veux juste apprendre les bases de la conversion d'une instruction de base définie dans une exécutable Windows (par exemple, juste une langue simple avec 5-6 fonctions, entièrement personnalisée). De plus, je ne veux pas télécharger de bibliothèques ni de fichiers d'en-tête. Si vous pouviez me lier à n'importe quel exemple de source ou de tutoriels très fondamentaux, il serait grandement apprécié!


6 commentaires

C'est quelque chose que je n'ai jamais vraiment pu trouver quelque chose d'expliquer. Désolé j'ai causé un facipalm = (


Version primordiale Apprendre à écrire un compilateur . Pour Simple, vous voulez le tutoriel Crenshaw, mais aussi simple que vous ne veux faire C ++ ...


@DMCKEE +1 sur ne pas vouloir C ++ - compilateurs sophistiqués suffisamment sophistiqués pour avoir besoin d'un arbre d'analyse nécessite beaucoup de manipulations d'arbres, et C ++ (et Java, et à peu près n'importe quelle langue en dehors de la famille ML / HASKELLL et des langages similaires inspirés comme Scala) vraiment pue dans les manipulations des arbres.


@Michael: La raison pour laquelle vous ne voulez pas faire C ++ est que C ++ a une grammaire infernale avant même d'autoriser des modèles.


Le mot "simple" et "compilateur" n'appartiennent pas à la même phrase ensemble. Construire même un petit compilateur avec des fonctionnalités très limitées est un ordre de grandeur.


J'ai essayé d'écrire un interprète à Python, ça s'est bien passé bien ...


6 Réponses :


7
votes

Jack Crenshaw's Construisons un compilateur est un bon tutoriel pour commencer avec. C'est un bon écrivain et rend le sujet facile à comprendre.


0 commentaires

4
votes

Voici ce que vous devez écrire un compilateur de base:

  1. analyseur. Vous aurez besoin d'analyser votre langue et de faire une syntaxe abstraite. Vous voudrez peut-être en savoir plus sur la rédaction d'analyseurs. Vous pouvez utiliser l'analyseur à la main, ou vous pouvez utiliser des générateurs d'analyseurs, E.G Lex / Yacc.
  2. assemblage. Vous devrez générer des instructions de montage former l'arbre de syntaxe.
  3. jeu d'instructions. Vous devrez traduire l'assemblage en code de machine, dans un jeu d'instructions spécifique (typique Intel et AMD CPU utilise le jeu d'instructions X86; Vous pouvez également cibler le jeu d'instructions de Java VM ou IL).

2 commentaires

@Mathepic: Je n'ai pas prétendu que c'était un analyseur.


Je voulais dire générateur d'analyseurs.




0
votes

Je recommanderais www.antlr.org. J'ai travaillé dans C #, mais il est favorable à C, Java, Python et plus.


0 commentaires

3
votes

En fait, la chose la plus importante que vous avez besoin est de comprendre le format binaire des fichiers .exe (Sauf si vous prévoyez d'utiliser un éditeur de liens existant, à quel point je pense que vous devez les fichiers de sortie qui ont également un format binaire ).

Vous devez également traiter avec beaucoup de réunion, sauf si vous êtes déjà familier avec le jeu d'instructions x86, je vais essayer autre chose.

Voici quelques possibilités:

  • Il y avait une chose appelée « minuscule C » - Je devine que voici: http : //bellard.org/tcc . C est un petit assez bon compilateur pour se construire, mais pas si complexe qu'il est difficile de comprendre. Il est un bare-bones « Comment à construire un compilateur » leçon dans une boîte. Sali avec sur le 8088.

  • Sortie pour un cpu "embarqué". Ils ont tendance à avoir les langages d'assemblage simples et les formats exécutables très clairement définis. Ce serait un bon endroit pour commencer.

  • Output code C au lieu d'un binaire. Ceci est un tricheur sûr, mais vous pouvez vous concentrer sur votre langue et ne vous inquiétez pas trop sur le langage assembleur.

  • Enfin, si vous voulez vraiment creat directement un fichier .exe, d'abord écrire une application qui produit un exe « Bonjour tout le monde ». Ne vous embêtez pas l'avoir quoi que ce soit « Compile », juste modifier à la main le code, le faire entrer dans le format exe et exécutez-le - en faisant cela, vous savez que vous avez été tous vos morceaux alignés et dans les bons endroits, vous peut commencer sur un compilateur avec une certaine confiance.

    Après cela, la création puis la langue peut être fait par un grand nombre de procédures données ici - mais si vous voulez juste pour voir comment tout cela fonctionne, je voudrais certainement faire quelques petites itérations d'abord, ne vous inquiétez pas ce que vous courrez dans jusqu'à ce que vous exécutez en elle.


0 commentaires

0
votes

Pour apprendre comment la construction d'un compilateur est différent en C ++ que dans, dis, c ou pascal, essayez le boost Esprit Cadre d'analyseur.

Ceci suppose la familiarité avec C ++.

Pour apprendre à la création d'un compilateur, je suggère d'utiliser une langue plus simple que c ++, puis peut-être avancer à C ++.

acclamations et hth.,


0 commentaires