Question

Quels conseils pouvez-vous donner à une personne qui souhaite écrire un langage de programmation ou de script? je Je ne m'inquiète pas de la programmation ni de la conception d'un compilateur, mais de la développer rapidement à l'aide d'outils et de générateurs de code.

La dernière fois que j'ai essayé, je l'ai codé en c ++ et les états et la syntaxe ont pris presque aussi longtemps que l'écriture de la logique réelle. Je sais que les outils suivants pourraient aider.

Je pensais pouvoir générer du code c ++ et faire compiler cela avec gcc. En utilisant les outils ci-dessus, combien de temps estimeriez-vous pour écrire un programme ou un langage de script?

Des variantes de cette question ont été posées à plusieurs reprises, depuis Apprendre à écrire un compilateur . Voici une liste incomplète des ressources SO SO sur le sujet.

Était-ce utile?

La solution

L'estimation de la durée d'une telle opération dépend de nombreux facteurs. Par exemple, un programmeur expérimenté peut facilement assommer un évaluateur d’expression arithmétique simple en quelques heures, avec des tests unitaires. Mais un programmeur novice devra peut-être se familiariser avec les techniques d’analyse syntaxique, la descente récursive, la représentation abstraite des arbres d’expression, les stratégies de marche dans les arbres, etc. Cela pourrait facilement prendre des semaines ou plus, rien que pour les expressions arithmétiques.

Cependant, ne laissez pas cela vous décourager. Alors que Jeff et Joel discutaient avec Eric Sink d’un podcast récent Stack Overflow , l'écriture d'un compilateur est une excellent moyen de se familiariser avec de nombreux aspects de la programmation. J'ai construit quelques compilateurs et ils font partie de mes projets de programmation les plus mémorables.

Certains livres classiques sur les compilateurs de bâtiment sont:

Autres conseils

Dave Hanson, qui avec Chris Fraser a passé 10 ans à construire l'un des compilateurs les plus élaborés au monde , m'a dit un jour que l'une des principales choses qu'il avait apprises de cette expérience était de ne pas essayer d'écrire un compilateur en C ou C ++.

Si vous souhaitez développer quelque chose rapidement, ne générez pas de code natif; cibler une machine virtuelle existante telle que la CLR, la machine virtuelle Java ou la Lua . Générez du code en utilisant un maximum de munch.

Si vous écrivez un interprète, une autre bonne option consiste simplement à utiliser la gestion de la mémoire et les autres fonctionnalités de votre langage de programmation sous-jacent. Analyser à un AST et ensuite interpréter par la promenade dans les arbres de l'AST. Cela vous permettra de décoller rapidement. La performance n'est pas la meilleure, mais c'est acceptable. (En utilisant cette technique, j’avais écrit un interprète PostScript dans Modula-3. La première implémentation a pris une semaine et, bien qu’il ait été modifié par la suite, notamment dans le lexer, il n’a jamais dû être remplacé.)

Évitez les générateurs d’analyseur LALR; utilisez quelque chose qui vous fait gagner du temps, comme ANTLR ou le générateur Elkhound de GLR.

Les livres classiques sur la conception du compilateur sont

"Principes de conception du compilateur" par Alfred V. Aho et Jeffrey D. Ullman. Cela fait déjà un certain temps que son chevalier rose et son dragon vert sont bien connus d'au moins deux générations d'étudiants en CS.

Aussi ...

"Compilateurs: principes, techniques et outils" par Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

Si vous souhaitez écrire un compilateur, ce sont sans aucun doute les meilleurs endroits pour commencer.

  

En tant que personne connaissant très bien le C ++,   quels conseils pouvez-vous donner à une personne qui   cherche à écrire un langage de programmation ou de script?

Ne le fais pas. (ou du moins réfléchissez longuement avant de le faire!)

Si vous essayez d’écrire un langage de script pour exposer les méthodes / propriétés de certains objets écrits sur mesure, il serait préférable de les implémenter en Java (ou .NET / VB ou tous ces méchants Microsoftisms), puis de les utiliser. une des langues du cadre de script de beans comme langage de script. (avec quel que soit l'équivalent est à l'extrémité Microsoft.)

Si vous avez des questions sur les compilateurs, vous obtiendrez une réponse "lisez le livre des dragons, lisez ce livre, ce livre ...". sur SO indépendamment de leur contenu dans quelques minutes. Donc, je saute cette partie (comme je le disais en premier lieu). Lire ces livres pour apprendre à utiliser les outils de votre choix est aussi utile que de lire sur le moment angulaire pour apprendre à faire du vélo.

Donc, pour répondre à ce que vous avez demandé, sans remettre en question votre intention, je peux facilement recommander antlr et antlrworks pour les débutants. Vous pouvez générer facilement votre AST (où la vraie magie se produit, je pense) et déboguer votre grammaire de manière visuelle. Il génère une bonne partie d’un compilateur qui fonctionne pour vous.

Si vous connaissez votre matériel et souhaitez avoir plus de contrôle ou si vous n'aimez pas antlr, vous pouvez utiliser lemon , générateur d'analyseur syntaxique et compilateur de machine à états ragel (prend en charge de manière spécifique le lexing) ensemble .

Si vous n'avez pas besoin de trop de performances et que vous envisagez de générer du code C / C ++, vous pouvez ignorer toute optimisation vous-même et laisser ce travail à votre compilateur C / C ++.

Si vous pouvez vivre avec une exécution lente, vous pouvez encore raccourcir vos efforts de développement en effectuant uniquement une interprétation, car il est souvent plus facile d'implémenter des fonctionnalités dynamiques de cette manière.

Je pense que tout le monde manque d'un point très important.

POURQUOI voulez-vous écrire un compilateur / interprète / analyseur / analyseur, etc.

Cela déterminera sérieusement beaucoup de ce que vous faites.

J'ai travaillé sur plusieurs implémentations de langage, certaines plutôt bizarres, spécifiques à un domaine, certaines simplement scriptées progressant dans des environnements de commande (souvent dans lesquels l'environnement de commande était ensuite masqué). Chacun nécessitait différents niveaux de compétence.

De nombreux livres disponibles. Un de mes ouvrages préférés était un livre de BYTE: Threaded Interpreted Languages ??- je parie qu’il est épuisé.

De simples moteurs de script peuvent être conçus avec quelques réflexions et quelques essais et erreurs.

Mais je parie qu'il existe maintenant des cours en ligne qui vous feront gagner beaucoup de temps.

Je vous recommande fortement de consulter les interpréteurs de code-octets existants. Si vous pouvez adapter votre langage à CIL (.NET) ou à Java (ou même à d’autres, comme Python ou Parrot), vous éviterez tout effort pour créer un environnement de support exploitable et pourrez continuer à expérimenter les concepts de langage.

Si vous envisagez d'écrire un interprète ou un compilateur, ne le faites pas parce que vous voulez écrire la prochaine grande chose. Ecrivez-le parce que vous avez déjà un but en tête ou pour apprendre. Si vous faites cela, vous constaterez peut-être que vous avez accidentellement écrit la prochaine grande chose.

Si vous ne souhaitez pas écrire un compilateur pour réduire votre langue à un assemblage / une machine, l'option suivante consiste à écrire un compilateur sur une machine virtuelle à code octet, telle que la JVM, le PVM ou. NET.

Bien sûr, si vous ne voulez même pas faire cela - vous voulez simplement créer votre propre "langage spécifique au domaine", je le construirais en Common Lisp. Les macros Lisp fournissent une méthode assez simple pour créer la syntaxe de votre choix et l’analyser dans Lisp. Et vous n'avez pas à vous soucier du code octet ou de l'assemblage. Bien sûr, vous devez apprendre le Lisp.

scroll top