C'est mon opinion (et ma conjecture) : il sera difficile d'écrire un compilateur sans comprendre les structures de données normalement couvertes dans les cours d'informatique de premier cycle (postsecondaire). Cela ne signifie pas que vous ne pouvez pas, mais vous devrez connaître les structures de données essentielles telles que les listes liées et les arbres.
Plutôt que d'écrire un compilateur complet ou conforme aux normes du langage C (du moins au début), je suggérerais de vous limiter à un sous-ensemble de base du langage, comme les opérateurs communs, le support des entiers uniquement, et les fonctions et pointeurs de base. Un exemple classique de ceci était le compilateur de Ron Cain Petit-C rendu populaire par une série d'articles écrits dans Journal du Dr Dobbs dans les années 80, je crois. Ils publient un CD avec le livre épuisé de James Hendrix, Un compilateur Small-C .
Ce que je suggérerais, c'est de suivre le tutoriel de Crenshaw, mais de l'écrire pour un compilateur de type C, et quelle que soit la cible CPU (Crenshaw cible le CPU Motorola 68000) que vous souhaitez cibler. Pour ce faire, vous aurez besoin de connaître l'assemblage de base de la cible sur laquelle vous voulez exécuter les programmes compilés. Cela peut inclure un émulateur pour un 68000 ou un MIPS, qui sont sans doute les plus performants. plus beau que le vénérable jeu d'instructions CISC de l'Intel x86 (16/32 bits).
Il existe de nombreux ouvrages susceptibles de servir de point de départ à l'apprentissage de la théorie (et de la pratique) des compilateurs et des traducteurs. Lisez le comp.compilateurs FAQ et des critiques chez divers vendeurs de livres en ligne. La plupart des livres d'introduction sont écrits en tant que manuels pour des cours d'informatique de deuxième ou de troisième cycle, et peuvent donc être lents à lire sans connaissances en informatique. Un livre plus ancien qui pourrait être plus introductif, mais plus facile à lire que " Le livre du dragon " es Introduction à la construction d'un compilateur par Thomas Parsons. Comme il est plus ancien, vous devriez pouvoir trouver un exemplaire d'occasion à un prix raisonnable auprès des libraires en ligne de votre choix.
Donc je dirais, essayez de commencer avec le livre de Jack Crenshaw. Construisons un compilateur écrivez votre propre tutoriel, en vous inspirant de ses exemples, et construisez les bases d'un site Web. simple compilateur. Une fois qu'il fonctionne, vous pouvez mieux décider où vous voulez aller à partir de ce point.
Ajouté :
En ce qui concerne le processus de bootstrapping. Puisqu'il existe des compilateurs C librement disponibles, vous n'avez pas à vous soucier de l'amorçage. Écrivez votre compilateur avec des outils distincts existants (GCC, Visual C++ Express, Mingw / djgpp, tcc), et vous pouvez vous soucier de l'autocompilation de votre projet à un stade beaucoup plus avancé. J'ai été surpris par cette partie de la question jusqu'à ce que je réalise que vous avez été amené à l'idée d'écrire votre propre compilateur en lisant le discours du prix Turing de l'ACM de Ken Thomas, Réflexions sur la confiance qui entre dans le processus d'amorçage du compilateur. C'est un sujet avancé modéré, et c'est aussi simplement beaucoup de tracas. Je trouve que même l'amorçage du compilateur C GCC sous les anciens systèmes Unix (Digital OSF/1 sur l'Alpha 64 bits) qui incluaient un compilateur C est un processus lent et fastidieux, sujet aux erreurs.
L'autre question était de savoir ce que fait réellement un compilateur comme Yacc. Yacc (Yet Another Compiler Compiler ou Bison de GNU) est un outil conçu pour faciliter l'écriture d'un analyseur de compilateur (ou de traducteur). Basé sur le grammaire formelle pour votre langue cible que vous entrez dans yacc, celui-ci génère une analyseur syntaxique qui est une partie de la conception globale d'un compilateur. Ensuite, il y a Lex (ou flex de GNU) qui est utilisé pour générer un analyseur lexical ou analyseur, qui est souvent utilisé en combinaison avec l'analyseur généré par yacc pour former le squelette du frontal d'un compilateur. Ces outils rendent l'écriture d'un frontal sans doute plus facile que d'écrire soi-même un analyseur lexical et un parseur. Le tutoriel de Crenshaw n'utilise pas ces outils, et vous n'avez pas besoin de le faire non plus, de nombreux auteurs de compilateurs ne les utilisent pas toujours. Bien sûr, Crenshaw admet que l'analyseur syntaxique du tutoriel est assez basique.
Le tutoriel de Crenshaw évite également de générer un AST (abstract syntax tree), ce qui simplifie mais limite également le compilateur du tutoriel. Il manque la plupart des optimisations, sinon toutes, et est très lié au langage de programmation spécifique et au langage d'assemblage particulier émis par le "back-end" du compilateur. Normalement, l'AST est une pièce intermédiaire où une certaine optimisation peut être effectuée, et sert à découpler le front-end et le back-end du compilateur dans la conception. Pour un débutant sans formation en informatique, je suggérerais de ne pas s'inquiéter de ne pas avoir d'AST pour votre premier compilateur (ou du moins la première version de celui-ci). Je pense que le fait de garder les choses petites et simples vous aidera à finir d'écrire un compilateur, dans sa première version, et vous pourrez décider à partir de là comment vous voulez procéder ensuite.
0 votes
Eh bien, essayer de créer un compilateur C (même un sous-ensemble) avec le drapeau débutant est un peu surprenant. Vous devriez d'abord essayer quelque chose de plus simple.
3 votes
Écrire son propre compilateur peut être très amusant. Mais pensez d'abord à obtenir ce diplôme en informatique. Il faut avoir les armes pour tuer le dragon.
0 votes
@Phong : Débutant dans le domaine des compilateurs :) J'ai quelques années d'expérience en programmation en tant que telle... mais pendant tout ce temps, j'ai fait des choses sans savoir comment elles "fonctionnent" réellement. @nobugz : C'est sur ma liste :) Juste que rien ne m'empêche vraiment de le faire par moi-même d'abord.
0 votes
La question des références canoniques du compilateur est stackoverflow.com/questions/1669/apprendre à écrire un compilateur . BTW-- Je suis un grand fan du compilateur Crenshaw comme première introduction. Il n'y a aucun problème à traduire le pascal en c, alors n'hésitez pas à le travailler. Si vous comptez vous en tenir aux compilateurs, vous aurez besoin d'une référence plus complète assez rapidement, cependant.
0 votes
Oui, il semble que je vais commencer par Crenshaw et ensuite me référer au lien de la bête ici sur SO
0 votes
@nobugz : Vous n'avez pas besoin d'un diplôme en informatique pour être un programmeur compétent. Je ne dis pas que les cours ne sont pas utiles ;-)
0 votes
J'ai écrit une fois une boîte à outils (en Python) pour visualiser votre arbre d'analyse et la génération d'instructions (pour un cours de conception de compilateur dans lequel nous créions un langage qui était un minuscule sous-ensemble du C, mais la boîte à outils n'est en aucun cas limitée à ce mini-langage). Je l'ai téléchargé sur sourceforge sous le nom de DTCT (Duff's Toy Compiler Tools). Je suis presque sûr qu'ils l'ont retiré après plusieurs années d'inactivité (cela fait presque une décennie maintenant), mais il est peut-être disponible quelque part.
0 votes
Voir aussi mon Plus petitC qui n'est pas Small C, mais dont l'esprit est similaire.
0 votes
@Legend Cela fait partie de Imagiste 's respuesta .
Parsers and compilers are two separate problems. For example I might write a compiler in C, but I would never write a parser in C (I would use a parser generator). For very simple parsers where speed isn't a high priority, I might hand-code the parser in Perl or Python, which have good text-manipulation facilities.