C'est une tâche universitaire dans mon groupe d'écrire un compilateur de langage C-like. Bien sûr, je vais mettre en place une petite partie de notre C++ bien-aimé.
La tâche exacte est absolument stupide, et le conférencier nous a dit qu'il devait être autocompilable (il devrait être capable de se compiler lui-même) - donc, il voulait dire de ne pas utiliser des bibliothèques telles que Boost et STL.
Il ne veut pas non plus que nous utilisions des modèles parce qu'il est difficile à implémenter. La question est - est-ce vrai pour moi, puisque je vais écrire ce projet tout seul, avec la date limite fin mai - mi juin (cette année), pour implémenter non seulement des templates, mais aussi des classes imbriquées, des espaces de noms, des tables de fonctions virtuelles au niveau de l'analyse syntaxique?
PS Je ne suis pas Noobie en C++Comment puis-je créer mon propre compilateur C++ comprendre les modèles, les classes imbriquées, etc. caractéristiques de C++?
Répondre
Stick à faire un compilateur C. Croyez-moi, il est assez difficile de construire un compilateur C décent, en particulier s'il est prévu de se compiler. Essayer de prendre en charge toutes les fonctionnalités C++ comme les classes imbriquées et les modèles vous rendra fou. Peut-être qu'un groupe pourrait le faire, mais par vous-même, je pense qu'un compilateur C est plus que suffisant pour le faire.
Si vous êtes déjà décidé à ce sujet, commencez par implémenter au préalable un langage de type C (donc vous avez quelque chose à vous donner). Puis se concentrer sur la démonstration.
Quand j'ai pris des compilateurs, nous avons ajouté des fonctionnalités comme nous pouvions le faire sur notre projet. Bien sûr, j'étais la seule personne de mon groupe ayant une expérience d'assembleur, donc nous n'étions pas aussi loin que nous aurions pu. –
Espaces de noms ou clases imbriquées, soit les fonctions virtuelles sont au niveau de la syntaxe assez simple, c'est juste une ou deux règles de plus à parser. C'est beaucoup plus compliqué aux niveaux supérieurs, au moment de décider, quelle fonction/classe choisir (ombrage des noms, noms ambigus entre les espaces de noms, etc.), ou lors de la compilation en bytecode/en cours d'exécution AST. Donc - vous pouvez être en mesure d'écrire ceux-ci, mais si ce n'est pas nécessaire, passez le, et écrivez juste le modèle fonctionnel nu.
"La tâche exacte est absolument stupide" - Je ne pense pas que vous êtes en mesure de faire ce jugement de manière juste. Mieux vaut laisser tomber cette vue.
"Je vais écrire ce projet moi-même" - vous avez dit que c'était un projet de groupe. Êtes-vous en train de dire que votre groupe ne veut pas accepter votre idée selon laquelle il devrait se transformer en C++, alors vous partez et travaillez seul? Il y a un autre que je recommanderais de changer.
Peu importe à quel point vous connaissez le C++. Votre capacité avec les grammaires, les parseurs, les lexers, les AST et la génération de code semble beaucoup plus pertinente. Sans en savoir plus sur vous ou la mission, je dirais que vous feriez bien d'avoir fait la tâche originale à la fin du mois de mai. C'est dans trois mois. Tenez-vous à l'affectation. Cela pourrait vous surprendre avec sa difficulté.
Si vous terminez tôt, et remplissez vos obligations envers votre équipe, je dirais que 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 la tâche d'origine.
Si vous parlez d'un compilateur complet, avec la génération de code, alors oubliez-le. Si vous avez seulement l'intention de faire le côté syntaxique de l'analyse syntaxique, alors une forme de template peut être faisable dans le temps, en fonction des outils de construction du compilateur que vous utilisez.
Suivez l'affectation.Ecrire un compilateur pour un langage C-like! Ce que je ferais est de sélectionner un sous-ensemble de C. Supprimer les types de données à virgule flottante et toutes les autres fonctionnalités qui ne sont pas nécessaires dans la construction de votre compilateur.
L'écriture d'un compilateur C demande beaucoup de travail. Vous ne serez pas en mesure de le faire dans quelques mois. L'écriture d'un compilateur C++ est complètement folle. Vous ne seriez pas capable de le faire dans 5 ans.
Aucun problème. Et pendant que vous y êtes, pourquoi ne pas implémenter un système d'exploitation pour qu'il fonctionne aussi.
N'oubliez pas d'implémenter une VM ou deux. –
Vous devriez être en mesure de compléter le langage c-like dans le délai imparti. En supposant que vous prenez plus de 1 cours, c'est exactement ce que vous pourriez être capable de faire à temps. C++ est également faisable mais avec beaucoup plus d'heures supplémentaires pour le mettre. S'attendre à faire des modèles C++/des fonctions virtuelles vous surexprime et vous risquez d'échouer dans l'affectation tous ensemble. Il vaut donc mieux s'en tenir à un compilateur de sous-ensembles c et le terminer dans le temps. Vous devriez également considérer le temps qu'il faut pour l'assurance qualité. Si vous voulez être minutieux, l'AQ prendra également du bon temps.
Pour un projet de classe, je pense qu'exiger du compilateur qu'il soit capable de se compiler lui-même est un peu difficile à demander. Je suppose que c'est ce que l'on entend par stupide dans la question. Cela signifie que vous devez déterminer à l'avance exactement quelle quantité de C vous allez implémenter, et s'en tenir à cela dans la construction du compilateur. Donc, construire une table de symboles en utilisant des primitives plutôt que d'utiliser simplement une carte STL. Cela peut être utile pour un cours de structure de données, mais manque le point pour un cours de compilateur. Il devrait être sur la compréhension des problèmes impliqués avec le compilateur, et choisir les structures de données à utiliser, ne pas coder les structures de données.
La construction d'un compilateur est une merveilleuse façon de comprendre réellement ce qui arrive à votre code une fois que le compilateur l'a saisi. Quelle est la langue cible? Quand j'ai pris des compilateurs, il a fallu trois mois à tous pour construire un compilateur pour passer du sorta-pascal à l'assemblage. Ce n'est pas une tâche triviale. C'est une de ces choses qui semble simple au début, mais plus on y entre, plus les choses sont compliquées.
Je voudrais souligner quelques points déjà mentionnés et donner quelques références.
1) COLLER À LA NORME ANSI C DE 1989 SANS OPTIMISATION.
2) Ne vous inquiétez pas, avec des conseils appropriés, une bonne organisation et un bon travail, c'est faisable.
3) Lire la couverture The C Programming Language pour couvrir.
4) Comprendre les concepts importants du développement du compilateur à partir du Dragon Book.
5) Jetez un oeil à lcc à la fois le code ainsi que le book.
6) Jetez un oeil à Lex and Yacc (ou Flex et Bison)
7) L'écriture d'un compilateur C (jusqu'au point il peut compiler soi-même) est un rite de rituel de passage entre les programmeurs. Profitez-en.
Il est intéressant que vous estimiez que vous serez en mesure de réimplémenter des fonctionnalités par vous-même, ce qui a pris des années de spécialistes à implémenter. Hou la la! –
Par curiosité est-ce un cours de Grad ou Undergrad? –
Non ce n'est pas réel. C sera assez dur (même avec un groupe). –