Un parcours d'écriture de compilateur
Dans ce référentiel Github, je documente mon parcours pour écrire un compilateur auto-compilable pour un sous-ensemble du langage C. J'écris également les détails afin que, si vous souhaitez suivre, il y ait une explication de ce que j'ai fait, pourquoi, et avec quelques références à la théorie des compilateurs.
Mais pas trop de théorie, je veux que ce soit un voyage pratique.
Voici les étapes que j'ai suivies jusqu'à présent :
- Partie 0 : Introduction au voyage
- Partie 1 : Introduction à l'analyse lexicale
- Partie 2 : Introduction à l'analyse syntaxique
- Partie 3 : Priorité des opérateurs
- Partie 4 : Un véritable compilateur
- Partie 5 : Déclarations
- Partie 6 : Variables
- Partie 7 : Opérateurs de comparaison
- Partie 8 : Si les déclarations
- Partie 9 : Boucles While
- Partie 10 : Pour les boucles
- Partie 11 : Fonctions, partie 1
- Partie 12 : Types, partie 1
- Partie 13 : Fonctions, partie 2
- Partie 14 : Génération du code d'assemblage ARM
- Partie 15 : Pointeurs, partie 1
- Partie 16 : Déclarer correctement les variables globales
- Partie 17 : Meilleure vérification de type et décalages de pointeur
- Partie 18 : Lvalues et Rvalues revisitées
- Partie 19 : Tableaux, partie 1
- Partie 20 : Littéraux de caractères et de chaînes
- Partie 21 : Plus d'opérateurs
- Partie 22 : Idées de conception pour les variables locales et les appels de fonction
- Partie 23 : Variables locales
- Partie 24 : Paramètres de fonction
- Partie 25 : Appels de fonction et arguments
- Partie 26 : Prototypes de fonctions
- Partie 27 : Tests de régression et une belle surprise
- Partie 28 : Ajout de plus d'indicateurs d'exécution
- Partie 29 : Un peu de refactorisation
- Partie 30 : Conception de structures, d'unions et d'énumérations
- Partie 31 : Implémentation de structures, partie 1
- Partie 32 : Accéder aux membres d'une structure
- Partie 33 : Mise en œuvre des syndicats et accès des membres
- Partie 34 : Énumérations et typedefs
- Partie 35 : Le préprocesseur C
- Partie 36 :
break
et continue
- Partie 37 : Instructions Switch
- Partie 38 : Se balancer ailleurs et plus encore
- Partie 39 : Initialisation des variables, partie 1
- Partie 40 : Initialisation des variables globales
- Partie 41 : Initialisation des variables locales
- Partie 42 : Casting de type et NULL
- Partie 43 : Corrections de bugs et plus d'opérateurs
- Partie 44 : Pliage constant
- Partie 45 : Déclarations de variables globales, revisitées
- Partie 46 : Paramètres de la fonction Void et modifications de numérisation
- Partie 47 : Un sous-ensemble de
sizeof
- Partie 48 : Un sous-ensemble de
static
- Partie 49 : L'opérateur ternaire
- Partie 50 : Nettoyage, partie 1
- Partie 51 : Tableaux, partie 2
- Partie 52 : Pointeurs, partie 2
- Partie 53 : Nettoyage, partie 2
- Partie 54 : Déversement des registres
- Partie 55 : Évaluation paresseuse
- Partie 56 : Tableaux locaux
- Partie 57 : Nettoyage, partie 3
- Partie 58 : Correction des incréments/décréments du pointeur
- Partie 59 : Pourquoi ça ne marche pas, partie 1
- Partie 60 : Réussir le triple test
- Partie 61 : Quelle est la prochaine étape ?
- Partie 62 : Nettoyage du code
- Partie 63 : Un nouveau backend utilisant QBE
- Partie 64 : Un backend pour le processeur 6809
Il n'y a pas de calendrier ni de calendrier pour les prochaines parties, alors revenez simplement ici pour voir si j'en ai écrit davantage.
Droits d'auteur
J'ai emprunté une partie du code et de nombreuses idées au compilateur SubC écrit par Nils M Holm. Son code est dans le domaine public. Je pense que mon code est suffisamment différent pour que je puisse appliquer une licence différente à mon code.
Sauf indication contraire,
- tous les codes sources et scripts sont (c) Warren Toomey sous licence GPL3.
- tous les documents sans code source (par exemple les documents en anglais, les fichiers image) sont (c) Warren Toomey sous la licence Creative Commons BY-NC-SA 4.0.