Quel est le meilleur langage pour écrire un compilateur (pas pour)?
Réponses
Trop de publicités?La construction des compilateurs est essentiellement la réécriture d'arbres. C'est la killer app pour la ML de la famille des langues (Standard ML et Objective Caml et, dans une moindre mesure, Haskell. (Note: j'aime Haskell, mais si tout le questionneur veut faire est d'écrire un compilateur, je pense que ML est plus facile pour les débutants car le temps et l'espace le comportement du compilateur est beaucoup plus prévisible, et il est possible de construire le compilateur sans avoir à analyser le IO monade, type de classes, et d'autres idées avancées.)
Le professeur Zhong Shao de l'Université de Yale ont affirmé que, lorsqu'il a changé de Yale compilateur de classe Standard ML (à partir de C je crois), la classe a pu obtenir un compilateur complet, qui, normalement, a pris un semestre, avant l'action de Grâces, en laissant le reste de la durée de sujets avancés.
Après Dave Hanson publié son superbe livre avec Chris Fraser sur l'ingénierie du ccv, je lui ai demandé ce que lui et Chris avait appris après avoir passé dix ans attentivement la conception et la mise en œuvre du ccv. Sa réponse:
C est moche de la langue pour écrire un compilateur en.
Personnellement, j'ai écrit les compilateurs de Standard ML et Objective Caml. J'ai beaucoup travaillé sur d'autres compilateurs écrit en C, Haskell, Modula-3, et de Standard ML. Alors qu'aujourd'hui, j'ai plus de 20 ans d'expérience et je suis très heureux de programmation en Haskell, pour votre premier compilateur, je vous recommandons de Standard ML. Objective Caml est également un très bon choix. Les deux langues croître les mêmes racines, et vous pouvez lire sur les différences sur Stackoverflow.
Si le langage que vous concevez est suffisamment capable, construire le compilateur dans son propre langage est un choix fantastique. Il n'y a rien de mieux que de s'assurer que votre langue est complètement robuste que de travailler avec elle quotidiennement pour résoudre un problème complexe.
Les compilateurs C sont généralement écrits en C; Les compilateurs C ++ sont écrits en C ++, le compilateur C # en C # et la liste continue à partir de là.
Cette question ne peut pas être une réponse catégorique, car il dépend de ce que vous essayez de faire. Donc je vais essayer de formuler ce que je pense sont les 3 plus susceptibles de cas d'utilisation:
Si c'est un projet académique, il ya beaucoup de bonnes options.
Puisque les compilateurs sont essentiellement des fonctions de mappage de code source de certains code cible, vous trouverez probablement qu'il peut être fait plus facilement à l'aide d'un langage fonctionnel. Haskell, Lisp, ML seraient tous de bons choix.
Votre choix final peut être motivé par ce langage est très répandue dans le domaine de recherche particulier qui vous intéresse. Par exemple, si vous êtes dans monadique de l'analyseur combinators puis Haskell être un bon ajustement.
Si c'est juste pour le plaisir et la curiosité , alors vous pouvez soit:
- Suffit d'utiliser la langue que vous êtes familier avec si vous voulez vous concentrer sur l'écriture du compilateur. Il est parfaitement possible de mettre en œuvre une certaine forme de compilateur relativement rapidement dans n'importe quel langage de programmation généraliste.
- Également utiliser cela comme une occasion d'apprendre une nouvelle langue. Cela va vous prendre un peu plus de temps, mais si vous êtes intéressé par les compilateurs puis l'apprentissage d'une nouvelle langue ne devrait pas être trop beaucoup d'un défi. Dans ce cas, je vous recommande d'apprendre quelque chose de complètement nouveau (par exemple, Haskell ou Clojure si vous n'avez jamais essayé avant)
Si votre langage est conçu pour une utilisation en production, puis la langue de votre choix va être beaucoup plus motivé par ce que la plate-forme de ciblage. Par exemple:
- Si vous voulez compiler tout le chemin vers du code natif, alors vous voudrez probablement un C back-end afin de maximiser la portée de votre compilateur et d'éviter d'avoir à faire tout le, très difficile de la croix-plate-forme native de la génération de code vous-même. Si la langue de votre choix serait probablement être stimulée par les langues qui ont une bonne prise en charge bibliothèque C de génération de code. LLVM est sans doute la peine d'explorer.
- Si vous souhaitez cibler un omniprésente intermédiaire du langage comme JavaScript, alors vous pourriez trouver qu'il est plus facile à mettre en œuvre la majeure partie de votre compilateur dans la langue elle-même. C'est pratique à partir de votre point de vue, et d'élargir l'attrait de la langue à un JavaScript public.
- Si vous préoccuper d'avoir un solide prêt plateforme construite et la portabilité du code compilé, alors vous aurez probablement envie de la cible de la JVM, auquel cas il serait logique d'utiliser une JVM de la langue pour mettre en œuvre votre compilateur dans. Scala et Clojure serait tomber dans la catégorie des "langages fonctionnels sur la JVM" donc peut-être plus approprié.
Celui avec le meilleur des bibliothèques pour soutenir ce genre de tâche. Dans ce cas, probablement en C/C++, mais je regarde le suivant pour faire de telles choses:
J'aimerais également faire remarquer que votre réponse dépendra de l'environnement/de la plate-forme de ciblage. Lorsque le ciblage de la plate-forme Java à l'aide de pseudo-code binaire, les outils peuvent prendre une approche différente. Lors de l'utilisation de la CLR/.NET, votre réponse sera différente, il y a l'.
J'aime la réponse de à l'aide de votre propre langue, peut-être lu sur d'amorçage avant de le faire.
Je seconde la ML idée. J'aime F# (disponible sur Mono ou .NET) comme un ML variante qui vous donne beaucoup de soutien. Pour un analyseur, j'ai été un fan de http://www.antlr.org/. Si la langue que vous avez écrit est relativement à des fins générales, l'écriture d'un compilateur est un bon exercice pour s'assurer que votre compilateur est complet et sans bug. Mais bien sûr, si vous êtes en train de rédiger une langue destinée à faire quelque chose de très différent, vous êtes aboiements le mauvais arbre.