Existe-t-il une version OO plus moderne de «Let’s Build a Comstackr»?

Existe-t-il une version plus moderne, peut-être orientée object, équivalente à la série ” Construisons un compilateur ” de Jack Crenshaw?

Il y a quelque temps, je suis tombé sur ” Construisons un compilateur ” et n’ai pu résister à l’écriture de code. J’ai écrit un compilateur C récursif en C # qui a généré .NET CIL. “Ecrire une fois, fuir partout” était mon slogan.

Dommage que je n’aie pas réalisé trop tard que l’parsing de C était un cauchemar.

Je suis maintenant intéressé par l’écriture d’un compilateur Java en Java qui génère .NET CIL ou des assemblys dans le but de s’auto-initialiser. J’espérais que de nouveaux tutoriels pourraient circuler.

En passant, passeriez-vous plus de temps avec la conception initiale ou écririez-vous une tonne de tests pour prendre en charge la capacité de refactoriser sans pitié. En repensant, je me penche vers ce dernier. Le compilateur fonctionnait mais le code était vraiment horrible.

Il semblerait que vous ayez complètement manqué le but des tutoriels de Crenshaw. LBC ne consiste pas à écrire du code joli, propre ou efficace. Il s’agit d’apporter quelque chose qui est ancré dans la théorie formelle à un niveau où le codeur occasionnel peut facilement et rapidement pirater un compilateur rudimentaire (mais qui fonctionne!).

Quand j’ai lu LBC il y a des années, j’ai réécrit les exemples en C #. Je suis sûr que la disposition de la classe n’est pas la meilleure ou que les tâches sont bien séparées, mais elle est comparable à son Pascal. Je serais heureux de partager le code avec vous si vous aimez … faites le moi savoir et je peux le poster en ligne et partager le lien.

Pendant mon temps libre, je me suis mis à écrire des textes dans le but d’unifier les philosophies de LBC et de Basics of Comstackr Design – en évitant les codes pratiques à la fin de chaque unité / chapitre, et en discutant Après avoir exploré les idées, le lecteur comprend pourquoi les choses sont comme elles sont. Mais il a fallu des années à Crenshaw pour écrire ses séries incomplètes, donc mon rêve soit un rêve de pipe… et j’utilise C (exactement parce que ce n’est pas du C ++ ou de Java).

Jetez un coup d’œil aux “Patterns d’implémentation linguistique” de Terence Parr . Il a écrit ANTLR – un générateur d’parsingurs pour Java. Il explique très bien les principes de la conception du compilateur et se construit progressivement.

Le “Domain Specific Language” de Martin Fowler est également bon. Son programme est légèrement différent de celui d’un simple compilateur, mais il constitue une bonne référence sur les concepts clés de la conception linguistique.

Je suis un fan de “MiniJava” et du travail associé basé sur la famille de livres “Modern Comstackr Implementation in Java”. Cela ne répond pas à toutes les exigences que vous mentionnez, car une implémentation MiniJava générera généralement du code natif – mais le backend peut facilement être modifié pour émettre MSIL ou autre.

Avez-vous examiné le projet PyPy ? C’est une implémentation Python du langage Python. Peut-être que cela peut être une source d’inspiration pour votre objective d’auto-amorçage de Java?

J’ai récemment construit un compilateur dans mon entreprise en utilisant BNFC . Au début, je devais utiliser Flex et Bison (C / C ++), mais je les ai trouvés pénibles. J’ai donc utilisé BNFC pour générer les fichiers Flex et Bison.

Je ne peux pas dire que j’aimais le code, ma grammaire était assez grande et le visiteur généré, mais je ne pouvais rien gérer, je TDDed depuis le début, donc j’ai toujours eu assez de tests pour refactoriser et j’ai aussi gardé un diagramme UML pour aidez-moi à réfléchir aux classes supplémentaires que j’ai écrites.

Il y a en fait un livre intitulé Implémentation des langages de programmation auto décrit comme «un livre d’auto-apprentissage et, dans une certaine mesure, un manuel pour l’outil BNFC» si je l’avais lu, j’aurais sans doute moins lutté contre les décisions d’implémentation être assez intuitif pour pouvoir l’utiliser en ne lisant que le manuel et le tutoriel

Last but not least, il peut également être utilisé avec d’autres langages, y compris Java (avec Cup et JLex)

Qu’en est-il de la rédaction de compilateurs et d’interprètes: une approche de génie logiciel par Ronald Mak ?

Lorsque vous envisagez d’apprendre ce genre de choses, vous devriez jeter un coup d’œil aux modèles d’implémentation de la langue du livre et à la référence antlr.

Si vous aimez apprendre par exemple, le code de Finch , un petit langage de programmation que je possède:

  1. Est écrit en C ++ orienté object.
  2. Est très propre
  3. Inclut un compilateur bytecode.

Qu’en est-il des processeurs de langage de programmation de Watt & Brown en Java? Il montre quels modèles OO utiliser dans la conception (simple) du compilateur. Je l’ai utilisé avec C # avec succès.