2013-05-18 10 views
5

Mein Verständnis, wie das ist, Definitionen:Compilation vs Übersetzung, "kompilieren" Java zu Bytecode?

Translation - Code in einer Sprache mit, Code in einer anderen Sprache zu erzeugen.

Compilaton - Übersetzung in einen Maschinencode.

Maschinencode - direkte Anweisungen für die CPU.

nun von docs.oracle.com:

javac - Programmiersprache Java Compiler

Compiler ...? Ich denke, es ist Java Übersetzer, weil es einen Code generiert, das ist kein Maschinencode. Bytecode benötigt einen Interpreter (JVM) zur Ausführung, also ist es definitiv kein Maschinencode.

Von Wikipedia:

Java-Anwendungen sind in der Regel zusammengestellt

Ähnlich Bytecode. Laut Definitionen würde ich sagen, dass Java zu Bytecode übertra- gen wird. Es gibt viele weitere Beispiele im Internet, ich glaube, da ist Verwirrung, oder ich vermisse nur etwas.

Könnten Sie das bitte klären? Was ist der Unterschied zwischen Übersetzung und Kompilierung?

+0

Ihre Definitionen sind falsch. –

Antwort

6

Es ist alles eine Frage der Definitionen, und es gibt keine einzige akzeptierte Definition für das, was "Compilation" bedeutet. In deinen Augen verwandelt die Kompilierung einen Quellcode in einer Sprache in nativ; Daher sollte ein Umwandlungsprozess, der keinen Maschinencode erzeugt, nicht als "Kompilierung" bezeichnet werden. In meinen Augen (und anscheinend auch in den Augen der Dokumentationsautoren) sollte es so aussehen.

Es gibt tatsächlich viele verschiedene Begriffe: Übersetzung, Kompilierung, Dekompilierung, Montage, Demontage und mehr.

Persönlich würde ich sagen, es macht Sinn, zu einer Gruppe alle diese Begriffe unter „Compilation“, weil alle diese Prozesse viel gemeinsam haben:

  • Sie Code in einer formalen Sprache umwandeln zu codieren, in eine andere formale Sprache.
  • Sie versuchen, die Semantik des Eingabecodes so gut wie möglich zu bewahren.
  • Sie alle haben ein sehr ähnliches Design mit einem Front-End, einem Back-End und einem möglichen Optimierer in der Mitte (learn more about compiler structure here). Ich habe die Eingeweide von javac und nativen Compilern gesehen und sie sind relativ ähnlich.

Zusätzlich Ihre Definition von „erzeugt nativen Code“ ist problematisch:

  • Was Compiler, die Montage erzeugen kann, aber nicht die Mühe, dass Code-Maschine verwandeln, das an ein externes Programm verlassen (allgemein "Assembler" genannt)? Würdest du ihnen diese Definition von "Compilern" aufgrund dieses letzten, unbedeutenden Vergleichs verweigern?
  • Wie klassifizierst du "Maschinencode"? Was ist, wenn morgen ?

Aber das sind nur meine Meinungen. Ich denke, dass da draußen, die am meisten akzeptierten Definitionen sind, dass:

  • Compilation in einer höheren Programmiersprache zu einer niedrigeren Ebene einer Transformation Code. Beispiele: Java- zu Java-Bytecode oder C zu x86-Maschinencode.
  • Dekompilierung wandelt einen Code in einer niedrigeren Sprache in eine höhere Sprache um - in der Tat das Gegenteil der Kompilierung. Beispiele: Java Bytecode nach Java.
  • oder Source-to-Source-Kompilierung wandelt einen Code in einer Sprache in eine andere Sprache mit vergleichbarem "Level" um. Beispiele: ARM nach x86 oder C nach Java. Wenn die zwei Sprachen tatsächlich unterschiedliche Versionen derselben Sprache sind (z. B. Javascript 6 bis Javascript 5), wird auch der Begriff transpiler verwendet.
  • Baugruppe wandelt Code in einer Assemblersprache in Maschinencode um.
  • Disassembly ist entweder ein Synonym für Dekompilierung oder das Gegenteil von Assembly, abhängig vom Kontext.

Unter diesen Definitionen könnte javac definitiv als ein Compiler betrachtet werden. Aber noch einmal, es ist alles in den Definitionen: Aus technischer Sicht haben viele dieser Aktionen viel gemeinsam.

4

Das Ergebnis von javac ist Maschinencode. Die Tatsache, dass die Maschine virtuell und nicht physisch ist, ist nicht relevant (andernfalls könnte man argumentieren, dass das Übersetzen von Code in x86 eine Übersetzung war, wenn Sie ein Mac-Benutzer waren, da der x86-Code kein Mac-Maschinencode ist).

+2

Seit 2006 verwenden Macs die x86-Plattform –

+0

Warum nicht * übersetzen * von C++ nach x86 und dann * kompilieren * von x86 zu PowerPC-Maschinencode? Ich denke, es ist besser, Bytecode == Maschinencode zu setzen. Wie x86-Maschinencode in der gleichen Klasse wie Bytecode sein könnte ... –

+0

Es gibt keine solche Sprache wie x86. Sie könnten C++ in eine Maschinensprache übersetzen, aber dies müsste immer noch in Maschinencode übersetzt werden. Eine Sprache ist textbasiert für einen menschlichen Entwickler und wird von der tatsächlichen Maschine abstrahiert. Maschinencode ist etwas, was die CPU ausführen kann. –

1

„Ein Compiler ist ein Computerprogramm (oder einen Satz von Programmen), die Quellcode geschrieben in einer Programmiersprache (Quellsprache) in einer anderen Computersprache (die Zielsprache, die oft mit einer Binärform umwandelt bekannt als Objektcode). "

http://en.wikipedia.org/wiki/Compiler

nicht so eine Zusammenstellung bedeutet nicht, dass die Ausgabe in Maschinencode ist. Zum Beispiel würde die frühe C++ - Kompilierung ein C-Programm erzeugen, das dann erneut in Maschinencode übersetzt werden müsste. Natürlich würde jeder gute Compiler diese einzelnen Schritte vor dem Benutzer verbergen, aber sie sind immer noch da.

Jetzt weiß ich zumindest von dem NesC-Compiler, der das gleiche Verfahren ausführt.

Eine Maschine, die JVM-Bytecode ausführt, kann gebaut werden, tatsächlich einige Kapitel der Strukturierten Computerorganisation von A. Tanenbaum beschreiben, wie man das macht.

http://www.amazon.com/Structured-Computer-Organization-5th-Edition/dp/0131485210

+0

Compilation == Übersetzung? Also sollten alle Übersetzer stattdessen Compiler genannt werden? –

+1

Die Übersetzung ist generischer, ich könnte von Englisch auf Spanisch übersetzen, und ich würde das Kompilieren nicht nennen, aber im Bereich der Computersprachen, ja absolut. – LtWorf