[PYTHON] De nos jours ... je ne savais pas que Java était "compilé" deux fois! (> <)

2019/9/29 Correction du titre du texte et du titre de la source de la citation, et ajout de «5. À part» 2019/8/18 Révision partielle des notes de bas de page en raison de l'ajout de citations et de documents de référence 2018/10/14 Révision partielle

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

** 0. Introduction **

Merci. ça fait longtemps. Il s'agit de zd6ir7. Cela fait un moment depuis mon dernier message "J'ai créé un environnement Java EE sur AWS et essayé d'exécuter une application Web", mais cet été (2018) Je me suis senti un peu gêné et j'aimerais poster sur ce thème. Comme dans l'exemple, veuillez noter que certains détails ont été omis par souci de clarté.

** 1. Comment fonctionne le programme **

Avant de parler du sujet principal, nous devons d'abord aborder le mécanisme (flux) lors de l'exécution du programme. Chaque programme dans le monde, qu'il soit Visual Basic ou C ++, est chargé du disque en mémoire et finalement interprété et exécuté par le CPU. プログラムが実行されるまでの流れ.png

Pour être exécuté par la CPU, le programme doit être capable de traduire dans un langage interprété par la CPU. Le "langage" est appelé "langage machine" (* 1), et c'est un langage composé uniquement de 0 et de 1. Pourquoi est-il composé uniquement de 0 et de 1? En effet, une broche du composant électronique (IC) qui forme le CPU ne peut conduire ou ne pas conduire l'électricité. En raison des caractéristiques de ce circuit intégré, le processeur traite toutes les informations en nombres binaires composés de 0 et de 1 (* 2).

** 2. L'essence de la "compilation" **

De cette façon, la conversion du code source d'un programme en un fichier dans un langage machine composé de seulement 0 ou 1 pour que le CPU puisse l'interpréter s'appelle "compilation", et l'outil de conversion est appelé "compilateur". Je suis dehors. Le fichier de langage machine compilé par le compilateur est chargé en mémoire et finalement exécuté par le CPU (* 3).

"Citation / Matériel de référence" 3. ~ 5. Selon, du point de vue de la compilation, les langages de programmation dans le monde peuvent être divisés en deux types suivants.

  1. Langage de type de compilateur Un langage qui permet à la CPU d'exécuter des programmes après la conversion du code source en un fichier de langage machine. Les langues typiques incluent Fortran, C et COBOL.

  2. Langue de type interprète Un langage qui permet au processeur d'exécuter les programmes tels quels sans convertir le code source en un fichier de langage machine. Les langages typiques incluent Perl, Ruby, PHP, etc.

  3. Besoin d'un petit supplément. Comme le CPU ne connaît que le langage machine, il doit quand même être converti en langage machine, par exemple, pour exécuter du code Python. C'est là qu'intervient "l'interpréteur". Cet interpréteur est Python dans cet exemple, mais le code Python est ligne par ligne.

--Lis --Convertir en langage machine

インタプリタ型言語.png

Ce qui est clair ici, c'est bien sûr le fait que les programmes doivent toujours être traduits en langage machine. La seule différence est de savoir si le code source est converti en un autre fichier par un moyen appelé "compilation" et exécuté par la CPU, ou s'il n'est pas converti et est exécuté directement par la CPU à l'aide d'un interpréteur (* 4).

** 3. Java est "compilé" deux fois! ?? ** **

Maintenant, voici l'introduction de Java. Quel processus Java passe du code source à l'exécution? java実行の大まかな流れ.png

La figure ci-dessus montre un flux simple, mais l'essentiel est que Java est "compilé" et exécuté deux fois. Il passe par un processus spécial avec d'autres langages de programmation, mais voici les détails:

  1. Conversion du code source en fichier de classe (1ère "compilation") Le compilateur Java (outil Javac) "compile" le code source dans un fichier de classe composé de code d'octets, c'est-à-dire un flux d'octets de 8 bits composé uniquement de 0 et de 1 (* 5). 第1回目コンパイル.png

  2. Du fichier de classe à l'exécution (2ème "compilation") Lorsque la machine virtuelle Java (JVM) lit ce fichier de classe et entre dans la phase d'exécution (* 6),

Un interpréteur et un compilateur (JIT) coexistent dans la JVM, et un programme Java est exécuté par une combinaison de deux fonctions: lecture ligne par ligne et conversion en langage machine, ou "compilation" dans une unité. Vous pouvez voir que cela a été fait. Il existe différentes options dans la JVM. Comme mentionné ci-dessus, vous pouvez demander à l'interpréteur de l'exécuter en premier puis d'appeler le compilateur JIT, ou vous pouvez demander au compilateur JIT de le compiler soudainement, ou vous pouvez combiner les deux de manière appropriée. Des options sont également disponibles (* 9). C'est une image d'en choisir une en fonction des exigences de performances. Pour plus de détails sur les options, voir 3. "Références / Références". Prière de se référer à.

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

** Quatre. en conclusion**

Qu'as-tu pensé? Je pense que vous pouvez imaginer que Java est compilé et exécuté deux fois. Pour résumer l'histoire jusqu'à présent,

Ce sera. Lorsque vous dites «compiler» Java, vous ne savez peut-être pas de quelle «compilation» il s'agit. Dans ce cas, j'espère que cet article sera utile pour la compréhension des lecteurs. D'autre part, la chose importante est, est commune dans tout langage de programmation, y compris Java, je ne pense pas que vous compreniez le mécanisme du moment où le programme est exécuté. En effet, lorsqu'on vous pose des questions sur la "compilation" Java, vous pouvez minimiser la confusion et, par extension, déterminer ce que c'est vraiment.

**Cinq. De côté **

Merci d'avoir lu jusqu'ici. J'ai décidé d'écrire cet article parce que j'ai lu l'explication du "compilateur JIT" dans le livre suivant. D'ailleurs, ce livre est également cité dans mon précédent post "L'utilisation du processeur à 100% est-elle mauvaise?". Veuillez vous y référer plus tard.

Écrit par Scott Oaks, traduit par Acroquest Technology Co., Ltd., traduit par Kao Terada, traduit par Satoshi Makino "Java Performance" publié par O'Reilly Japan https://www.oreilly.co.jp/books/9784873117188/

Au moment de 2018, je ne comprenais pas complètement ce qu'était le "compilateur JIT" et pensais que le "compilateur" Java était exactement ce qui convertissait le code source java en fichier de classe, donc le "compilateur JIT" de ce livre Je ne pouvais pas du tout comprendre cela même après avoir lu l'explication. Cependant, après de nombreuses recherches, j'ai remarqué qu'il avait été "compilé" deux fois, et j'ai trouvé un post pour partager cette prise de conscience.

Même ainsi, rien n'était plus difficile à faire un manuscrit que cette fois. Puisqu'il y a peu "d'études antérieures" jusqu'à présent, cela peut être disgracieux en raison de coups répétés contre le mur et de le surmonter ... mais nous l'améliorerons de temps en temps. .. À la prochaine. Même ainsi, la note de bas de page est devenue plus grande ... f (^^;)

note de bas de page

(* 1) Aussi appelé "langage machine" ou "code natif". Dans cet article, nous utiliserons le "langage machine". (* 2) 1. de "Citation / Reference Material". Il existe une explication détaillée du fonctionnement du processeur et des raisons pour lesquelles il doit être géré en binaire, veuillez donc vous y référer le cas échéant. En outre, 2. de "Citation / Reference Material". Veuillez également vous référer à la description facile à comprendre du fonctionnement de l'ordinateur. (* 3) Bien qu'il soit détaillé, quand il s'agit de la définition du terme «compiler», il est légèrement différent selon la littérature ou le site Web, par exemple s'il est simplement converti en langage machine ou s'il est converti sous une forme quelconque. Il semble. Dans cet article, le rôle de la conversion vers un autre format de fichier, que le compilateur jouait à l'origine dans divers langages de programmation, et la conversion en langage machine "fichier" du point de vue de la comparaison des langages de type interpréteur sont définis comme la compilation. (* 4) 3. de "Citation / Reference Material". Et 5. Comme vous pouvez le voir, dans un langage de type compilateur, un code efficace est exécuté en analysant et en optimisant le code source par le compilateur, tandis que dans un langage de type interpréteur, il est exécuté ligne par ligne, il s'agit donc d'un langage de type compilateur. Il a l'inconvénient d'être plus lent. En passant, j'ai résumé les caractéristiques des deux langues ci-dessous.

Langage de type de compilateur Langue de type interprète
Performance(Vitesse d'exécution) Relativement rapide Relativement lent
Charge de programmation Relativement large Relativement petite(Langage léger)
Portabilité Faible haute
type Fortran、COBOL、C、C++etc Perl, Ruby, PHP, Python, etc.

Au départ, j'ai utilisé C # comme langage de compilation, mais je l'ai supprimé. Cela est dû au fait que C # est converti en langage intermédiaire commun (CIL) et exécuté par le moteur d'exécution comme décrit dans «.NET Concept and Structure», ce qui est précis. C'est parce qu'il ne peut pas être positionné avec. Python est un langage interprété, mais il est "compilé" dans un fichier pyc comme décrit dans "Comment créer un fichier Python pyc [pour les débutants]". Puisqu'il est exécuté à partir de, il existe également des éléments ponctuels de chaque langage de type compilateur.

(* 5) La structure détaillée du fichier de classe est décrite au 6. de «Matériel de référence / de référence». , 7. Prière de se référer à. (* 6) Le fichier de classe n'est pas exécuté soudainement dans la JVM, mais est lu par le "sous-système de chargeur de classe", les informations sont affectées à la "zone de données d'exécution", puis dans le "moteur d'exécution". Exécuté par l'interpréteur, compilateur JIT. Pour plus de détails, voir 8. , 9. , 11. Prière de se référer à. (* 7) Malheureusement, en ce qui concerne la deuxième "compilation", quel type de format doit être spécifiquement abandonné, par exemple s'il faut le convertir en un fichier intermédiaire une fois, autre que le "matériel de référence / référence" mentionné dans cet article. , Divers sites, publications, etc. ont été vérifiés, mais n'ont pu être trouvés. Il semble qu'il n'est pas possible de publier car il est lié aux spécifications détaillées de la JVM, mais je suppose qu'une ou plusieurs classes, plusieurs octets de code d'octet, ou une unité spécifique, langage machine intermédiaire et temporaire " On pense qu'il est converti en "fichier" et chargé en mémoire. (* 8) Si vous exécutez la commande javap pour un fichier de classe spécifique, vous pouvez confirmer qu'il s'agit d'un système de langage d'assemblage. Pour plus de détails sur la commande javap, voir 6. ,Dix. Prière de se référer à. À propos, l'explication sur le langage d'assemblage se trouve dans 1. de "Citation / Reference Material". , 2. Prière de se référer à. (* 9) Le compilateur JIT peut être désactivé en définissant l'option "-Djava.compiler = NONE". Voir Désactiver JIT (https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.0.0/com.ibm.java.zos.70.doc/user/disjit.html).

** Citation / Matériel de référence **

  1. [Rédigé par Hisao Yazawa / Supervisé par Nikkei Software "Pourquoi les programmes fonctionnent-Vous devez connaître les connaissances de base des programmes-" 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. [Rédigé par Hisao Yazawa / Supervisé par Nikkei Software "Pourquoi les ordinateurs fonctionnent-ils - Connaissance de base du matériel et des logiciels que vous devez savoir -" 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. Écrit par Scott Oaks, traduit par Acroquest Technology Co., Ltd., traduit par Kao Terada, traduit par Satoshi Makino, "Java Performance", O'Reilly Japan

  4. TAKUYA-110 "Principes de base de la programmation" Blog Qiita

  5. [Revue technique du "Livre de démarrage Python" de Shingo Tsuji](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, "Comment lire les fichiers de classe Java pour les débutants" 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. et 2. Dans "Livre technique personnellement utile", 3. Est également mentionné dans "L'utilisation du processeur à 100% est-elle mauvaise?", donc s'il vous plaît vérifier.

Recommended Posts

De nos jours ... je ne savais pas que Java était "compilé" deux fois! (> <)
Je ne connaissais pas les bases de Python
Résumé des fonctions numpy que je ne connaissais pas
Je ne savais pas grand-chose sur les variables d'environnement Linux