Quelle serait la façon la plus simple de créer un compilateur C pour un processeur personnalisé, en supposant bien sûr que j'ai déjà un assembleur pour cela?
Puisqu'un compilateur C génère un assemblage, existe-t-il un moyen de simplement définir des bits et des morceaux standard de code assembleur pour les différents idiomes C, de reconstruire le compilateur et ainsi d'obtenir un compilateur croisé pour le matériel cible?
De préférence, le compilateur lui-même serait écrit en C et construit comme un exécutable natif pour Linux ou Windows.
Veuillez noter: Je ne demande pas comment écrire le compilateur lui-même. J'ai suivi ce cours à l'université, je connais les compilateurs-compilateurs généraux, etc. Dans cette situation, je voudrais simplement configurer un cadre existant si possible. Je ne veux pas modifier la langue, je veux juste pouvoir viser une architecture arbitraire. Si la réponse s'avère être "cela ne fonctionne pas de cette façon", que l'information sera utile à moi-même et à quiconque pourrait faire des hypothèses similaires .
Présentation rapide/tutoriel sur l'écriture d'un backend LLVM.
Ce document décrit les techniques d'écriture de backends pour LLVM qui convertissent la représentation LLVM en code d'assemblage de machine ou dans d'autres langages.
[. . . ]
Pour créer un compilateur statique (qui émet un assemblage de texte), vous devez implémenter les éléments suivants:
- Décrivez l'ensemble de registres.
- Décrivez l'ensemble d'instructions.
- Décrivez la machine cible.
- Implémentez l'imprimante d'assemblage pour l'architecture.
- Implémentez un sélecteur d'instructions pour l'architecture.
Il y a le concept d'un compilateur croisé, c'est-à-dire qui s'exécute sur une architecture, mais en cible une autre. Vous pouvez voir comment GCC le fait (par exemple) et ajouter une nouvelle architecture à l'ensemble, si c'est le compilateur que vous souhaitez étendre.
Edit: Je viens de repérer une question il y a quelques années sur une liste de diffusion du GCC sur la façon d'ajouter une nouvelle cible et quelqu'un a souligné this
La réponse courte est que cela ne fonctionne pas de cette façon.
La réponse la plus longue est qu'il faut un certain effort pour écrire un compilateur pour un nouveau type de CPU. Cependant, vous n'avez pas besoin de créer un compilateur à partir de zéro. La plupart des compilateurs sont structurés en plusieurs passes; voici une architecture typique (beaucoup de variantes sont possibles):
Dans cette description, seule l'étape 4 dépend de la machine. Vous pouvez donc prendre un compilateur où l'étape 4 est clairement séparée et brancher votre propre étape 4. Pour ce faire, vous devez comprendre en profondeur le CPU et comprendre les composants internes du compilateur, mais vous n'avez pas à vous soucier de ce qui se passe avant.
Presque tous les CPU qui ne sont pas très petits, très rares ou très anciens ont un backend (étape 4) pour GCC . La documentation principale pour écrire un backend GCC est le manuel interne de GCC , en particulier les chapitres sur descriptions de machines et descriptions de cibles . GCC est un logiciel gratuit, il n'y a donc aucun coût de licence pour l'utiliser.
vbcc (à www.compilers.de) est un bon et simple compilateur C reciblable écrit en C. Il est beaucoup plus simple que GCC/LLVM. C'est si simple que j'ai pu recibler le compilateur sur mon propre processeur avec quelques semaines de travail sans avoir aucune connaissance préalable des compilateurs.
1) Réponse courte:
"Non. Il n'y a pas de" framework de compilateur "où vous pouvez simplement ajouter de l'eau (brancher votre propre ensemble d'assemblage), remuer, et c'est fait."
2) Réponse plus longue: c'est certainement possible. Mais difficile. Et probablement cher.
Si vous vouliez le faire vous-même, je commencerais par regarder Gnu CC. Il est déjà disponible pour une grande variété de processeurs et de plates-formes.
3) Jetez un oeil à ce lien pour plus d'idées (y compris l'idée de "juste construire une bibliothèque de fonctions et de macros"), ce serait ma première suggestion:
http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/
Vous pouvez modifier les compilateurs open source existants tels que GCC ou Clang. D'autres réponses vous ont fourni des liens pour savoir où en savoir plus. Mais ces compilateurs ne sont pas conçus pour facilement recibler; ils sont "plus faciles" à recibler que les compilateurs que les autres compilateurs câblés pour des cibles spécifiques.
Mais si vous voulez un compilateur relativement facile à recibler, vous en voulez un dans lequel vous pouvez spécifier l'architecture de la machine en termes explicites, et un outil génère le reste du compilateur (GCC fait un peu de cela; je ne pense pas Clang/LLVM fait beaucoup mais je peux me tromper ici).
Il y en a beaucoup dans la littérature, google "compilateur-compilateur".
Mais pour une solution concrète pour C, vous devriez vérifier ACE , un fournisseur de compilateur qui génère des compilateurs à la demande des clients. Pas gratuit, mais j'entends qu'ils produisent très rapidement de très bons compilateurs. Je pense qu'il produit des binaires de style standard (ELF?) Donc il saute l'étape d'assembleur. (Je n'ai aucune expérience ou relation avec ACE.)
Si vous ne vous souciez pas de la qualité du code, vous pouvez probablement écrire une traduction de C vers l'assembleur en utilisant la syntaxe C AST. Vous pouvez obtenir des C AST de GCC, Clang, peut-être ANTLR, et de notre DMS Software Reengineering Toolkit .