[PYTHON] Heutzutage ... wusste ich nicht, dass Java zweimal "kompiliert" wurde! (> <)

2019/9/29 Der Texttitel und der Titel der Zitierquelle wurden korrigiert und "5. Nebenbei" hinzugefügt. 2019/8/18 Teilweise Überarbeitung der Fußnoten durch Hinzufügung von Zitaten und Referenzmaterialien 14.10.2018 Teilrevision

==========================================================================

** 0. Einführung **

Vielen Dank. lange nicht gesehen. Es ist zd6ir7. Es ist eine Weile her seit meinem letzten Beitrag "Ich habe eine Java EE-Umgebung auf AWS erstellt und versucht, eine Webanwendung auszuführen", aber diesen Sommer (2018) Ich war etwas verlegen und möchte zu diesem Thema posten. Beachten Sie wie im Beispiel, dass einige Details aus Gründen der Übersichtlichkeit weggelassen wurden.

** 1. Wie das Programm funktioniert **

Bevor wir über das Hauptthema sprechen, müssen wir zuerst den Mechanismus (Ablauf) berühren, wenn das Programm ausgeführt wird. Jedes Programm auf der Welt, ob Visual Basic oder C ++, wird von der Festplatte in den Speicher geladen und letztendlich von der CPU interpretiert und ausgeführt. プログラムが実行されるまでの流れ.png

Um von der CPU ausgeführt zu werden, muss das Programm in eine von der CPU interpretierte Sprache übersetzen können. Die "Sprache" heißt "Maschinensprache" (* 1) und ist eine Sprache, die nur aus Nullen und Einsen besteht. Warum besteht es nur aus Nullen und Einsen? Dies liegt daran, dass ein Pin der elektronischen Komponente (IC), die die CPU bildet, nur Elektrizität leiten oder nicht leiten kann. Aufgrund der Eigenschaften dieses IC verarbeitet die CPU alle Informationen in Binärzahlen, die aus 0s und 1s (* 2) bestehen.

** 2. Die Essenz der "Zusammenstellung" **

Auf diese Weise wird das Konvertieren des Quellcodes eines Programms in eine Datei in einer Maschinensprache, die nur aus 0 oder 1 besteht, damit die CPU ihn interpretieren kann, als "Kompilierung" bezeichnet, und das Konvertierungswerkzeug wird als "Compiler" bezeichnet. Ich bin raus. Die vom Compiler kompilierte Maschinensprachendatei wird in den Speicher geladen und schließlich von der CPU ausgeführt (* 3).

"Zitier- / Referenzmaterial" 3. ~ 5. Aus der Sicht der Kompilierung können Programmiersprachen in der Welt in die folgenden zwei Typen unterteilt werden.

  1. Sprache vom Typ Compiler Eine Sprache, mit der die CPU Programme ausführen kann, nachdem der Quellcode in eine Maschinensprachendatei konvertiert wurde. Typische Sprachen sind Fortran, C und COBOL.

  2. Sprache vom Typ Dolmetscher Eine Sprache, mit der die CPU Programme so ausführen kann, wie sie sind, ohne den Quellcode in eine Maschinensprachendatei zu konvertieren. Typische Sprachen sind Perl, Ruby, PHP usw.

  3. Benötigt eine kleine Ergänzung. Da die CPU nur die Maschinensprache kennt, muss sie ohnehin in die Maschinensprache konvertiert werden, um beispielsweise Python-Code auszuführen. Hier kommt der "Interpreter", in diesem Beispiel Python, aber der Python-Code ist Zeile für Zeile.

--Lesen

インタプリタ型言語.png

Klar ist hier natürlich, dass Programme immer in Maschinensprache übersetzt werden müssen. Der einzige Unterschied besteht darin, ob der Quellcode durch ein als "Kompilierung" bezeichnetes Mittel in eine andere Datei konvertiert und von der CPU ausgeführt wird oder nicht konvertiert wird und direkt von der CPU unter Verwendung eines Interpreters (* 4) ausgeführt wird.

** 3. Java wird zweimal "kompiliert"! ?? ** **.

Hier ist die Einführung von Java. Welchen Prozess durchläuft Java vom Quellcode bis zur Ausführung? java実行の大まかな流れ.png

Die obige Abbildung zeigt einen einfachen Ablauf, aber unter dem Strich wird Java "kompiliert" und zweimal ausgeführt. Es durchläuft einen speziellen Prozess mit anderen Programmiersprachen, aber hier sind die Details:

  1. Konvertierung vom Quellcode in die Klassendatei (1. "Kompilieren") Der Java-Compiler (Javac-Tool) "kompiliert" den Quellcode in eine Klassendatei, die aus Bytecode besteht, dh einem 8-Bit-Bytestream, der nur aus 0s und 1s besteht (* 5). 第1回目コンパイル.png

  2. Von der Klassendatei zur Ausführung (2. "Kompilieren") Wenn Java Virtual Machine (JVM) diese Klassendatei liest und in die Ausführungsphase eintritt (* 6),

Ein Interpreter und ein (JIT) -Compiler existieren gleichzeitig in der JVM, und ein Java-Programm wird durch eine Kombination von zwei Funktionen ausgeführt: zeilenweise lesen und in Maschinensprache konvertieren oder in einer Einheit "kompilieren". Sie können sehen, dass es getan wurde. In der JVM gibt es verschiedene Optionen. Wie oben erwähnt, können Sie den Interpreter zuerst ausführen lassen und dann den JIT-Compiler aufrufen, oder Sie können den JIT-Compiler plötzlich kompilieren lassen oder beide entsprechend kombinieren. Optionen sind ebenfalls verfügbar (* 9). Es ist ein Bild, das entsprechend den Leistungsanforderungen ausgewählt werden muss. Einzelheiten zu den Optionen finden Sie unter 3. "Referenzen / Referenzen". Bitte beziehen Sie sich auf.

第2回目コンパイル_再修正.png

** Vier. abschließend**

Was haben Sie gedacht? Ich denke, Sie können sich vorstellen, dass Java zweimal kompiliert und ausgeführt wird. Um die bisherige Geschichte zusammenzufassen:

Es wird sein. Wenn Sie Java "kompilieren" sagen, sind Sie möglicherweise verwirrt darüber, um welches "kompilieren" es sich handelt. In diesem Fall hoffe ich, dass dieser Artikel für das Verständnis der Leser nützlich ist. Auf der anderen Seite ist es wichtig, dass es in jeder Programmiersprache, einschließlich Java, üblich ist. Ich denke nicht, dass Sie den Mechanismus verstehen, wann das Programm ausgeführt wird. Wenn Sie nach der "Kompilierung" von Java gefragt werden, können Sie Verwirrung minimieren und durch Erweiterung feststellen, was es wirklich ist.

**Fünf. Nebenbei **

Vielen Dank, dass Sie so weit gelesen haben. Ich habe beschlossen, diesen Artikel zu schreiben, weil ich die Erklärung des "JIT-Compilers" im folgenden Buch gelesen habe. Dieses Buch wird übrigens auch in meinem vorherigen Beitrag ["Ist 100% CPU-Auslastung schlecht?"] Zitiert (Https://qiita.com/zd6ir7/items/2cb39f55f3b15af79f6f). Bitte beziehen Sie sich später darauf.

Geschrieben von Scott Oaks, übersetzt von Acroquest Technology Co., Ltd., übersetzt von Kao Terada, übersetzt von Satoshi Makino "Java Performance", veröffentlicht von O'Reilly Japan https://www.oreilly.co.jp/books/9784873117188/

Zum Zeitpunkt des Jahres 2018 verstand ich den "JIT-Compiler" nicht vollständig und dachte, dass der Java-Compiler genau das ist, was Java-Quellcode in eine Klassendatei konvertiert. Daher ist der "JIT-Compiler" dieses Buches Ich konnte es überhaupt nicht verstehen, selbst nachdem ich die Erklärung gelesen hatte. Nach vielen Recherchen bemerkte ich jedoch, dass es zweimal "kompiliert" wurde, und ich kam auf einen Beitrag, um dieses Bewusstsein zu teilen.

Trotzdem war nichts schwieriger zu erstellen als diesmal. Da es bisher nur wenige "frühere Studien" gibt, kann es unansehnlich sein, wenn die Wand wiederholt getroffen und überwunden wird ... aber wir werden sie von Zeit zu Zeit verbessern. .. Bis zum nächsten Mal. Trotzdem ist die Fußnote größer geworden ... f (^^;)

Fußnote

(* 1) Wird auch als "Maschinensprache" oder "nativer Code" bezeichnet. In diesem Artikel verwenden wir "Maschinensprache". (* 2) 1. von "Zitier- / Referenzmaterial". Es gibt eine detaillierte Erklärung, wie die CPU funktioniert und warum sie binär behandelt werden sollte. Bitte beziehen Sie sich darauf. Zusätzlich 2. von "Zitier- / Referenzmaterial". Bitte beachten Sie auch die leicht verständliche Beschreibung der Funktionsweise des Computers. (* 3) Obwohl es detailliert ist, unterscheidet es sich bei der Definition des Begriffs "Kompilieren" geringfügig je nach Literatur oder Website, z. B. ob es einfach in Maschinensprache konvertiert wird oder ob es in eine Form konvertiert wird. Es scheint, dass. In diesem Artikel werden die Rolle der Konvertierung in ein anderes Dateiformat, das der Compiler ursprünglich in verschiedenen Programmiersprachen gespielt hat, und die Konvertierung in eine Maschinensprachen- "Datei" unter dem Gesichtspunkt des Vergleichs von Sprachen vom Typ Interpreter als Kompilierung definiert. (* 4) 3. von "Zitier- / Referenzmaterial". Und 5. Wie Sie in der Sprache vom Typ Compiler sehen können, wird effizienter Code ausgeführt, indem der Quellcode vom Compiler analysiert und optimiert wird, während er in der Sprache vom Typ Interpreter Zeile für Zeile ausgeführt wird, sodass es sich um eine Sprache vom Typ Compiler handelt. Es hat den Nachteil, langsamer zu sein. Nebenbei habe ich die Eigenschaften beider Sprachen unten zusammengefasst.

Sprache vom Compilertyp Sprache vom Typ Dolmetscher
Performance(Ausführungsgeschwindigkeit) Relativ schnell Relativ langsam
Programmierlast Relativ groß Relativ klein(Leichte Sprache)
Portabilität Niedrig hoch
Art Fortran、COBOL、C、C++etc Perl, Ruby, PHP, Python usw.

Anfangs habe ich C # als Compilersprache verwendet, aber ich habe es entfernt. Dies liegt daran, dass C # in eine gemeinsame Zwischensprache (CIL) konvertiert und zur Laufzeit ausgeführt wird, wie in ".NET-Konzept und -Struktur" beschrieben. Dies liegt daran, dass es nicht mit positioniert werden kann. Python ist eine interpretierte Sprache, die jedoch in eine Pyc-Datei "kompiliert" wird, wie unter "Erstellen einer Python-Pyc-Datei [für Anfänger]" beschrieben. Da es von ausgeführt wird, gibt es auch genaue Elemente jeder Compilertypsprache.

(* 5) Die detaillierte Struktur der Klassendatei ist in 6. von "Referenz / Referenzmaterial" beschrieben. 7. Bitte beziehen Sie sich auf. (* 6) Die Klassendatei wird nicht plötzlich in der JVM ausgeführt, sondern vom "Class Loader Subsystem" gelesen, Informationen werden dem "Laufzeitdatenbereich" und dann in der "Laufzeit-Engine" zugewiesen. Wird vom Interpreter JIT-Compiler ausgeführt. Einzelheiten finden Sie unter 8. "Referenzen / Referenzen". 9. 11. Bitte beziehen Sie sich auf. (* 7) In Bezug auf die zweite "Zusammenstellung" sollte leider festgelegt werden, welche Art von Format speziell entfernt werden soll, z. B. ob es zusätzlich zu den in diesem Artikel erwähnten "Referenzmaterialien" einmal in eine Zwischendatei konvertiert werden soll Verschiedene Websites, Literatur usw. wurden überprüft, konnten jedoch nicht gefunden werden. Es scheint, dass es nicht veröffentlicht werden kann, da es mit den detaillierten Spezifikationen der JVM zusammenhängt, aber ich vermute, dass eine oder mehrere Klassen, mehrere Bytes Bytecode oder eine bestimmte Einheit, Zwischen- und temporäre Maschinensprache " Es wird angenommen, dass es in "Datei" konvertiert und in den Speicher geladen wird. (* 8) Wenn Sie den Befehl javap für eine bestimmte Klassendatei ausführen, können Sie bestätigen, dass es sich um ein Assemblersprachen-System handelt. Einzelheiten zum Befehl javap finden Sie unter 6. ,Zehn. Bitte beziehen Sie sich auf. Die Erklärung zur Assemblersprache finden Sie übrigens in 1. von "Citation / Reference Material". , 2. Bitte beziehen Sie sich auf. (* 9) Der JIT-Compiler kann durch Setzen der Option "-Djava.compiler = NONE" deaktiviert werden. Siehe JIT deaktivieren (https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.0.0/com.ibm.java.zos.70.doc/user/disjit.html).

** Zitier- / Referenzmaterial **

  1. [Geschrieben von Hisao Yazawa / Betreut von Nikkei Software "Warum Programme funktionieren - Grundkenntnisse über Programme, die Sie kennen sollten -" Nikkei BP](https://www.amazon.co.jp/%E3%83%97 % E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% A0% E3% 81% AF% E3% 81% AA% E3% 81% 9C% E5% 8B% 95% E3 % 81% 8F% E3% 81% AE% E3% 81% 8B-% E7% AC% AC% EF% BC% 92% E7% 89% 88-% E7% 9F% A5% E3% 81% A3% E3 % 81% A6% E3% 81% 8A% E3% 81% 8D% E3% 81% 9F% E3% 81% 84% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83 % A9% E3% 83% A0% E3% 81% AE% E5% 9F% BA% E7% A4% 8E% E7% 9F% A5% E8% AD% 98-% E7% 9F% A2% E6% B2% A2% E4% B9% 85% E9% 9B% 84 / dp / 4822283151)

  2. [Geschrieben von Hisao Yazawa / betreut von Nikkei Software "Warum Computer funktionieren - Grundkenntnisse über Hardware und Software, die Sie kennen sollten-" Nikkei BP](https://www.amazon.co.jp/%E3 % 82% B3% E3% 83% B3% E3% 83% 94% E3% 83% A5% E3% 83% BC% E3% 82% BF% E3% 81% AF% E3% 81% AA% E3% 81 % 9C% E5% 8B% 95% E3% 81% 8F% E3% 81% AE% E3% 81% 8B% EF% BD% 9E% E7% 9F% A5% E3% 81% A3% E3% 81% A6 % E3% 81% 8A% E3% 81% 8D% E3% 81% 9F% E3% 81% 84% E3% 83% 8F% E3% 83% BC% E3% 83% 89% E3% 82% A6% E3 % 82% A8% E3% 82% A2% EF% BC% 86% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6% E3% 82% A8% E3% 82 % A2% E3% 81% AE% E5% 9F% BA% E7% A4% 8E% E7% 9F% A5% E8% AD% 98% EF% BD% 9E-% E7% 9F% A2% E6% B2% A2-% E4% B9% 85% E9% 9B% 84 / dp / 4822281655)

  3. Geschrieben von Scott Oaks, übersetzt von Acroquest Technology Co., Ltd., übersetzt von Kao Terada, übersetzt von Satoshi Makino, "Java Performance", O'Reilly Japan

  4. TAKUYA-110 "Programmiergrundlagen" Qiita-Blog

  5. [Shingo Tsujis "Python Start Book" Technical Review](https://www.amazon.co.jp/Python%E3%82%B9%E3%82%BF%E3%83%BC%E3% 83% 88% E3% 83% 96% E3% 83% 83% E3% 82% AF-% E8% BE% BB-% E7% 9C% 9F% E5% 90% BE / dp / 4774142298)

  6. Y torazuka, "Lesen von Java-Klassendateien für Anfänger" SlideShare

  7. Java Language and Virtual Machine Specifications Oracle Docs

  8. Java Program JVM

  9. The JVM Architecture Explained - An overview of the different components of the JVM, along with a very useful diagram by Jackson Joseraj Java Zone

  10. javap - Java Class File Reverse Assembler Oracle Docs

  11. Preface to java virtual machine and architecture by admin

  12. und 2. In "Persönlich nützliches technisches Buch", 3. Wird in "[Ist 100% CPU-Auslastung schlecht?] Erwähnt (Https://qiita.com/zd6ir7/items/2cb39f55f3b15af79f6f)", also überprüfen Sie es bitte.

Recommended Posts

Heutzutage ... wusste ich nicht, dass Java zweimal "kompiliert" wurde! (> <)
Ich kannte die Grundlagen von Python nicht
Zusammenfassung der Numpy-Funktionen, die ich nicht kannte
Ich wusste nicht viel über Linux-Umgebungsvariablen