L'amorçage nécessite encore de l'appui de l'extérieur
J'ai entendu parler de l'idée de "bootstrapping" une langue, c'est l'écriture d'un compilateur/interpréteur pour le langage en lui-même. Je me demandais comment cela pourrait être accompli et regarda un peu autour de lui, et vu quelqu'un dire qu'il ne pourrait être fait soit en
- écrit un premier compilateur dans une langue différente.
- main-codage initial compilateur dans l'Assemblée, ce qui semble être un cas particulier de la première
Pour moi, aucune de ces semblent effectivement être amorçage une langue dans le sens où ils ont tous deux besoin d'un appui externe. Est-il un moyen d'écrire un compilateur dans sa propre langue?
Je ne suis pas très expérimenté avec de telles choses, mais je suppose que le initiale compilateur devra être écrit dans une autre langue. Je suis assez certain que de "bootstrapping", en référence à des compilateurs, se réfère simplement à l'écriture de un compilateur pour un langage dans le langage, c'est censé compiler, ne pas écrire compilateur pour le langage dans la langue qu'il est destiné à compiler.
Merci pour l'info, tout le monde. Quand a expliqué à l'idée de d'abord l'écriture d'un limitées compilateur, puis monte sur le dessus de cela, alors l'idée de "bootstrapping" a plus de sens. Je vais prendre une Compilateurs de classe au cours de ce semestre, une décision largement influencée par la Steve Yegge post sur l'importance d'une classe dans les Compilateurs est, et je viens d'acheter une copie du Dragon livre à partir du lien Amazon qui a donc downmodded sur plus tôt.
Voir également la même question: la mise en Œuvre d'un compilateur en lui-même
Merci pour l'info, tout le monde. Quand a expliqué à l'idée de d'abord l'écriture d'un limitées compilateur, puis monte sur le dessus de cela, alors l'idée de "bootstrapping" a plus de sens. Je vais prendre une Compilateurs de classe au cours de ce semestre, une décision largement influencée par la Steve Yegge post sur l'importance d'une classe dans les Compilateurs est, et je viens d'acheter une copie du Dragon livre à partir du lien Amazon qui a donc downmodded sur plus tôt.
Voir également la même question: la mise en Œuvre d'un compilateur en lui-même
OriginalL'auteur pbh101 | 2008-08-17
Vous devez vous connecter pour publier un commentaire.
Vous ont avoir une certaine langue pour écrire votre nouveau compilateur. Si vous avez écrit une nouvelle, dire, compilateur C++, il faudrait l'écrire en C++ et le compiler avec un compilateur en premier. D'autre part, si vous avez été la création d'un compilateur pour un langage nouveau, nous allons l'appeler Yazzleof, vous devez écrire le nouveau compilateur dans une autre langue première. Généralement, ce serait un autre langage de programmation, mais il n'a pas à être. Il peut être assemblée ou, le cas échéant, le code machine.
Si vous ont été va amorcer un compilateur pour Yazzleof, en général, vous ne voudriez pas écrire un compilateur pour le plein de la langue de départ. Au lieu de cela vous devez écrire un compilateur pour Yazzle-lite, le plus petit sous-ensemble de la Yazzleof (bien, un jolie petite sous-ensemble au moins). Puis dans Yazzle-lite, vous pouvez écrire un compilateur pour les langues. (Évidemment, cela peut se produire de manière itérative au lieu de dans un saut.) Parce que Yazzle-lite est un sous-ensemble propre de Yazzleof, vous avez maintenant un compilateur qui permet de compiler lui-même.
Il y a un vraiment bon writeup sur l'initialisation d'un compilateur à partir du niveau le plus bas possible (sur une machine moderne est fondamentalement un éditeur hexadécimal), intitulé l'initialisation d'un simple compilateur à partir de rien. Il peut être trouvé à https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html.
OriginalL'auteur Derek Park
L'explication que vous avez lu est correct. Il y a une discussion de cette Compilateurs: Principes, Techniques et Outils (le Dragon Book):
OriginalL'auteur Mark Harrison
Un super intéressant la discussion de cette est dans Unix co-créateur Ken Thompson's Prix Turing conférence.
Il commence avec:
et procède à montrer comment il a écrit une version d'Unix, le compilateur C qui serait toujours lui permettre de se connecter sans mot de passe, parce que le compilateur C de reconnaître le programme de connexion et d'ajouter dans le code spécial.
OriginalL'auteur Mark Harrison
La façon que j'ai entendu parler d'une écriture extrêmement limitée compilateur dans une autre langue, puis l'utiliser pour compiler un plus compliqué que la version, écrite dans la nouvelle langue. Cette deuxième version peut être utilisée pour compiler lui-même, et la prochaine version. Chaque fois qu'il est compilé la dernière version est utilisée.
C'est la définition de l'amorçage:
EDIT: Le Article de wikipédia sur le compilateur d'amorçage couvre le concept mieux que moi.
OriginalL'auteur Eric Haskins
Découvrez podcast Génie logiciel Radio épisode 61 (2007-07-06), qui traite de compilateur GCC internes, ainsi que la GCC d'amorçage du processus.
OriginalL'auteur none
Donald E. Knuth effectivement construit WEB par écrit le compilateur en elle, et puis à la main-compilé à l'assemblée ou du code machine.
OriginalL'auteur MauganRa
Si je comprends bien, la première Lisp interprète a été amorcé par la main de la compilation du constructeur fonctions et le jeton lecteur. Le reste de l'interprète était alors de lire à partir de la source.
Vous pouvez vérifier par vous-même en lisant l'original McCarthy papier, Fonctions récursives des Expressions Symboliques et Leur Calcul à la Machine, Partie I.
OriginalL'auteur luser droog
Une autre alternative est de créer un pseudo-code binaire de la machine pour votre langue (ou en utiliser une existante si ses caractéristiques ne sont pas très inhabituelle et à l'écriture d'un compilateur de bytecode, que ce soit dans le bytecode, ou dans la langue de votre choix à l'aide d'un autre intermédiaire, tel qu'un analyseur de boîte à outils des sorties de l'AST comme XML, puis compilez le fichier XML en pseudo-code binaire à l'aide de XSLT (ou un autre modèle d'appariement de la langue et de l'arbre de représentation). Il n'est pas supprimer la dépendance à l'égard d'une autre langue, mais pourrait signifier que plus de la phase de travail se termine dans le système final.
OriginalL'auteur Pete Kirkham
C'est la science de l'ordinateur version de l'oeuf et de la poule paradoxe. Je ne peux pas penser à une façon de ne pas écrire l'initiale du compilateur assembleur ou un autre langage. Si on aurait pu le faire, je devrais Lisp aurait pu le faire.
En fait, je pense que Lisp presque se qualifie. Découvrez son entrée de Wikipedia. Selon l'article, le Lisp fonction eval pourrait être mis en œuvre sur une IBM 704 en code machine, avec un compilateur complet (écrit en Lisp lui-même) créé en 1962 à MIT.
OriginalL'auteur Wing
Chaque exemple de "bootstrapping" une langue que je peux penser (C, PyPy) a été fait après il y avait un travail de compilateur. Vous devez commencer quelque part, et de réimplanter une langue en elle-même, nécessite l'écriture d'un compilateur à l'autre de la langue première.
Sinon, comment serait-il? Je ne pense pas que c'est encore théoriquement possible de faire autrement.
OriginalL'auteur Adam Lassek
Certains bootstrap compilateurs ou les systèmes de conserver à la fois la source de la forme et de la forme d'objet dans leur référentiel:
ocaml est une langue qui possède à la fois un interpréteur de bytecode (c'est à dire un compilateur de bytecode Ocaml) et un compilateur natif (pour x86-64 ou le BRAS, etc... assembleur). Son dépôt svn contient à la fois le code source (fichiers
*/*.{ml,mli}
) et le code binaire (fichierboot/ocamlc
) forme du compilateur. Ainsi, lorsque vous construisez c'est d'abord à l'aide de son code binaire (d'une précédente version du compilateur) pour compiler lui-même. Plus tard, le fraîchement compilé en bytecode est capable de compiler le compilateur natif. Donc, Ocaml dépôt svn contient à la fois*.ml[i]
fichiers source et lesboot/ocamlc
fichier bytecode.La la rouille compilateur téléchargements (à l'aide de
wget
, de sorte que vous besoin d'une connexion Internet) d'une version précédente de son binaire pour compiler lui-même.Faire FONDRE est un Lisp comme langue de personnaliser et d'étendre GCC. Il est traduit en code C++ par un bootstrap traducteur. L'généré le code C++ du traducteur est distribué, de sorte que le dépôt svn contient à la fois
*.melt
fichiers source etmelt/generated/*.cc
"objet" fichiers du traducteur.J. Pitrat de CAIA système d'intelligence artificielle est entièrement auto-génératrice. Il est disponible comme une collection de milliers de
[A-Z]*.c
fichiers générés (également avec un générésdx.h
fichier d'en-tête) avec une collection de milliers de_[0-9]*
fichiers de données.Plusieurs compilateur Scheme sont également démarré. Scheme48, Poulet Régime, ...
OriginalL'auteur Basile Starynkevitch