Comment faire en sorte que mon propre compilateur C ++ comprenne les modèles, les classes imbriquées, etc.

StackOverflow https://stackoverflow.com/questions/618859

Question

C’est une tâche universitaire dans mon groupe d’écrire un compilateur de langage C-like. Bien sûr, je vais implémenter une petite partie de notre bien-aimé C ++.
La tâche exacte est absolument stupide et le conférencier nous a dit qu’il devait être auto-compilable (devrait être capable de se compiler lui-même). Il a donc voulu éviter d’utiliser des bibliothèques telles que Boost et STL.
Il ne veut pas non plus que nous utilisions des modèles, car ils sont difficiles à implémenter.
La question est - est-ce réel pour moi, puisque je vais écrire ce projet moi-même, avec la date limite de fin mai - mi-juin (cette année), pour implémenter non seulement des modèles, mais aussi classes, espaces de noms, tables de fonctions virtuelles au niveau de l'analyse syntaxique?
PS je ne suis pas noobie en C ++

Était-ce utile?

La solution

S'en tenir à faire un compilateur C.

Croyez-moi, la construction d'un compilateur C décent est un travail difficile, surtout si on s'attend à ce qu'il se compile lui-même. Essayer de prendre en charge toutes les fonctionnalités C ++ telles que les classes et les modèles imbriqués vous rendra fou. Peut-être qu'un groupe pourrait le faire, mais à mon avis, un compilateur C est amplement suffisant.

Si cela vous tient à coeur, implémentez au moins d'abord un langage de type C (pour que vous ayez quelque chose à rendre). Ensuite, concentrez-vous sur les démonstrations.

Autres conseils

"La tâche exacte est absolument stupide" - Je ne pense pas que vous puissiez juger équitablement. Mieux vaut laisser tomber cette vue.

"Je vais écrire ce projet moi-même" - Vous avez dit que c'est un projet de groupe. Êtes-vous en train de dire que votre groupe ne veut pas accepter votre point de vue selon lequel il devrait passer au C ++, alors vous démarrez et travaillez par vous-même? Il y a un autre élément que je recommande de changer.

Peu importe votre niveau de connaissances sur le C ++. Votre habileté avec les grammaires, les analyseurs syntaxiques, les lexers, les AST et la génération de code semble bien plus pertinente.

Sans en savoir plus sur vous ou sur la mission, je dirais que vous feriez bien de faire la mission initiale d’ici à la fin du mois de mai. C'est d'ici trois mois. S'en tenir à la mission. Cela pourrait vous surprendre par sa difficulté.

Si vous terminez tôt et respectez vos obligations vis-à-vis de votre équipe, vous devriez vous sentir libre de modifier ce qui est produit pour ajouter des fonctionnalités C ++.

Je parie qu'il a fallu plus de trois mois à Bjarne Stroustrup pour ajouter des objets à C. Ne vous surestimez pas et ne sous-estimez pas l'affectation initiale.

Pas de problème. Et pendant que vous y êtes, pourquoi ne pas mettre en place un système d’exploitation qui fonctionne également.

Suivez la mission. Ecrivez un compilateur pour une langue C-like ! Ce que je ferais, c’est de sélectionner un sous-ensemble de C. Supprimez les types de données à virgule flottante et toutes les autres fonctionnalités inutiles pour la construction de votre compilateur.

Écrire un compilateur C demande beaucoup de travail. Vous ne pourrez pas faire cela dans quelques mois. Écrire un compilateur C ++ est carrément fou. Vous ne pourrez plus le faire dans 5 ans.

Je voudrais souligner quelques points déjà mentionnés et donner quelques références.

1) RESPECTER LA NORME ANSI C DE 1989 SANS OPTIMISATION.

2) Ne vous inquiétez pas. Avec des conseils appropriés, une bonne organisation et beaucoup de travail, c'est faisable.

3) Lisez intégralement le langage de programmation C .

4) Comprenez les concepts importants du développement du compilateur dans le Livre Dragon .

5) Examinez lcc à la fois le code et le < un href = "https://rads.stackoverflow.com/amzn/click/com/0805316701" rel = "noreferrer"> livre .

6) Consultez Lex et Yacc (ou Flex et Bison)

7) L’écriture d’un compilateur C (jusqu’à ce qu’elle puisse s’auto-compiler) est un rituel de rite de passage entre programmeurs. Profitez-en.

Pour un projet de classe, je pense que demander au compilateur de se compiler lui-même est un peu trop demander. Je suppose que c'est ce que l'on entend par stupide dans la question. Cela signifie que vous devez savoir à l'avance quelle quantité de C vous allez implémenter et vous en tenir à la construction du compilateur. Donc, construisez une table de symboles en utilisant des primitives plutôt que simplement en utilisant une carte STL. Cela peut être utile pour un cours de structure de données, mais passe à côté d'un point pour un cours de compilateur. Il faut comprendre les problèmes liés au compilateur et choisir les structures de données à utiliser, et non les coder.

La construction d’un compilateur est un moyen formidable de vraiment comprendre ce qu’il advient de votre code une fois que le compilateur l’a récupéré. Quelle est la langue cible? Quand j’ai pris des compilateurs, il nous a fallu 3 semestres pour construire un compilateur qui permette de passer de la sorte à l’assemblage. Ce n'est pas une tâche banale. C’est l’une de ces choses qui semblent simples au début, mais plus vous y entrez, plus les choses se compliquent.

Vous devriez être capable de compléter le langage de type c dans les délais impartis. En supposant que vous suiviez plus d’un cours, c’est exactement ce que vous pourriez être en mesure de faire à temps. Le C ++ est également faisable, mais avec beaucoup plus d’heures supplémentaires. Expecing to c ++ templates / virtual functions vous surestime et vous pouvez échouer dans l’attribution. Il est donc préférable de s'en tenir à un compilateur de sous-ensemble c et de le terminer à temps. Vous devez également prendre en compte le temps qu’il faut pour l’AQ. Si vous voulez être approfondi, le contrôle qualité lui-même prendra également du temps.

Les espaces de noms ou les classes imbriquées, les fonctions virtuelles sont au niveau de la syntaxe assez simple, c’est une ou deux règles supplémentaires pour l’analyseur. Il est beaucoup plus compliqué aux niveaux supérieurs de décider quelle fonction / classe choisir (observation du nom, noms ambigus entre les espaces de noms, etc.), ou lors de la compilation en bytecode / exécution d'AST. Donc, vous pourrez peut-être les écrire, mais si ce n’est pas nécessaire, ignorez-les et écrivez un modèle fonctionnel nu.

Si vous parlez d'un compilateur complet, avec génération de code, alors oubliez-le. Si vous avez juste l’intention de faire le lexical & amp; analyse syntaxique des choses, alors une certaine forme de template peut être à peu près faisable dans le laps de temps, en fonction des outils de construction de compilateur que vous utilisez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top