L'initialisation d'un compilateur: pourquoi?

je comprends comment une langue peut amorcer lui-même, mais je n'ai pas été en mesure de trouver beaucoup de référence sur pourquoi vous devriez envisager d'amorçage.

la réponse intuitive est que la langue que vous écrivez offre des utilitaires qui ne se trouvent pas dans la langue" de base "du compilateur, et les caractéristiques de la langue sont relativement bien adaptées pour un compilateur.

pour par exemple, il serait logique de bootstrap un compilateur C++ -- il pourrait être beaucoup plus facile de maintenir le compilateur quand OOP est correctement utilisé, au lieu D'utiliser C simple.

D'un autre côté, MATLAB rend certainement les maths matricielles beaucoup plus faciles que les simples C, mais je ne vois aucun avantage apparent à écrire un compilateur/interprète MATLAB dans MATLAB -- il semble qu'il deviendrait moins maintenable. Un point de vue similaire pourrait S'appliquer à la R langage de programmation. Ou un exemple assez extrême serait bootstrapping Whitespace , qui est écrit dans Haskell -- certainement un massif super ensemble de Whitespace.

est la seule raison de bootstrapping pour profiter des fonctionnalités de la nouvelle langue? Je sais qu'il y a aussi le "parce que nous pouvons" la raison, mais ce n'est pas ce que je cherche :)

28
demandé sur Mark Rushakoff 2009-09-29 20:53:25

11 réponses

il y a un principe appelé "manger sa propre nourriture pour chien". En utilisant un outil, vous démontrez l'utilité de l'outil.

il est souvent demandé, " si le compilateur pour la langue X n'est pas écrit dans la langue X, Pourquoi devrais-je prendre le risque de l'utiliser?"

cela ne s'applique évidemment qu'aux langues adaptées au domaine de l'écriture des compilateurs.

29
répondu Daniel Earwicker 2009-09-29 16:57:08

il y a deux avantages principaux à des implémentations de langue bootstrapped: d'abord, comme vous le suggérez, de profiter des fonctionnalités de haut niveau de ladite langue dans la mise en œuvre. Cependant, un avantage moins évident mais non moins important est qu'il vous permet de personnaliser et d'étendre le langage sans tomber dans une couche inférieure écrite en C (ou Java, ou ce qui se trouve sous le nouveau langage runtime).

métaprogrammation peut ne pas être utile pour la plupart des Jour-à-jour tâches, mais il ya des moments où il peut vous sauver beaucoup de code dupliqué ou boilerplate. Être capable de se connecter au compilateur et à l'exécution du noyau pour une langue à un niveau élevé peut rendre les tâches de métaprogrammation avancées beaucoup plus faciles.

13
répondu rcoder 2009-09-29 16:59:55

Ken Thompson "151910920," Réflexions sur la Confiance la Confiance , explique l'une des meilleures raisons pour l'amorçage. Essentiellement, votre compilateur apprend de nouvelles choses pour chaque version du compilateur dans la chaîne de bootstrapping que vous n'aurez plus jamais à lui enseigner.

dans le cas où il mentionne, le premier compilateur (C1) que vous écrivez doit être explicitement dit comment gérer l'évasion de backslash. Cependant, le second compilateur (C2) est compilé en utilisant C1, donc antislash échapper à la manipulation est nativement gérés.

la pierre angulaire de son discours est la possibilité que vous pourriez enseigner à un compilateur d'ajouter une porte dérobée aux programmes, et que les compilateurs futurs compilés avec le compilateur compromis seraient également donné cette capacité et que il ne serait jamais apparaître dans la source!

essentiellement, votre programme peut apprendre de nouvelles fonctionnalités à chaque cycle de compilation que ne doivent pas être réimplémentée ou recompilé plus tard dans la compilation des cycles parce que vous le compilateur sait tout sur eux déjà.

prendre une minute pour réaliser les ramifications.

[edit]: C'est une façon assez terrible de construire un compilateur, mais le facteur frais est à travers le toit. Je me demande si elle pourrait être gérable avec le bon cadre?

10
répondu brice 2011-06-30 15:47:51

on peut considérer qu'il s'agit de la barre qui sépare les langues" jouets "des langues" réelles". Si le langage n'est pas assez riche pour se mettre en œuvre, c'est quand même un jouet. Mais c'est probablement une attitude d'une époque largement révolue, étant donné le nombre de langues populaires aujourd'hui qui sont mises en œuvre en C.

9
répondu Peter Seibel 2009-09-29 16:57:47

un avantage serait que les développeurs travaillant sur le compilateur n'auraient besoin de connaître que le langage compilé. Sinon les développeurs ont besoin de connaître le langage compilé comme le langage, le compilateur est écrit.

7
répondu sepp2k 2009-09-29 16:59:37

compilateurs résoudre une grande variété de problèmes non-triviaux, y compris la manipulation de chaînes de caractères, la manipulation de grandes structures de données, et l'interfaçage avec le système d'exploitation. Si votre langue est destinée à gérer ces choses, alors écrire votre compilateur dans votre langue démontre ces capacités. De plus, il crée un effet exponentiel parce que votre langue inclut plus de fonctionnalités, vous avez plus de fonctionnalités que vous pouvez utiliser dans votre compilateur. Si vous mettez en œuvre des fonctionnalités uniques qui cela faciliterait l'écriture de compilateurs, vous avez ces nouveaux outils disponibles pour implémenter encore plus de fonctionnalités.

cependant, si votre langue n'est pas destinée à traiter les mêmes problèmes que la compilation, alors bootstrapping ne fera que vous inciter à encombrer votre langue avec des fonctionnalités qui sont liées à la compilation mais pas à votre problème cible. L'auto-compilation avec Matlab ou SQL serait ridicule; Matlab n'a aucune raison d'inclure de fortes fonctions de manipulation de chaîne et SQL a aucune raison de supporter la génération de code. Le langage qui en résulterait serait inutile et encombré.

il est également intéressant de noter que les langues interprétées sont un problème légèrement différent et doivent être traitées en conséquence.

4
répondu Imagist 2010-01-05 21:04:11

les langues de bas niveau sont souvent bootstrappées parce que pour mettre du code sur le nouveau système, vous avez besoin d'un compilateur de bas niveau là. Obtenez un compilateur C plus et maintenant vous avez des tonnes de code disponibles à utiliser. Avoir un compilateur bootstrapped rend cela plus facile, vous n'avez besoin que de la présence de votre propre code afin de compiler et d'améliorer votre propre code.

il y a d'autres façons d'accomplir ceci, comme faire un compilateur croisé, sur la plupart des systèmes vous ne devez jamais être en mesure de compiler les langages statiques sur l'appareil lui-même dans l'utilisation ordinaire (en fait, les systèmes comme Windows bateau sans compilateur).

une autre raison pour laquelle les compilateurs démarrent souvent bootstrap est qu'ils n'ont pas à se soucier des bogues dans le compilateur avec lequel ils sont compilés. Assurez-vous que votre compilateur peut être compilé avec lui-même et vous limitez les combinaisons de bogues qui pourraient apparaître si vous compilez avec un autre compilateur.

je pense que bootstrapping langues de haut niveau est surtout pour montrer ses talents de programmateur.

3
répondu Southern Hospitality 2009-09-29 18:44:16

on ne démarre pas un compilateur pour DSL. Vous n'écrivez pas un compilateur de requêtes SQL en SQL. MATLAB peut ressembler à un langage universel, mais en fait, il ne l'est pas -- c'est un langage conçu pour les calculs numériques.

2
répondu liori 2009-09-29 17:00:21

Bootstrapping a aussi un autre avantage: si votre langage est agréable, vous pourriez gagner du temps en écrivant votre compilateur dans que dans disons C. par exemple, le compilateur C# était écrit en C++, mais maintenant ils le réécrivent en C#, ce qui leur permet (entre autres choses) d'utiliser le cadre de threading du CLR au lieu de rouler leur propre en C++ (et de suivre l'exemple des mono guys aussi, marketing Sage, Mono était dans une meilleure position en étant capable de dire notre compilateur C# est écrit en C#).

2
répondu Anteru 2009-10-27 14:35:34

Comme un exemple concret, dans version 1.5 (sorti en août 2015), faire de la marche dans l'être entièrement autogène langue [1] [2] . Ils ont énuméré les raisons suivantes:

  • aller est plus facile à écrire (correctement) que C.
  • Go est plus facile à déboguer que C (même en l'absence d'un débogueur).
  • Go est la seule langue vous devez savoir; encourage les contributions.
  • Aller a la meilleure modularité, de l'outillage, de l'essai, le profilage ...
  • Go rend l'exécution parallèle triviale.

parmi ceux-ci, le seul qui serait valable pour toutes les langues est que vous n'avez besoin de connaître qu'une seule langue pour contribuer au compilateur. Les autres arguments peuvent se résumer comme suit: "notre nouveau langage est meilleur que l'ancien". Ce qui devrait probablement être vrai, sinon pourquoi voulez-vous écrire une nouvelle langue?

2
répondu Hjulle 2016-09-04 22:48:31

il y a quelques raisons pour lesquelles vous pourriez vouloir le faire (en théorie):

  1. votre compilateur génère plus code optimisé par rapport aux autres compilateurs sur la plateforme bootstrap.
  2. votre compilateur génère plus correct code que les autres compilateurs sur le bootstrap plate-forme.
  3. vous êtes un imbécile égoïste qui est convaincu que l'un des ci-dessus est vrai, même si elle ne l'est pas.
  4. il n'y a pas de compilateur disponible sur votre plate-forme (C'était celle du GCC) logique originale, parce que beaucoup les plateformes n'avaient pas de compilateur C retour dans la journée).
  5. Vous voulez prouver que votre compilateur peut le gérer (c'est, après tout, en fait un assez bon test d'un compilateur).
1
répondu Russell Newquist 2009-11-06 03:21:25