Question

  

Doublons possibles:    Comment le compilateur d'une langue écrire dans cette langue?
   mettre en œuvre un compilateur « lui-même »

Je regardais Rubinius , une implémentation Ruby qui compile en bytecode en utilisant un compilateur écrit en Ruby. Je ne peux pas obtenir ma tête autour de cela. Comment écrivez-vous un compilateur pour une langue dans la langue elle-même? Il semble que ce serait juste le texte sans rien compiler dans un fichier exécutable qui pourrait ensuite compiler le code de l'avenir écrit en Ruby. Je me confus juste en tapant cette phrase. Quelqu'un peut-il aider à expliquer cela?

Était-ce utile?

La solution

Pour simplifier: vous devez d'abord écrire un compilateur pour le compilateur, dans une autre langue. Ensuite, vous compilez le compilateur, et le tour est joué!

, vous avez besoin une sorte de langage qui a déjà un compilateur - mais comme il y a beaucoup de ces, vous pouvez écrire le compilateur de compilateur Ruby par exemple (!) en C, qui sera ensuite compiler le compilateur Ruby, qui peut ensuite compiler des programmes Ruby, même d'autres versions de lui-même.

Bien sûr, les compilateurs originaux ont été écrits dans le code de la machine, les compilateurs compilés pour l'assemblage, qui à son tour pour les compilateurs compilés par exemple C ou Fortran, qui a compilé les compilateurs pour ... à peu près tout. développement itératifs action.

Le processus est appelé bootstrapping - peut-être nommé d'après l'histoire du baron Munchhausen où il se retira de un marécage par ses propres moyens:)

Autres conseils

En ce qui concerne le bootstrapping d'un compilateur, il est au sujet de cette lecture vaut bidouille diaboliquement intelligent.

http://catb.org/jargon/html/B/back- door.html

Je ne m'y retrouve en train de lire cette phrase.

Il peut aider à penser le compilateur en tant que traducteur, qui sont souvent appelés compilateurs. Son but est de prendre le code source que les humains peuvent lire et traduire en code binaire que les ordinateurs peuvent lire. Dans le cas de Rubinius, le code qu'il lit se trouve être le code Ruby, et le code qu'il convertit en est le code de la machine (en fait de code machine LLVM qui est lui-même plus compilé en code machine Intel, mais c'est juste un détail de fond) . Rubinius lui-même aurait pu être écrit dans à peu près tout langage de programmation. Il est arrivé juste avoir été écrit dans la même langue qu'il compile.

Bien sûr, vous avez besoin quelque chose à exécuter Rubinius en premier lieu, et fort probablement d'un interprète régulier Ruby. Notez cependant qu'une fois que vous êtes en mesure d'exécuter Rubinius sur un interprète, vous pouvez le transmettre son propre code source, et il va créer et exécuter une version compilée de lui-même. On appelle cela bootstrapping, de la vieille phrase, « vous tirant vers le haut par la force du poignet ».

Une note finale: les programmes Ruby ne peut invoquer le code machine arbitraire. Cette partie de Rubinius est effectivement écrit en C ++.

Eh bien, il est possible de le faire dans l'ordre suivant:

  1. Ecrire un compilateur dans toutes les langues, par exemple C pour votre code Ruby.
  2. Maintenant que vous pouvez compiler le code Ruby, vous pouvez écrire un compilateur qui compile le code Ruby et compiler ce compilateur avec le compilateur C que vous avez écrit à l'étape 1. wahh cette phrase est étrange!
  3. A partir de maintenant vous pouvez compiler tout votre code Ruby avec le compilateur écrit en 2:)

Amusez-vous! :)

Un compilateur est juste quelque chose qui transforme le code source dans un fichier exécutable. Donc, il importe doen't ce qu'il est écrit -. Il peut être la même langue, il compile ou toute autre langue d'une puissance suffisante

Le plaisir vient quand vous écrivez un compilateur pour un langage pour une plate-forme, écrite dans la même langue, qui ne dispose pas encore d'un compilateur pour votre langage de mise en œuvre. Vos choix sont ici pour compiler sur une autre plate-forme pour laquelle vous avez un compilateur, ou d'écrire un compilateur dans une autre langue, et l'utiliser pour compiler le compilateur « réel ».

Il est un processus en 2 étapes:

  1. écrire un compilateur Ruby dans une autre lanaguage comme C, en supposant un compilateur Ruby n'existe pas encore
  2. puisque vous avez maintenant un compilateur Ruby, vous pouvez écrire un programme Ruby qui est un (nouveau) compilateur Ruby

Depuis que quelqu'un a déjà écrit un compilateur Ruby (Matz), vous « seulement » doivent faire la deuxième partie. Plus facile à dire qu'à faire.

Toutes les réponses à ce jour ont expliqué comment utiliser le bootstrap le compilateur en utilisant un compilateur différent. Cependant, il existe une alternative: la compilation du compilateur à la main. Il n'y a aucune raison pour laquelle le compilateur doit être exécuté par une machine, il peut tout aussi bien être exécuté par un être humain.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top