62 votes

Comment se déroule exactement la compilation java?

Confondu par java processus de compilation

OK je sais que cela: Nous écrire le code source de java, le compilateur, ce qui est indépendant de la plateforme traduit en bytecode, puis la jvm qui est dépendants de la plateforme traduit en code machine.

Afin de commencer, nous allons écrire le code source java. Le compilateur javac.exe est un .exe fichier. Quelle est exactement ce .fichier exe? N'est-ce pas le compilateur java écrit en java, alors comment se fait il est .fichier exe qui l'exécute? Si le compilateur de code est écrit en java, alors comment se fait compilateur de code est exécuté lors de la phase de compilation, depuis sa le travail de la machine pour exécuter du code java. Comment une langue elle-même composer son propre code de langue? Il semble que tout comme l'oeuf et la poule de problème pour moi.

Maintenant exactement ce que fait le .fichier de classe contiennent? C'est un arbre de syntaxe abstraite en forme de texte, est-il des informations tabulaires, c'est quoi?

quelqu'un peut-il me dire clairement et de façon détaillée sur la manière dont mon code source java est converti en code machine.

62voto

Rekin Points 3100

OK je sais que cela: Nous écrire le code source de java, le compilateur, ce qui est indépendant de la plateforme traduit en bytecode,

En fait le compilateur lui-même fonctionne comme un fichier exécutable natif (donc javac.exe). Et de vrai, il transforme le fichier source en bytecode. Le pseudo-code est indépendant de la plateforme, car il est ciblé à une Machine Virtuelle Java.

puis la jvm qui est dépendants de la plateforme traduit en code machine.

Pas toujours. Comme pour le Soleil de la JVM, il y a deux machines virtuelles: le client et le serveur. Ils peuvent tous les deux, mais certainement pas avoir à les compiler en code natif.

Afin de commencer, nous allons écrire le code source java. Le compilateur javac.exe est un .exe fichier. Quelle est exactement ce .fichier exe? N'est-ce pas le compilateur java écrit en java, alors comment se fait il est .fichier exe qui l'exécute?

Cette exe le fichier est enveloppé bytecode java. C'est par commodité et pour éviter compliqué scripts batch. Il commence une JVM et exécute le compilateur.

Si le compilateur de code est écrit en java, alors comment se fait compilateur de code est exécuté lors de la phase de compilation, depuis sa le travail de la machine pour exécuter du code java.

C'est exactement ce que l'emballage code ne.

Comment une langue elle-même composer son propre code de langue? Il semble que tout comme l'oeuf et la poule de problème pour moi.

Vrai, déroutant au premier coup d'œil. Cependant, ce n'est pas seulement de Java est un langage. Le compilateur Ada est également écrit en Ada lui-même. Il peut sembler comme une "poule et de l'œuf problème", mais en vérité, c'est seulement l'amorçage problème.

Maintenant exactement ce que fait le .fichier de classe contiennent? C'est un arbre de syntaxe abstraite en forme de texte, est-il des informations tabulaires, c'est quoi?

C'est pas de l'Arbre de Syntaxe Abstraite. AST est uniquement utilisé par le générateur de jetons et le compilateur lors de la compilation de temps pour représenter le code en mémoire. .class le fichier est comme une assemblée, mais pour la JVM. La JVM est une machine abstraite qui peut exécuter machine spécialisée de la langue - cible uniquement à la machine virtuelle. Dans son expression la plus simple, .class le fichier a la structure très similaire à la normale de l'assemblée. Au début, se sont déclarées toutes les variables statiques, puis arrive quelques tables de fonction extern signatures et enfin le code de l'ordinateur.

Si Vous êtes vraiment curieux Vous pouvez aller dans classfile à l'aide de "javap" de l'utilitaire. Voici un exemple (crypté) de sortie de l'invocation d' javap -c Main:

0:   new #2; //class SomeObject
3:   dup
4:   invokespecial   #3; //Method SomeObject."<init>":()V
7:   astore_1
8:   aload_1
9:   invokevirtual   #4; //Method SomeObject.doSomething:()V
12:  return

Donc, Vous devriez avoir une idée déjà de ce qu'il est vraiment.

quelqu'un peut-il me dire clairement et de façon détaillée sur la manière dont mon code source java est converti en code machine.

Je pense qu'il devrait être plus clair dès maintenant, mais voici, en résumé:

  • Vous appelez javac pointant vers votre fichier de code source. L'interne lecteur (ou tokenizer) de javac lit de votre fichier et construit une véritable AST hors de lui. Toutes les erreurs de syntaxe venir à partir de cette étape.

  • L' javac n'a pas fini, il travail encore. Quand il a de l'AST le véritable compilation peut commencer. C'est à l'aide de modèle visiteur de parcourir l'AST et résout les dépendances externes pour ajouter du sens (sémantique) du code. Le produit fini est enregistré en tant que .class le fichier contenant le bytecode.

  • Maintenant, il est temps d'exécuter la chose. Vous appelez java le nom de .classfile. Maintenant, la machine commence à nouveau, mais à interpréter Votre code. La JVM peut, ou peut ne pas compiler Votre résumé du bytecode en natif de l'assemblée. Le Soleil HotSpot compilateur en conjonction avec Juste le Temps de compilation peut le faire si nécessaire. Le code en cours d'exécution est constamment profilée par la JVM et compilées en code natif si certaines règles sont respectées. Le plus souvent, le chaud, le code est le premier à compiler en natif.

Edit: Sans le javac on aurait pu invoquer le compilateur à l'aide de quelque chose de similaire à ceci:

%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompile

Comme Vous pouvez le voir, c'est l'appel du Soleil API privée donc c'est lié à la Sun JDK mise en œuvre. Il serait de construire des systèmes dépendant de lui. Si l'on passé à tout autre JDK (wiki listes 5 autre que le Soleil), puis le code ci-dessus devrait être mis à jour pour refléter le changement (car il est peu probable que le compilateur pourrait résider dans com.soleil.outils.javac package). D'autres compilateurs pourrait être écrit en code natif.

Donc, la méthode standard consiste à expédier javac wrapper avec le JDK.

16voto

matt b Points 73770

N'est-ce pas le compilateur java écrit en java, alors comment se fait il est .fichier exe qui l'exécute?

D'où tenez-vous cette information? L' javac exécutable peut être écrit dans n'importe quel langage de programmation, il est sans importance, tout ce qui est important, c'est que c'est un exécutable qui se transforme .java fichiers en .class fichiers.

Pour plus de détails sur les binaires de la spécification d'un .fichier de classe, vous pourriez trouver ces chapitres dans le Langage Java Specification utile (bien qu'un peu technique):

Vous pouvez également prendre un coup d'oeil à la Machine Virtuelle de Spécification qui couvre:

11voto

Michael Borgwardt Points 181658

Le compilateur javac.exe est un .exe fichier. Quelle est exactement ce .fichier exe? N'est-ce pas le compilateur java écrit en java, alors comment se fait il est .exe fichier qui l'exécute?

Le compilateur Java (au moins celui qui vient avec le Sun/Oracle JDK) est en effet écrit en Java. javac.exe est juste un lanceur d'applications que les processus de la ligne de commande arguments, dont certains sont passés à la machine qui exécute le compilateur, et d'autres pour le compilateur lui-même.

Si le compilateur de code est écrit est java, alors comment se fait compilateur de code est exécuté lors de la phase de compilation, depuis sa le travail de la machine à d'exécuter du code java. Comment une langue lui-même composer son propre code de langue? Il semble que tout comme l'oeuf et la poule problème pour moi.

Beaucoup (sinon la plupart) des compilateurs sont écrits dans la langue de leur compilation. De toute évidence, à un stade précoce, le compilateur lui-même a dû être composée par quelque chose d'autre, mais après cela, de "bootstrapping", une nouvelle version du compilateur peuvent être compilés en une version plus ancienne.

Maintenant exactement ce que fait le .fichier de classe contient-il? C'est un arbre de syntaxe abstraite sous forme de texte, est-il tabulaire l'information, c'est quoi?

Les détails de la classe format de fichier sont décrites dans la Machine Virtuelle Java de spécification.

5voto

Mike Caron Points 7741

Eh bien, javac et la jvm sont généralement des binaires natifs. Ils sont écrits en C ou quoi que ce soit. Il est bien sûr possible de les écrire en Java, vous devez simplement une version native en premier. Ceci est appelé "boot strapping".

Fait amusant: la Plupart des compilateurs que les compiler en code natif sont écrits dans leur propre langue. Cependant ils avaient tous une version native écrit dans une autre langue première (généralement C). Le premier compilateur C, par comparaison, a été écrit en Assembleur. Je présume que le premier assembleur a été écrit en code machine. (Ou, à l'aide de papillons ;)

.les fichiers de classe sont bytecode généré par javac. Ils ne sont pas textuelles, ils sont en code binaire similaire en code machine (mais avec un autre jeu d'instructions et de l'architecture).

La jvm, au moment de l'exécution, a deux options: soit intepret le byte code (se faisant passer pour un CPU lui-même), ou il peut JIT (just-in-time) le compiler en code machine natif. Ce dernier est plus rapide, bien sûr, mais plus complexe.

3voto

ZoFreX Points 3946

Le fichier .class contient un bytecode qui est un peu comme un assemblage de très haut niveau . Le compilateur pourrait très bien être écrit en Java, mais la JVM devrait être compilée en code natif pour éviter le problème poulet / œuf. Je crois qu'il est écrit en C, tout comme les niveaux inférieurs des bibliothèques standard. Lorsque la JVM s'exécute, elle effectue une compilation juste à temps pour transformer ce bytecode en instructions natives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X