697 votes

Apprendre à écrire un compilateur

Langues préférées : C/C++, Java et Ruby.

Je suis à la recherche de quelques livres/tutoriels utiles sur la façon d'écrire votre propre compilateur, simplement à des fins éducatives. Je suis plus familier avec C/C++, Java, et Ruby, donc je préfère les ressources qui impliquent l'un de ces trois, mais toute bonne ressource est acceptable.

0 votes

ANTLR à fond. Toutes les ressources proposées ci-dessous me semblent excessives. ANTLR est toujours le meilleur ami du compilateur. A

0 votes

Si votre objectif principal est d'apprendre comment les idées de compilation fonctionnent en général - vous pouvez vérifier et SICP court pour l'interprétation structurée de programme d'ordinateur basé dans Scheme (liste) mais enseigne les principes généraux. mitpress.mit.edu/sicp . Ce livre m'a été recommandé par un vétéran qui travaille pour une société qui fait ces travaux de compilation et d'interprétation pour vivre !

0 votes

Une publicité éhontée : ma réponse à une question similaire .

1199voto

Michael Stum Points 72046

Grande liste de ressources :

Légende :

  • ¶ Lien vers un fichier PDF
  • $ Lien vers un livre imprimé

28 votes

J'ai lu Let's Build a Compiler [ [compilateurs.iecc.com/crenshaw/]](http://compilers.iecc.com/crenshaw/]) Il s'agit d'un très bon article et d'un bon point de départ.

6 votes

Je pense que le cours sur les compilateurs de Coursera en est un qui mérite d'être mentionné. Il contient de belles vidéos et permet de créer un langage similaire à Java et un compilateur simple. Lien vers les compilateurs de Coursera

2 votes

Je voulais que cette réponse soit aussi originale que possible, j'ai donc décidé de poster cette référence ici : tutorialspoint.com/compiler_design/index.htm Ce que j'ai aimé dans ce site, c'est qu'il ne s'agit pas d'écrire du code pour créer un compilateur, mais il décompose le compilateur en ses parties : phases et étapes. Il décrit l'approche de la conception logique et algorithmique sans paradigme de langage spécifique, car il exprime les notations d'un langage et d'un alphabet arbitraires. C'est une lecture rapide, mais elle vous donne les concepts nécessaires pour chaque partie.

75voto

mrduclaw Points 1917

Il s'agit d'une question assez vague, je pense ; simplement en raison de la profondeur du sujet concerné. Un compilateur peut cependant être décomposé en deux parties distinctes : une partie supérieure et une partie inférieure. La partie supérieure prend généralement le langage source et le convertit en une représentation intermédiaire, et la partie inférieure s'occupe de la génération du code spécifique à la plate-forme.

Néanmoins, une idée pour une manière facile d'aborder ce sujet (celle que nous avons utilisée dans mon cours de compilateurs, au moins) est de construire le compilateur en deux parties décrites ci-dessus. Plus précisément, vous aurez une bonne idée de l'ensemble du processus en construisant simplement la partie supérieure.

Le fait de faire la première moitié vous permet d'acquérir l'expérience de l'écriture de l'analyseur lexical et de l'analyseur syntaxique et de passer à la génération d'un certain "code" (cette représentation intermédiaire dont j'ai parlé). Il prendra donc votre programme source et le convertira en une autre représentation et fera de l'optimisation (si vous le souhaitez), ce qui est le cœur d'un compilateur. La partie inférieure prendra ensuite cette représentation intermédiaire et générera les octets nécessaires pour exécuter le programme sur une architecture spécifique. Par exemple, la moitié inférieure prendra votre représentation intermédiaire et générera un exécutable PE.

Voici quelques livres sur ce sujet que j'ai trouvé particulièrement utiles Principes et techniques des compilateurs (ou le livre du dragon, en raison du joli dragon sur la couverture). Il contient d'excellentes théories et couvre les grammaires sans contexte d'une manière très accessible. De plus, pour construire l'analyseur lexical et l'analyseur syntaxique, vous utiliserez probablement les outils *nix lex et yacc. Et de manière assez inintéressante, le livre intitulé " lex et yacc "J'ai repris là où le Livre du Dragon s'était arrêté pour cette partie.

63voto

Dominic Cooney Points 2876

Je pense Mise en œuvre d'un compilateur moderne en ML est le meilleur texte d'introduction à l'écriture de compilateurs. Il y a un Version Java y un Version C également, l'un ou l'autre pouvant être plus accessible compte tenu de vos connaissances linguistiques. Le livre contient beaucoup de matériel de base utile (balayage et analyse syntaxique, analyse sémantique, enregistrements d'activation, sélection d'instructions, génération de code natif RISC et x86) et divers sujets "avancés" (compilation de langages OO et fonctionnels, polymorphisme, garbage collection, optimisation et forme d'affectation statique unique) dans un espace relativement restreint (~500 pages).

Je préfère Modern Compiler Implementation au livre Dragon parce que Modern Compiler Implementation couvre moins le domaine - au contraire, il a une couverture vraiment solide de tous les sujets dont vous auriez besoin pour écrire un compilateur sérieux et décent. Après avoir travaillé sur ce livre, vous serez prêt à vous attaquer directement aux articles de recherche pour plus de profondeur si vous en avez besoin.

Je dois avouer que j'ai un gros faible pour le film de Niklaus Wirth. Construction du compilateur. Il est disponible en ligne en format PDF. Je trouve l'esthétique de programmation de Wirth tout simplement magnifique, cependant certaines personnes trouvent son style trop minimal (par exemple Wirth favorise les analyseurs récursifs descendants, mais la plupart des cours de CS se concentrent sur les outils de génération d'analyseurs ; les conceptions de langage de Wirth sont assez conservatrices). Compiler Construction est une distillation très succincte des idées de base de Wirth, donc que vous aimiez ou non son style, je recommande vivement la lecture de ce livre.

0 votes

Construction d'un compilateur PDF ethoberon.ethz.ch/WirthPubl/CBEAll.pdf

0 votes

Je recommande vivement contre la version C de "Modern Compiler Implementation", elle est paralysée par des détails de bas niveau dus au C. Elle encombre complètement le livre. Java 1st n'est pas très bon car sa conception OO est pauvre, Java 2nd ed n'est plus sur le langage Tiger. Je recommande donc vivement le livre ML : il n'est pas nécessaire de parler couramment le langage ML pour le comprendre. ML est définitivement bien adapté à ce travail.

47voto

Daniel F. Hanson Points 3028

Je suis d'accord avec la référence du Livre du Dragon ; IMO, c'est le guide définitif de la construction d'un compilateur. Préparez-vous à une théorie hardcore, cependant.

Si vous voulez un livre qui est plus léger sur la théorie, Maîtrise du scénario de jeu pourrait être un meilleur livre pour vous. Si vous êtes totalement novice en matière de théorie des compilateurs, il constitue une introduction plus douce. Il ne couvre pas les méthodes d'analyse syntaxique plus pratiques (il opte pour la descente récursive non prédictive sans discuter de l'analyse syntaxique LL ou LR), et si je me souviens bien, il ne discute même pas de la théorie de l'optimisation. De plus, au lieu de compiler vers le code machine, il compile vers un bytecode qui est supposé fonctionner sur une VM que vous écrivez également.

C'est quand même une bonne lecture, surtout si vous pouvez l'acheter à bas prix sur Amazon. Si vous voulez seulement une introduction facile aux compilateurs, Game Scripting Mastery n'est pas une mauvaise solution. Si vous voulez vous lancer dans le hardcore dès le départ, alors vous ne devriez pas vous contenter de moins que le Dragon Book.

2 votes

Game Scripting Mastery est une excellente ressource d'apprentissage car, lorsque vous aurez terminé, vous aurez un jeu d'aventure en 2D jouable et scriptable. Ainsi, chaque exercice est axé sur un objectif précis et le lecteur reste motivé.

1 votes

Dragon est un peu trop axé sur l'analyse grammaticale. Si vous n'essayez pas d'analyser quelque chose d'impossible comme le C++ ou autre en utilisant des générateurs d'analyse, mais que vous pouvez utiliser par exemple une grammaire LL faite à la main, vous pouvez chercher quelque chose qui traite un pourcentage plus élevé de champs de compilation autres que la transformation et la preuve de la grammaire.

26voto

Peter Burns Points 17420

Si vous cherchez à utiliser des outils puissants et de haut niveau plutôt que de construire tout vous-même, en passant par les projets et les lectures pour ce cours est une très bonne option. Il s'agit d'un cours de langues donné par l'auteur du moteur d'analyse syntaxique Java ANTLR. Vous pouvez obtenir le livre du cours en format PDF à l'adresse suivante les programmeurs pragmatiques .

Le cours passe en revue les éléments standard du compilateur que vous verriez ailleurs : analyse syntaxique, types et vérification des types, polymorphisme, tables de symboles et génération de code. Les optimisations sont à peu près la seule chose qui n'est pas couverte. Le projet final est un programme qui compile un sous-ensemble de C . Parce que vous utilisez des outils comme ANTLR et LLVM, il est possible d'écrire tout le compilateur en un seul jour (j'ai une preuve d'existence de ce fait, bien que je veuille dire ~24 heures). Il s'agit d'un cours d'ingénierie pratique utilisant des outils modernes, un peu plus léger sur la théorie.

LLVM, d'ailleurs, est tout simplement fantastique. Dans de nombreuses situations où vous compileriez normalement en assembleur, vous feriez bien mieux de compiler en La représentation intermédiaire de LLVM à la place. Il est de plus haut niveau, multiplateforme, et LLVM est assez bon pour générer un assemblage optimisé à partir de celui-ci.

8 votes

Le premier lien est mort.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X