- Crafting Interpreters est un livre conçu pour permettre aux lecteurs qui veulent créer leur propre langage de suivre de bout en bout l’implémentation complète d’un langage de script
- Il couvre dans un même fil les concepts de conception de langages comme le parsing et la sémantique, jusqu’aux aspects d’implémentation à l’exécution comme la représentation en bytecode et le garbage collection
- Le lecteur part de
main()et implémente lui-même un langage doté de typage dynamique, de portée lexicale, de fonctions de première classe, de fermetures, de classes et d’héritage - En faisant écrire directement quelques milliers de lignes de code propre et rapide, l’ouvrage met l’accent sur la compréhension du fonctionnement interne plutôt que sur le seul résultat final
- Il est proposé en version imprimée, eBook, PDF et web, et sur le web tous les chapitres, textes complémentaires et illustrations peuvent être lus gratuitement
Portée de l’implémentation du livre
- Crafting Interpreters s’adresse aux lecteurs qui veulent créer leur propre langage de programmation ou comprendre comment les langages sont conçus et implémentés
- Le livre traite ensemble des sujets clés nécessaires à l’implémentation d’un langage de script complet
- parsing
- sémantique
- représentation en bytecode
- garbage collection
- L’implémentation commence à
main()et s’étend progressivement jusqu’à un langage doté des fonctionnalités suivantes- syntaxe riche
- typage dynamique
- portée lexicale
- fonctions de première classe
- fermetures
- classes
- héritage
Manière de lire et résultat obtenu
- Au lieu de simplement regarder le code d’exemple, le lecteur suit la structure interne d’un processeur de langage en écrivant lui-même chaque ligne
- Le code final représente quelques milliers de lignes et vise une implémentation propre et rapide
- Plutôt que de séparer les concepts de haut niveau et l’implémentation bas niveau, le livre est conçu pour les faire comprendre ensemble au fil de la réalisation d’un même langage
Formats proposés
-
Version imprimée
- Il s’agit d’une édition imprimée de 640 pages, avec des illustrations dessinées à la main en haute résolution et une typographie composée par l’auteur lui-même
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- Il propose un CSS adapté aux liseuses et aux tailles d’écran, une coloration syntaxique en couleurs et des hyperliens actifs
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- Il reprend la composition manuelle et les illustrations nettes de l’édition imprimée tout en restant facile à emporter
- Buy from Payhip
- Download Free Sample
-
Web
- Il est proposé avec un design responsive adapté du desktop au téléphone, et tous les chapitres, textes complémentaires et illustrations peuvent être lus gratuitement
- Read Now
1 commentaires
Commentaires sur Hacker News
Je suis l’auteur. Voir des réactions aussi positives à mon livre me réchauffe vraiment le cœur. J’y ai consacré énormément de temps et d’affection, et c’est très gratifiant de voir qu’il a eu l’effet espéré.
Cette ressource m’a donné énormément de confiance, et c’est encore aujourd’hui l’un des projets sur lesquels j’ai préféré travailler.
Je me demande aussi si vous envisagez d’écrire une suite, par exemple sur un compilateur ou un JIT pour Lox. Et lexical analygator est génial, au point d’avoir été montré plusieurs fois dans des présentations internes à mon entreprise avec citation de la source, et il y a même eu à une époque du fan art sur tableau blanc.
Certains auteurs donnent parfois l’impression qu’ils doivent faire croire que tout ce domaine relève de la magie noire, mais c’est peut-être aussi que je n’étais pas à la hauteur pour comprendre les design patterns du GoF.
J’ai lu Crafting Interpreters en créant Crumb(https://github.com/liam-ilan/crumb), et la partie sur les portées et les variables locales a été particulièrement essentielle.
L’équilibre entre mise en œuvre technique et éclairage conceptuel est excellent, ce qui aide beaucoup même quand on s’éloigne du chemin prévu par le livre. C’est le genre d’écriture technique qui sert de référence tant le niveau est élevé.
La documentation est bonne et le projet est chouette.
Ce que j’ai préféré dans ce livre, c’est qu’il vous amène à écrire deux interpréteurs différents pour le même langage.
Grâce à ça, on comprend beaucoup mieux les aspects plus complexes et plus subtils de la création d’un langage de programmation. En rencontrant d’abord les grandes idées dans la première moitié du livre, puis en les retrouvant dans le second interpréteur une fois qu’on s’y est familiarisé, on assimile vraiment les parties intéressantes. C’est un livre remarquable.
Puisqu’on parle aussi d’autres ressources sur les compilateurs, je n’ai pas encore tout regardé, mais la série vidéo d’Immo Landwerth où il construit un compilateur en C# en générant de l’IL, des symboles de débogage, etc., était très bien aussi.
Ça date d’environ 5 ans, donc ce n’est pas du C# tout récent, plutôt l’époque de .NET Core 3, mais ça ne devrait pas poser de gros problème pour l’essentiel. En revanche, il peut y avoir beaucoup d’avertissements liés à la nullabilité de référence.
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
J’ai l’impression que la plupart des programmeurs devraient un jour aller jusqu’au bout de ce livre. Le faire m’a donné une bien meilleure compréhension de ce qui se passe réellement à l’intérieur des compilateurs et des outils de langage.
C’est l’un des meilleurs guides techniques que j’aie suivis, et il m’a énormément aidé à m’approprier les concepts. Et ces concepts ne servent pas seulement pour les compilateurs.
Un avantage secondaire de ce livre, mais peut-être tout aussi important, c’est qu’il enseigne la clarté.
Le texte, le code, la structure et le rythme sont tous clairs et essentiels. Le mot “Crafting” lui va parfaitement : on a l’impression d’un livre écrit par un artisan pour d’autres artisans.
À mon avis, ce livre devrait être la deuxième ou la troisième étape d’un parcours sur les compilateurs de langages de programmation.
La première étape, c’est d’essayer seul d’écrire un interpréteur pour un petit langage qu’on a soi-même conçu, sans rien connaître aux interpréteurs ni à la conception de langages. La deuxième, c’est de le réécrire en faisant moins d’erreurs.
Sans ça, il est difficile d’apprécier toute la subtilité du sujet, et on risque de passer à côté de concepts qui ne semblent pas importants au premier abord.
Il n’est pas nécessaire de tout réinventer soi-même dès le départ. Se tenir sur les épaules des géants est une chose naturelle.
Si je n’avais pas lu quelque chose comme CI d’abord, je n’aurais probablement jamais essayé d’écrire moi-même un interpréteur, et je ne serais pas arrivé jusqu’à cette troisième étape.
Il n’y avait pas de récursion, je faisais tout manuellement avec des push et pop sur une pile. Le problème, c’est que je ne comprenais pas vraiment le parsing, donc la plus grande partie du langage était implémentée avec
string.splitetstring.replace, et comme on pouvait s’y attendre, j’ai créé des concepts impossibles à imbriquer. Je regrette de ne pas avoir conservé le code source.Au bout de quelques jours, après avoir rencontré beaucoup trop de bugs, j’ai adopté une approche plus académique et j’ai commencé à lire des livres. Mais c’était quand même une excellente première étape : sans cette tentative, je n’aurais peut-être même pas su que c’était un sujet qui mérite tout un livre.
J’ai énormément de respect pour les personnes qui ont ce genre de dévouement, ainsi que pour tous ceux qui maintiennent l’infrastructure de développement, mais je suis soulagé que ma phase « je veux créer un langage » se soit terminée comme un simple intérêt passager
La charge de travail est vraiment énorme
Je me demande s’il existe de bonnes ressources pour créer un langage à typage statique avec des choses comme le polymorphisme paramétrique et une inférence de types de base
Avec Crafting Interpreters, j’avais le sentiment qu’on pouvait créer un petit langage autonome capable d’inclure presque tous les concepts que je voulais enseigner : portée des variables, fonctions, closures, classes et dispatch dynamique, contrôle de flux, etc.
En revanche, pour les systèmes de types, il y a bien trop d’embranchements dans l’espace de conception, sans trajectoire clairement « meilleure ». Y a-t-il du sous-typage, les génériques sont-ils effacés ou réifiés, le code générique est-il spécialisé à la compilation, l’inférence de types est-elle locale ou de type Hindley-Milner : tous ces choix sont des bifurcations
Quel que soit le choix, on laisse de côté des éléments importants des branches non retenues, et on risque de décevoir les lecteurs qui attendaient une autre voie. Peut-être qu’un ouvrage panoramique plus large comme Types and Programming Languages serait plus approprié, mais on perd alors le plaisir de construire quelque chose de cohérent de bout en bout
Il existe aussi les versions C et Java du même livre, mais elles me semblent moins bonnes. Je recommanderais plutôt de partir sur la version ML
J’ai trouvé que l’implémentation de https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... avait un style très daté, alors je l’ai modernisée et remise en forme jusqu’à obtenir https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459.... Ensuite, j’ai volontairement « cassé » différentes parties pour observer comment l’algorithme se dérègle
Je recommande vivement d’essayer, de manière accessible, l’un de ces travaux d’informatique qu’on croit réservés aux magiciens. Une fois qu’on en a mené un ou deux à bien, on se rend compte que c’est difficile, certes, mais qu’il s’agit surtout d’avancer péniblement jusqu’au bout, et cela donne énormément de confiance. Si quelqu’un veut se lancer dans cette voie, il peut me contacter à zellyn@(most things)
Je viens tout juste de finir la partie 2, et c’est vraiment un excellent livre. Faire soi-même un ou deux des exercices proposés à chaque chapitre aide énormément à comprendre le contenu