Question

Je lisais brièvement Maxine qui est une implémentation machine virtuelle Java open source qui écrit en Java . Cela me semble circulaire. Si java nécessite une machine virtuelle pour exécuter dans, comment la machine virtuelle elle-même écrit en Java (ne sera pas le code VM besoin d'une machine virtuelle dans lequel exécuter, etc.?).

Modifier : Ok, donc je vois que je compte du fait que Java ne doit pas fonctionner dans une machine virtuelle. Comment donc expliquer comment on un compilateur LISP peut être écrit en LISP? Ou devrait-il être une nouvelle question tout à fait?

Était-ce utile?

La solution

Votre hypothèse que Java nécessite une machine virtuelle

Autres conseils

La machine virtuelle Java que vous avez besoin pour démarrer une machine virtuelle Java en Java ne probablement pas besoin de beaucoup de fonctionnalités (telles que la collecte des ordures et JIT), pourrait être très simple. Toutes les fonctionnalités plus avancées pourraient alors être mises en œuvre en Java (qui semble être exactement le point de Maxine, d'expérimenter des idées nouvelles dans la technologie de machine virtuelle Java).

En outre, Maxine ne contient du code C, que je suppose que représente un environnement d'exécution minimal qui est utilisé pour obtenir le reste de Maxine aller. Je suppose que les bits intéressants (compilateur JIT, la collecte des ordures) sont ensuite complètement implémenté en Java.

code Java peut être compilé directement au code de la machine de sorte qu'une machine virtuelle est pas nécessaire.

J'ai regardé Maxine la semaine dernière et je me demandais même:)

De l'Maxine de :

  

1 Construire l'image de démarrage

     

Maintenant, nous allons construire une [image de démarrage]. Dans   cette étape, Maxine fonctionne sur une machine virtuelle hôte   pour configurer un prototype, puis   compile son propre code et données   créer un programme exécutable pour le   plate-forme cible.

     

2 Exécution Maxine

     

Maintenant que Maxine a compilé lui-même,   nous pouvons l'exécuter comme standard Java VM.   La commande max vm gère les détails   des chemins de classe et de la bibliothèque et   fournit une interface similaire à la   commande standard de lancement java.

Vous pouvez jeter un oeil à la méthode bien établie des compilateurs de bootstrapping. Je pense qu'il a commencé dans les années 70 ...

Il est un peu « l'homme whooaoaa, comment peut-il fonctionner ??? » - mais je pense que vous décrivez le phénomène connu sous le nom « d'auto-hébergement »:

Langues (ou toolchains / plates-formes) ne démarrent pas comme auto-hébergement - ils commencent la vie ayant été construite sur une plate-forme existante: à un certain moment, ils deviennent assez fonctionnels pour permettre aux programmes à écrire qui comprennent la syntaxe où il se passe à écrire dans.

Il est un excellent exemple dans le livre AWK classique, qui introduit un programme AWK qui peut analyser (une version allégée comme il arrive) d'autres programmes AWK. Voir lien ci-dessous

Il y a un autre exemple dans le livre « Belle Code » qui a un programme Javascript qui peut analyser le Javascript.

Je pense que la chose à retenir sur ce point - si vous avez (par exemple) d'une machine virtuelle Java écrit en Java qui peut donc exécuter du code Java Byte: la machine virtuelle Java qui exécute la machine virtuelle Java Java lui-même doit être hébergé en mode natif (peut-être cette machine virtuelle Java a été écrit en « C », puis compilé en code machine): cela est vrai dans tous les cas d'un programme d'auto-hébergement éventuellement - quelque part le long de la ligne

.

Alors le mystère est retiré -. Parce qu'à un moment donné, il y a un programme machine code natif en cours d'exécution ci-dessous tout

un peu d'équivalent d'être en mesure de décrire la langue anglaise (etc.) en utilisant la langue anglaise lui-même .... peut-être ...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

Je sais que ce post est vieux, mais je pensais que je pourrais ajouter un peu à la discussion car ils sont des points qui ont été manqués. Ainsi, les futurs lecteurs peuvent trouver cela utile.

Je me demande si tout le monde manque le point ici. Vous pouvez écrire plus tout type de compilateur, interprète ou machine virtuelle dans presque toutes les langues. Lorsque vous utilisez C pour écrire un compilateur C un compilateur C est nécessaire pour compiler le nouveau compilateur. Cependant, la sortie est du code natif qui fonctionne sur la plate-forme désignée. Tout simplement parce que la machine virtuelle Java est écrit dans la langue qui fonctionne sur la machine virtuelle Java ne signifie pas que la sortie doit se traduire par un code qui fonctionne sur la machine virtuelle Java. Par exemple, vous pouvez écrire C, Basic, Pascal ou même Compilateurs assembleurs en Java. Dans ce cas, vous aurez besoin de la machine virtuelle Java pour créer le compilateur ou assembleur, mais une fois créé, vous ne pouvez plus besoin de la machine virtuelle Java si le code initial a donné lieu à du code natif. Une autre approche est d'écrire un traducteur qui prend une langue d'entrée et le convertit en un langage machine natif de sorte que vous écrivez votre programme dans le langage A qui compile en langage B qui qui est ensuite compilé en code machine. Dans le monde micro contrôleur vous voyez ce lot. Quelqu'un veut écrire des programmes dans Basic ou Java afin qu'ils écrivent le compilateur de base / Java pour produire du code C pour un compilateur C existant. Ensuite, le code résultant C est compilé en langage machine fournissant le compilateur de base / Java natif. Cette approche est généralement plus facile que l'écriture du compilateur de base / Java directement dans le code de la machine.

Il y a plusieurs années, j'ai écrit des programmes BÁSICA et GWBasic qui ont produit le code assembleur à 6800 et Z80 micro-ordinateurs. Mon point est que la sortie ne doit pas être du même acabit que l'entrée ou de la cible. C'EST À DIRE. Tout simplement parce que vous écrivez une machine virtuelle Java en Java ne signifie pas que le résultat final doit être exécuté sous une machine virtuelle Java Java.

Voici un bon papier sur une machine virtuelle bootstraping auto-hébergé. Ce n'est pas Java, mais javascript, mais les principes sont les mêmes.

Amorcer une machine virtuelle recherche auto-hébergé pour JavaScript: un rapport d'expérience

Notez que si bootstraping un compilateur auto-hôte et bootstraping une machine virtuelle auto-hébergé sont assez semblables, je crois qu'ils ne soulèvent pas exactement les mêmes défis.

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