web-dev-qa-db-fra.com

Pourquoi écrit-il un compilateur dans une langue fonctionnelle plus facile?

J'ai réfléchi à cette question très longtemps, mais je ne pouvais vraiment pas trouver la réponse sur Google également une question similaire sur Stackoverflow. S'il y a un duplicata, je suis désolé pour ça.

Beaucoup de gens semblent dire que les compilateurs d'écriture et d'autres outils de langue dans des langues fonctionnelles telles que OCAML et HASKELL sont beaucoup plus efficaces et plus faciles, puis les écrit dans des langues impératives.

Est-ce vrai? Et si oui, pourquoi est-ce si efficace et facile de les écrire dans des langages fonctionnels au lieu d'une langue impérative, comme c? Aussi - n'est pas un outil de langue dans une langue fonctionnelle plus lente puis dans une langue de bas niveau comme C?

86
wvd

Souvent, un compilateur travaille beaucoup avec des arbres. Le code source est analysé dans un arbre de syntaxe. Cet arbre peut ensuite être transformé en un autre arbre avec des annotations de type pour effectuer une vérification de type. Maintenant, vous pouvez convertir cet arbre en un arbre contenant uniquement des éléments linguistiques de base (convertir des notations syntaxiques ressemblant à du sucre en forme de sucre syntaxique en une forme non -uite). Vous pouvez maintenant effectuer diverses optimisations qui sont essentiellement des transformations sur l'arbre. Après cela, vous créeriez probablement un arbre sous une forme normale, puis itérale sur cet arbre pour créer le code cible (assemblage).

Le langage fonctionnel comporte des fonctions telles que la correspondance de modèle et un bon soutien pour une récursion efficace, ce qui facilite la tâche de travailler avec des arbres, c'est pourquoi ils sont généralement considérés comme des bonnes langues pour les compilateurs d'écriture.

99
sepp2k

Beaucoup de tâches de compilateur sont assorties par motif sur les structures d'arbres.

OCAML et HASKELL ont à la fois des capacités de correspondance de motifs puissantes et concises.

Il est plus difficile d'ajouter un motif correspondant aux langues impératives comme quelle que soit la valeur évaluée ou extraite pour correspondre au motif par rapport à l'effet secondaire.

38
Pete Kirkham

Un facteur important à considérer est qu'une grande partie de tout projet de compilateur est lorsque vous pouvez vous accueillir le compilateur et "manger votre propre nourriture de chien". Pour cette raison lorsque vous regardez des langues comme OCAML, où ils sont conçus pour la recherche linguistique, ils ont tendance à avoir d'excellentes fonctionnalités pour les problèmes de type compilateur.

Dans mon dernier emploi compilateur-esque, nous avons utilisé OCAML pour exactement cette raison lors de la manipulation du code C, ce n'était que le meilleur outil pour la tâche. Si les gens de l'INRIA avaient construit OCAML avec différentes priorités, il aurait peut-être été un bon ajustement.

Cela dit, les langues fonctionnelles sont le meilleur outil pour résoudre tout problème, de sorte qu'il s'ensuit logiquement qu'ils sont le meilleur outil de résolution de ce problème particulier. QED.

/ moi: ramper à mon Java tâches un peu moins joyeusement ...

15
Ukko

Fondamentalement, un compilateur est une transformation d'un ensemble de code à un autre - de la source à IR, de l'IR à une IR optimisé, de IR à l'assemblage, etc. C'est précisément le genre de chose que les langues fonctionnelles sont conçues pour - une fonction pure juste une transformation d'une chose à une autre. Les fonctions impératives n'ont pas cette qualité. Bien que vous puissiez écrire ce type de code dans une langue impérative, les langages fonctionnels sont spécialisés pour cela.

9
Chuck

Voir également

modèle de conception F #

FP Groupes Les choses "en fonctionnement", alors que OO groupes Les choses "par type", et "par opération" est plus naturelle pour un compilateur/interprète.

6
Brian

Une possibilité est qu'un compilateur a tendance à devoir traiter très soigneusement avec une multitude de cas d'angle. L'obtention du droit de code est souvent facilitée en utilisant des modèles de conception qui structurent la mise en œuvre de manière à paralliser les règles qu'il met en œuvre. Souvent, cela finit par être un déclaratif (assortie de motif, "où") plutôt que impératif (séquençage, "quand") concevoir et donc plus facile à mettre en œuvre dans une langue déclarative (et la plupart d'entre eux sont fonctionnels).

6
BCS

On dirait que tout le monde a manqué une autre raison importante. Il est assez facile d'écrire une langue spécifique à un domaine intégré (EDSL) pour les analyseurs qui ressemblent beaucoup à (e) BNF en code normal. Les combinaisons d'analyseurs Comme Parsec sont assez faciles à écrire dans des langages fonctionnels à l'aide de fonctions et de compositions de fonction supérieures. Pas seulement plus facile mais très élégamment.

Fondamentalement, vous représentez les analyseurs génériques les plus simples comme des fonctions seulement et vous avez des opérations spéciales (fonctions généralement plus élevées) qui vous permettent composez ces analyseurs primitifs dans des analyseurs plus compliqués et plus spécifiques pour votre grammaire.

Ce n'est pas le seul moyen de faire des cadres de cours.

4
snk_kid