En partant d'un simple (le plus simple peut-être) compilateur C?
Je suis tombé sur ceci: L'écriture d'un compilateur à l'aide de Turbo Pascal
Je suis curieux de savoir si il existe des tutoriels ou des références expliquant comment créer un simple compilateur C. Je veux dire, c'est suffisant si il me met au niveau d'en faire comprendre les opérations arithmétiques. Je me suis vraiment curieux après la lecture de cet article par Ken Thompson. L'idée d'écrire quelque chose qui se comprend elle-même semble passionnant.
Pourquoi ai-je mis cette question au lieu de demander à Google? J'ai essayé Google et le Pascal était le premier lien. Le reste n'a pas de semblent pertinents et ajouté à ça... je ne suis pas un CS majeur (donc j'ai encore besoin d'apprendre ce que tous ces outils comme yacc faire) et je tiens à l'apprendre par le faire et je suis en espérant que les gens avec plus d'expérience, c'est toujours mieux à ces choses que Google. Je veux lire l'article écrit dans le même esprit que celui que j'ai énumérés ci-dessus, mais qui met en lumière au moins de la phase de phases de la construction d'un simple compilateur C.
Aussi, je ne sais pas la meilleure façon d'apprendre. Dois-je commencer la construction d'un compilateur C en C ou en une autre langue? Dois-je écrire un compilateur C ou une autre langue? Je sens ce genre de questions sont mieux répondu une fois, j'ai quelques pistes à explorer. Des suggestions?
Des suggestions?
- bien d'essayer de créer un C (et même un sous-ensemble) de compilateur avec le débutant drapeau est un peu surprenant. Vous devriez d'abord essayer à quelque chose de plus simple en premier.
- La rédaction de votre propre compilateur peut être beaucoup de plaisir. Mais songez que le CS degré premier. Faut avoir les armes pour tuer le dragon.
- Débutant dans le domaine des compilateurs 🙂 Avez quelques années d'expérience de la programmation en tant que tel... mais tout le temps que j'ai été faire les choses sans savoir comment ils ont fait "travailler". @nobugz: Son sur ma liste 🙂 Juste que rien de vraiment m'empêche de le faire sur mon propre premier.
- L'canonique compilateur références question est stackoverflow.com/questions/1669/learning-to-write-a-compiler . BTW, je suis un grand fan de la Crenshaw compilateur comme une première introduction. Il n'est pas un problème pour traduire pascal en c, donc sentez-vous libre de le travailler. Si vous allez coller avec les compilateurs vous aurez envie d'une référence plus complète très bientôt, cependant.
- Oui on dirait que je vais commencer par Crenshaw d'abord, puis reportez-vous à la bête lien ici DONC..
- Vous n'avez pas besoin d'un CS mesure, afin d'être capable de programmeur. Je ne dis pas que les classes ne pas aider à bien 😉
- Une fois, j'ai écrit un guide (en Python) pour la visualisation de votre arbre d'analyse et de génération d'instructions (un compilateur cours de conception dans lequel nous étions en train de créer une langue qui était un tout petit sous-ensemble de C, mais la boîte à outils n'est pas limitée à ce minilanguage en quelque sorte). Téléchargé sur le site de sourceforge sous le nom de DTCT (Duff Jouet Compilateur Outils). Je suis sûr qu'ils ont pris vers le bas après plusieurs années d'inactivité (c'est presque une dizaine d'années maintenant), mais pourrait être disponible quelque part.
- Voir aussi mon SmallerC, qui n'est pas Petit C, mais similaires dans leur esprit.
- Cela fait partie de la Imagistedu répondre.
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.
Vous devez vous connecter pour publier un commentaire.
Un compilateur se compose de trois pièces:
Il y a beaucoup de jolies analyseur de générateurs de départ avec les grammaires de langages. Peut-être ANTLR serait un bon endroit pour vous de commencer. Si vous voulez coller à C racines, essayez de lex/yacc ou de bison.
Il y a des grammaires pour le C, mais je pense que C dans son ensemble est complexe. Vous feriez bien de commencer avec un sous-ensemble de la langue et de travailler votre chemin jusqu'à.
Une fois que vous avez un AST, vous pouvez l'utiliser pour générer le code machine que vous allez exécuter.
C'est faisable, mais pas triviale.
Je voudrais aussi vérifier Amazon pour les livres sur l'écriture de compilateurs. Le Dragon Livre est un classique, mais il y a de plus moderne disponible.
Mise à JOUR: Il y a eu des questions similaires sur Stack overflow, comme cette une. Consultez ces ressources.
Je vous conseille ce tutoriel:
C'est un petit exemple sur la façon de mettre en œuvre une "petite langue" du compilateur. Le code source est très petite et est expliqué étape par étape.
Il y a aussi le C avant la fin de la bibliothèque pour la LLVM (Bas Niveau de la Machine Virtuelle qui représentent la structure interne d'un programme) de la bibliothèque:
Pour ce que ça vaut, le Tiny C Compiler est assez complet compilateur C relativement petit paquet source. Vous pouvez bénéficier de l'étude de cette source, comme il est probablement beaucoup plus facile à comprendre que d'essayer de comprendre tous GCC de base de la source, par exemple.
C'est mon avis (et des conjectures), il sera difficile d'écrire un compilateur sans la compréhension des structures de données normalement couverts de premier cycle (post-secondaire) des cours d'Informatique. Cela ne signifie pas que vous ne pouvez pas, mais vous devez connaître l'essentiel des structures de données telles que les listes liées, et des arbres.
Plutôt que d'écrire un plein ou conformes à la norme du langage C compilateur (au moins au début), je vous suggère de te limiter à un sous-ensemble de base de la langue, tels que des opérateurs, entier uniquement de support, et les fonctions de base et des pointeurs. Un exemple classique de ce Ron Caïn Petites-C, rendu populaire par une série d'articles écrits dans Le Dr Dobbs Journal dans je crois que les années 1980. Ils publient une CD avec le James Hendrix, out-of-print livre, Un Petit-Compilateur C.
Ce que je suggère, c'est suite à Crenshaw du tutoriel, mais écrire pour un C-like compilateur de langage, et tout ce PROCESSEUR cible (Crenshaw objectifs le PROCESSEUR Motorola 68000) vous souhaitez cibler. Pour ce faire, vous aurez besoin de savoir assemblage de base de ce qui jamais de la cible que vous souhaitez exécuter des programmes compilés sur. Cela pourrait inclure un émulateur pour un 68000, ou MIPS qui sont sans doute plus agréable assemblée jeux d'instructions que le vénérable CDCI du jeu d'instructions du processeur Intel x86 (16/32 bits).
Il existe de nombreux livres qui peuvent être utilisés comme points de départ pour l'apprentissage de compilateur /traducteur de la théorie (et en pratique). Lire la comp.les compilateurs FAQ, et des études en ligne différents vendeurs de livres. Dans la majorité des livres sont écrits comme des manuels par étudiant en deuxième année à haut niveau de premier cycle, des cours d'Informatique, de sorte qu'ils peuvent être lents à lire sans CS de fond. Un des plus vieux livre qui pourrait être plus d'introduction, mais plus facile à lire que "Le Dragon Livre" est Introduction à la Construction du Compilateur par Thomas Parsons. Il est plus vieux, donc vous devriez être capable de trouver un copie utilisée à partir de votre choix de livre en ligne de vendeurs à un prix raisonnable.
Donc, je dirais, essayez de démarrer avec Jack Crenshaw est Nous allons Construire un Compilateur tutoriel, écrivez votre propre, à la suite de ses exemples comme un guide, et de construire les bases d'un simple compilateur. Une fois que vous avez que de travail, vous pouvez mieux décider de l'endroit où vous souhaitez les prendre à partir de ce point.
Ajouté:
En ce qui concerne le processus d'amorçage. Depuis qu'il existe des compilateurs C librement disponible, vous n'avez pas besoin de s'inquiéter à propos de l'amorçage. Écrivez votre compilateur avec distinct, les outils existants (GCC, Visual C++ Express, Mingw /djgpp, la stc a), et vous pouvez vous soucier de l'autonomie de la compilation de votre projet au plus tard. J'ai été surpris par cette partie de la question jusqu'à ce que j'ai compris tu as été amené à l'idée d'écrire votre propre compilateur, par la lecture de Ken Thomas ACM Turing award de la parole, Réflexions sur la Confiance la Confiance, qui ne vont dans le compilateur de l'amorçage du processus. C'est un animé de niveau avancé, et est aussi tout simplement un grand nombre de tracas aussi. Je trouve même le démarrage de l'GCC compilateur C sous les anciennes systèmes Unix (Numérique OSF/1, sur le 64-bit Alpha) qui comprenait un compilateur C et de la lenteur du temps, des erreurs de processus.
L'autre le genre de question est ce qu'un compilateur comme outil Yacc la réalité. Yacc (Yet another compiler compiler ou de Bison de GNU) est un outil conçu pour faciliter l'écriture d'un compilateur (ou le traducteur) analyseur de plus facile. Basé sur le grammaire formelle pour votre langue cible que vous avez entrée pour yacc, il génère un analyseur, qui est une portion d'un compilateur de l'ensemble de la conception. Côté Lex (ou flex à partir de GNU) qui permet de générer une analyseur lexical ou d'un scanner, qui est souvent utilisé en combinaison avec le yacc généré analyseur de former le squelette de l'avant-fin d'un compilateur. Ces outils font de l'écrivain un front-end sans doute plus facile que d'écrire un analyseur lexical et l'analyseur de vous-même. Crenshaw le tutoriel de ne pas utiliser ces outils, et vous n'avez pas besoin de soit, de nombreux rédacteurs du compilateur n'ont pas toujours les utiliser. Bien sûr Crenshaw admet le tutoriel de l'analyseur est assez basique.
Crenshaw du tutoriel aussi saute de la génération d'un AST (abstract syntax tree), qui simplifie, mais aussi les limites de l'tutoriel compilateur. Il manque la plupart, si pas tous d'optimisation, et est très lié à la spécificité de ce langage de programmation et le langage d'assemblage émis par le "back-end" du compilateur. Normalement, l'AST est une pièce du milieu où certains d'optimisation peut être effectuée, et sert de couple le compilateur front-end et back-end dans la conception. Pour un débutant sans une formation de Sciences Informatiques, je vous suggère de ne pas s'inquiéter de ne pas avoir un AST pour votre premier compilateur (ou au moins la première version de celui-ci). Je pense le garder petit et simple va vous aider à terminer l'écriture d'un compilateur, dans sa première version, et vous pouvez décider à partir de là, comment vous voulez procéder.
Vous pourriez être intéressé par les livres/cours Les Éléments des Systèmes de Calcul:la Construction d'un Ordinateur Moderne à partir de Principes Premiers.
Noter que ce n'est pas à propos de la construction d'un "pc" de trucs que vous avez achetés, newegg. Il commence par une description de la logique Booléenne fondamentaux, et construit un ordinateur virtuel à partir du plus bas niveau d'abstraction progressivement des niveaux plus élevés de l'abstraction. Les supports de cours sont en ligne, et le livre lui-même est assez peu coûteux à partir d'Amazon.
Dans le cours, en plus de "la construction du matériel", vous pourrez également mettre en œuvre un assembleur de la machine virtuelle, compilateur, et rudimentaire de l'OS, dans un pas-sage de la mode. Je pense que ce serait vous donner assez de fond pour approfondir le sujet, avec quelques-uns des plus couramment ressources énumérées dans les autres réponses.
Dans L'Environnement Unix, Kernighan et le Brochet à pied à travers 5 itérations de faire une calculatrice de travail de la simple C basé sur l'analyse lexicale et l'exécution immédiate de yacc/lex analyse et de génération de code pour une machine abstraite. Parce qu'ils écrivent à merveille, je ne peut pas proposer plus lisse introduction. Il est certainement plus petite que C, mais c'est probablement à votre avantage.
Il n'y a rien de simple sur la compilation de C. Le plus simple compilateur C est lcc par Chris Fraser et David Hanson. Ils ont passé 10 ans à travailler sur la conception pour le rendre aussi simple que possible, tout en générant raisonnablement bon code. Si vous avez accès à une bibliothèque universitaire, vous devriez être en mesure d'obtenir leur livre.
Une autre langue. Une fois j'ai eu à demander Hanson quelles sont les leçons que lui et Fraser avait appris par les dépenses de 10 ans sur le lcc projet. La principale chose Hanson a dit était
Vous êtes mieux d'utiliser Haskell ou certains dialecte de ML. Les deux langues offrent des fonctions plus des types de données algébriques, qui est un match parfait pour les problèmes rencontrés par le compilateur de l'écrivain. Si vous voulez continuer à poursuivre C, vous pourriez commencer avec George Necula de CIL, ce qui est un gros morceau d'un compilateur C écrit en ML.
Vous ne trouverez pas un autre article comme Ken. Mais Andrew Appel a écrit un bel article intitulé Axiomatique de l'Amorçage: Un Guide pour le Compilateur Pirates je ne pouvais pas trouver une version gratuite mais de nombreuses personnes ont accès à l'ACM Digital Library.
Si vous voulez écrire un compilateur,
Utilisation Haskell ou ML que votre langage de mise en œuvre.
Pour votre premier compilateur, choisir un langage très simple comme Oberon ou comme P0 de Niklaus Wirth le livre de Algorithmes + Structures de Données = Programmes. Wirth est célèbre pour la conception de langues qui sont faciles à compiler.
Vous pouvez écrire un compilateur C pour votre deuxième compilateur.
Un compilateur est une matière complexe qui couvre les aspects de
Ce n'est pas exhaustif car il est un résumé de l'oiseau oeil vue depuis le sommet d'une montagne, il se résume à l'obtention de la notation de syntaxe correcte et veiller à ce que malformé entrées de ne pas la jeter hors, en fait, un bon traitement d'entrée ne doit jamais tomber sur ses genoux n'importe comment mal formé, terrible, l'abus de cas de niveau d'entrée qui obtient jeté à elle. Et aussi, en décidant et en sachant ce que la sortie va être, est-il dans le code machine, ce qui impliquerait que vous pourriez avoir à obtenir de connaître les instructions du processeur intimement...y compris l'adressage de mémoire pour les variables et ainsi de suite...
Voici quelques liens pour commencer:
Il pourrait être intéressant d'en apprendre sur la programmation fonctionnelle, trop. Les langages fonctionnels sont bien adaptés à l'écriture d'un compilateur à la fois dans et pour. Mon école l'intro de compilateurs classe contenait une introduction aux langages fonctionnels et les devoirs sont tous en OCaml.
Drôle que vous devriez poser cette question aujourd'hui, car il y a quelques jours j'ai écrit un lambda calcul interprète. Lambda calcul est l'ancêtre de tous les langages fonctionnels. Il est à seulement 200 lignes (en C++, incl. les rapports d'erreurs, quelques jolies impression, certains unicode) et a deux phases, la structure, avec un format intermédiaire qui pourrait être utilisé pour générer du code.
N'est pas seulement de commencer petit et de construire la méthode la plus pratique pour les compilateurs, il encourage également bon, modulaire, la pratique de l'organisation.
Un compilateur est un très grand projet, bien que je suppose que ça ne ferait pas de mal d'essayer.
Je connais au moins un compilateur C écrit en Pascal, il n'est donc pas la plus fou chose que vous pourriez faire. Personnellement, je choisirais un langage plus moderne dans lequel mettre en œuvre mon compilateur C du projet, à la fois pour la simplicité (il est facile de d/l des paquets pour Python, Ruby, C, C++ ou Java) et parce qu'elle sera mieux sur votre cv.
Dans le but de faire un compilateur comme un débutant projet, cependant, vous aurez besoin de boire tous les Agile kool-aid.
Y a toujours quelque chose en cours d'exécution, même si il ne fait pas beaucoup de quoi que ce soit. Ajouter des éléments à votre compilateur seulement en petites étapes. ("Des sorties fréquentes".) Choisir un vicieusement minuscule sous-ensemble de la langue et de mettre en œuvre en premier. (Support seulement
i = 0;
au premier abord et d'élargir les choses à partir de là.)Si vous voulez une expérience hallucinante, qui vous apprend comment écrire des compilateurs qui compilent eux-mêmes, vous devez lire ce papier de 1964.
META II une syntaxe orientée compilateur langue d'écriture par Val Schorre.
En 10 pages, il raconte comment écrire des compilateurs, comment écrire de la méta compilateurs, fournit un virtuel metacompiler jeu d'instructions, et un échantillon compilateur construit avec la metacompiler.
J'ai appris à écrire des compilateurs de ce papier dans la fin des années 60, et a utilisé les idées pour construire C-comme langues de plusieurs micro-ordinateurs et microprocesseurs.
Si le papier est trop bien par lui-même (il ne l'est pas!) il y a un tutoriel en ligne qui vous guidera à travers l'ensemble de la chose.
Et si le papier de l'original link est étrange parce que vous n'êtes pas un membre de l'ACM, vous verrez que le didacticiel contient tous les détails de toute façon. (À mon humble avis, pour le prix, le document lui-même est waaaaay vaut).
10 pages!
Je ne voudrais pas vous recommandons de commencer avec le C comme langage de mettre en œuvre, ni de le compilateur-générateur ou de l'analyseur-outils du générateur. C est une très délicat de la langue, et c'est probablement une meilleure idée de faire juste une langue de votre propre. Il peut être un peu C-like (par exemple, utilisation bouclés backets si vous voulez indiquer le corps de la fonction, utiliser le même type de noms, de sorte que vous n'avez pas à vous rappeler ce que vous avez appelé tout).
Les outils pour faire de compilateurs et interpréteurs sont grands, mais le problème d'être vraiment une notation abrégée. Si vous ne savez pas comment créer un compilateur à la main, le raccourci semble énigmatique, inutilement restrictives etc. Afin d'écrire votre propre simple compilateur d'abord, puis continuer à partir de là. Moi aussi je vous recommande de ne pas commencer à générer de réels code machine, à moins que vous manger et de respirer de l'assembleur. Créez votre propre interpréteur de bytecode avec une machine virtuelle.
À ce que la langue à utiliser pour créer votre premier compilateur: Il n'a pas vraiment d'importance, aussi longtemps que la langue est assez complet. Vous le constaterez à la lecture de saisie de texte, la création de structures de données et d'écrire des données binaires. Donc, si une langue rend les choses plus faciles, en quelque sorte, c'est un point en faveur de cela. Choisissez une langue que vous connaissez bien, vous pouvez donc vous concentrer sur la création d'un compilateur, pas l'apprentissage de la langue. J'ai l'habitude d'utiliser un langage OO, ce qui rend l'arbre de syntaxe plus facile à écrire, un langage fonctionnel serait probablement fonctionne aussi si vous êtes familier avec ce.
J'ai écrit beaucoup de choses sur les langages de programmation, de sorte que vous pourriez trouver utiles offres d'ici: http://orangejuiceliberationfront.com/category/language-design/
En particulier, http://orangejuiceliberationfront.com/how-to-write-a-compiler/ est un starter sur les détails de l'analyse commune des constructions et de générer quelque chose d'utile à part, ainsi que http://orangejuiceliberationfront.com/generating-machine-code-at-runtime/ qui parle en fait de cracher Intel instructions que faire quelque chose.
Oh, concernant l'amorçage d'un compilateur: Vous ne serez probablement pas en mesure de le faire dès le début. Il y a une bonne quantité de travail impliqués dans la création d'un compilateur. Donc non seulement l'écriture d'un amorçage compilateur d'écriture, le compilateur (dans une autre langue), une fois que vous avez cela, vous devrez écrire une deuxième version du compilateur lui-même. C'est deux fois plus de travail, plus le débogage nécessaires dans l'existant et le bootstrap nouveau compilateur, jusqu'à ce que tout fonctionne. Cela dit, une fois que vous avez un travail de compilateur, c'est un bon moyen de tester son intégralité. OK, peut-être pas deux fois plus de travail, mais plus de travail. J'irais pour le facile succès de la première, puis à partir de là.
En tout cas, amusez-vous!