2009-08-22 6 views
5

s'il vous plaît j'ai besoin de quelques ressources pour commencer (je suis un étudiant cs)Quel est le meilleur langage de programmation pour écrire des parseurs et des compilateurs?

+1

Dupe de http://stackoverflow.com/questions/1669/learning-to-write-a-compiler parmi beaucoup, beaucoup d'autres –

+0

S'il s'agit d'une demande ouverte de ressources, Neil a raison. Si elle demande de comparer et de contraster, alors elle se rapproche de "subjective et argumentative" – dmckee

+0

Voir [Quel-est-le-meilleur-langage-pour-écrire-un-compilateur-in] (http://stackoverflow.com/ questions/809710/quel-est-le-meilleur-langage-pour-écrire-un-compilateur-in) – nawfal

Répondre

9

La réponse peut être très subjective ici. Mais je recommande d'utiliser si vous voulez écrire un analyseur. ANTLR prend actuellement en charge les cibles C, C#, ActionScript, JavaScript et Java. D'après mon expérience, la version Java est vraiment stable à utiliser et a été utilisée dans de nombreux projets opensource puissants, à savoir Drools et Hibernate.

2

Lisp/Scheme était ce que nous avons été chargés d'utiliser en retour uni.

Ils se sont très bien adaptés à la tâche.

Dan

2

Alors que j'ai eu un livre de texte intitulé « Mise en œuvre du compilateur moderne en Java » Je pense que les professionnels utilisent encore C. autres que de prouver que leur langue peut se compiler.

6

Faut-il écrire dans un langage de programmation? Ou pouvez-vous utiliser Flex et Bison?

+1

J'étais sur le point de suggérer Flex et Bison aussi. :-) –

+4

Les générateurs d'analyseur ne suppriment pas le besoin d'un langage de programmation. Ils génèrent un analyseur dans une langue particulière. La langue traditionnelle Flex/Bison (LEX/YACC) est C. – Brannon

+0

@Brannon +1 pour votre commentaire; vous avez toujours besoin d'un langage de programmation. Cependant, je voudrais ajouter que Flex/Bison ou Lex/Yacc sont assez obsolètes. Si vous avez utilisé quelque chose comme Coco/R et que vous allez à Lex/Yacc, vous vous retrouverez désespéré pour les fonctionnalités, et non des moindres d'entre elles sont des lookaheads supérieurs à un. – Imagist

0

Voulez-vous écrire un analyseur pour une langue générale? Dans ce cas, l'écriture (et l'amorçage) dans la langue cible est clairement recommandée. Vous devriez manger votre propre dogfood.

+1

Je dirais, "recommandé dans de nombreux cas", pas "clairement recommandé". "Langage à usage général" est un peu inapproprié, car il n'y a pas de langage approprié pour * toutes * les tâches. Je n'écrirais pas une application web en C et je n'écrirais pas un système d'exploitation en Python. Ce n'est pas que vous ne pouvez pas faire l'une ou l'autre de ces choses; c'est simplement qu'il ne serait pas approprié de le faire. Si vous acceptez cette logique, alors il est logique que vous écrivez un langage à usage général qui n'est pas approprié pour l'analyse et ne doit donc pas être utilisé pour analyser lui-même. – Imagist

+1

Voici un bel exemple: l'interpréteur * JavaScript * du projet STEPS ne contient que 170 lignes de code source OMETA et a pris une personne pour écrire un après-midi. Dans l'interpréteur Narcissus JavaScript, l'analyseur * seul * contient plus de 1 000 lignes de JavaScript, avec 1 000 lignes de plus pour le visiteur AST. Donc, utiliser JavaScript pour implémenter JavaScript est 10 fois plus bavard que d'utiliser OMeta. –

+0

Mais vous débusquer beaucoup de bogues, si vous utilisez vraiment votre analyseur/compilateur. Et vous l'utilisez vraiment en l'implémentant dans ce langage même. – Mnementh

1

Si vous implémentez un compilateur à partir de zéro, la plupart des langages de programmation sont à la hauteur de la tâche. (Je connais même des compilateurs/parseurs écrits en Fortran IV et COBOL, bien que je ne recommanderais pas d'essayer ça!)

Mais si la langue que vous essayez d'implémenter a même une grammaire non triviale, vous faire mieux en utilisant un générateur de lexer et/ou un générateur d'analyseur pour implémenter le frontal. Vous obtiendrez un analyseur beaucoup plus rapide et plus fiable. Donc, sur cette base, des langages de programmation appropriés pour lesquels un générateur d'analyseur décent est disponible. Il y a une page sur Wikipedia qui compare un grand nombre de générateurs d'analyseurs. Je n'avais pas réalisé qu'il y en avait tellement!

1

Si votre but est d'apprendre les techniques derrière les parseurs (et les tokenizers), peut-être qu'il vaut mieux en écrire un vous-même. Vous pouvez le faire dans la plupart des langages de programmation, de sorte que vous pouvez choisir celui avec lequel vous êtes à l'aise. Il ya quelque temps, j'ai écrit une série de billets de blog qui montrent combien il est facile d'écrire un analyseur pour un petit langage de programmation de type BASIC fictif, en C#. Je ne veux pas spammer ici, donc je ne vais pas fournir un lien direct, mais si vous visitez le blog (voir mon profil) et aller au fond, vous pouvez trouver un lien "Ecrire un analyseur" dans le "mes messages "-section.

3

Vous voudrez examiner les générateurs d'analyseurs. Si vous êtes un étudiant CS, vous aurez probablement envie de jeter un coup d'œil au Livre du Dragon: http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools. Il serait probablement plus facile de construire un analyseur en utilisant C# ou Java, car vous n'aurez pas à vous soucier de choses comme la gestion de la mémoire, etc. et vous pouvez vous concentrer sur la grammaire.

Un bon générateur d'analyseur C# est GPPG: http://plas.fit.qut.edu.au/gppg/.

+0

Quelqu'un peut-il expliquer pourquoi cela a été downvoted? Le livre du dragon est une excellente ressource, et C#/java arrive à suivre le mot de la question. Bien que je pense que la question elle-même est stupide. – gimpf

4

Les analyseurs et les compilateurs sont deux problèmes distincts. Par exemple, je pourrais écrire un compilateur en C, mais je n'écrirais jamais un analyseur en C (j'utiliserais un générateur d'analyseur).Pour les analyseurs très simples où la vitesse n'est pas une haute priorité, je pourrais coder manuellement l'analyseur en Perl ou en Python, qui ont de bonnes possibilités de manipulation de texte. Mais pour tout ce qui dépasse un analyseur très basique, j'utiliserais une sorte d'outil de génération d'analyseurs. Les plus couramment utilisés sont ANTLR, Coco/R, et Lex/Yacc et l'implémentation GNU Flex/Bison. Ma préférence personnelle est Coco/R, mais ANTLR semble être plus populaire ces jours-ci.

Si vous écrivez un langage de programmation généraliste, vous pouvez envisager de l'écrire lui-même. Il y a de nombreux avantages à cela, y compris la portabilité (les gens n'ont qu'à porter la première version du langage) et la démonstration des capacités (l'analyse syntaxique est un problème difficile, si cela peut être fait dans votre langue). Si votre langue est interprétée, cela peut ne pas être approprié pour des raisons de performances.

Questions connexes