Premiers pas avec les bases de Java

introduction

Ces dernières années, il y a eu de nombreuses écoles de programmation publicitaire telles que "Devenir ingénieur même si vous êtes inexpérimenté" ou "Devenir ingénieur même si vous êtes issu des arts libéraux", et j'ai été pris en charge par l'une d'entre elles lors de la formation de l'entreprise. Cependant, j'ai senti que l'accent n'était pas tant mis sur les «bases», probablement parce que le but était de créer une application dans un court laps de temps, donc je suis devenu un ** nouveau venu qui apprendra la programmation à partir de maintenant **. Je voulais écrire quelque chose qui servirait de passerelle vers les «bases» de Java, et pour ** les nouveaux ingénieurs comme moi qui estiment que les «bases» ne suffisent pas.

Qu'est-ce que "basique"?

Jusqu'à présent, le mot «basique» a été saisi.

Signification de Ki-so [Basic] La partie de base qui fait bouger quelque chose. À l'origine. "Parce que la base est solide, vous pouvez vous améliorer rapidement" "Consolider la base" "Connaissances de base"

Dans cette entrée, comme première étape pour apprendre les «bases» de Java

  1. Java et JVM
  2. Jusqu'à ce que Hello World! S'affiche

Je voudrais me concentrer sur ces deux.

Java et JVM

Tout d'abord, regardons le langage Java lui-même.

Java Avant cela, vérifions d'abord brièvement le langage de programmation lui-même.

Le programmeur utilise le langage de programmation pour envoyer des instructions à l'ordinateur. Cependant, les ordinateurs ne sont rien de plus que des ordinateurs électriques.

(En aparté, l'ordinateur s'appelle Rechner en allemand, mais il vient du verbe "calculer", rechnen. C'est vraiment un aparté.)

Il semble que les anciens programmeurs utilisaient les nombres binaires 0 et 1 pour écrire des programmes car les ordinateurs ne peuvent recevoir que deux signaux électriques, allumés ou éteints. À propos, celui composé de 0 et 1 est appelé ** langage machine **.

Il semble que les nombres binaires soient souvent écrits en nombres hexadécimaux car ils ont de nombreux chiffres, mais ils ne sont toujours pas conviviaux pour les humains. Par conséquent, un surnom (appelé «mnémonique») a été ajouté aux instructions représentées par le langage machine, et un «** langage d'assemblage **» a été créé.

Cependant, les programmes ne sont toujours pas faciles à comprendre pour les humains, et avec le temps, le nombre et la complexité des programmes requis ont augmenté. Par conséquent, une méthode d'écriture de programmes plus facile à comprendre pour les humains a été créée. (À propos, un langage de programmation facile à comprendre pour les humains est appelé un "langage de haut niveau", tandis qu'un langage facile à comprendre pour un ordinateur est appelé un "langage de bas niveau".)

Ce qui est facile à comprendre pour les humains signifie également qu'il est difficile à comprendre pour les ordinateurs. Il faut donc "convertir" le code écrit par le programmeur dans le langage machine pour que l'ordinateur puisse le comprendre. C'est le travail appelé "** compilation ", et celui qui le compile s'appelle " compiler **". Le compilateur traduit les programmes écrits dans des langages de haut niveau en quelque chose qu'un ordinateur peut comprendre, mais il compile pour cet ordinateur. Autrement dit, l'ordinateur dans un autre environnement ne peut pas comprendre le langage machine converti. Vous aurez donc besoin d'un autre compilateur pour cela.

C'est là que Java arrive enfin.

Java a été annoncé par Sun Microsystems en 1995. Java, qui est un langage de haut niveau, doit être compilé dans un langage machine comme je l'ai écrit précédemment, mais la différence avec les autres langages est qu'il utilise une machine virtuelle appelée ** JVM ** (Java Virtual Maschine). Il y a.

La JVM alloue de la mémoire sur votre ordinateur et démarre. Et comme vous pouvez exécuter le programme sur cette JVM, vous n'avez pas à vous soucier des différences entre les ordinateurs.

Pour être plus précis, Java est écrit de manière conviviale (le nom du fichier est hoge.java) et est converti en ce qu'on appelle un langage intermédiaire via la compilation (le nom du fichier est hoge.class. Le nom du langage intermédiaire est officiel. Il semble qu'il soit appelé ainsi pour des raisons de commodité, et il est correctement appelé ** code d'octet Java ). Ensuite, la JVM charge le langage intermédiaire, le convertit ligne par ligne en langage machine et l'exécute. Un programme qui convertit et exécute ligne par ligne de cette manière est appelé " interpréteur **" [^ 1].

[^ 1]: Alors que la compilation et le compilateur sont séparés selon la grammaire anglaise, l'interprète doit être divisé en interprète et interprète selon la grammaire anglaise, mais je me demande si la notation n'est pas divisée. ??

En d'autres termes, il y a deux étapes de conversion avant l'exécution de Java. (Conversion par compilateur et interpréteur)

JVM Il y avait des JDK et des JRE lors de la création de l'environnement Java. JDK est un kit de développement Java, un kit de développement logiciel requis lors du développement à l'aide de Java. Et ce qui est inclus dans ce JDK est le JRE (Java Runtime Environment), qui est appelé l'environnement d'exécution Java. Il s'agit d'un ensemble de logiciels qui vous permet d'exécuter des applications Java sur votre ordinateur, y compris des JVM.

La JVM se compose de threads et de mémoire. スクリーンショット 2019-04-07 16.45.37.png Un processus est défini dans le thread et exécute ce processus. La mémoire est divisée en tas et native. La zone de tas stocke les objets d'application et les garbage collection (GC) organisent régulièrement les objets qui ne sont plus nécessaires. La zone native est la zone utilisée par la JVM elle-même et stocke les informations traitées par le thread (pile de threads). Je voudrais expliquer un peu plus en détail, mais je vais manquer, alors je vais passer à autre chose.

Jusqu'à ce que Hello World! S'affiche

Jetons un coup d'œil rapide au processus menant à l'affichage final de Hello World!.

HelloWorld.java


public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Commençons par compiler. La commande ** javac ** compile un fichier java et crée un fichier de classe.

javac HelloWorld.java

Cela créera un fichier appelé HelloWorld.class. Présentons d'abord Hello World! Démarrez la JVM avec la commande ** java **, analysez et exécutez le fichier HelloWorld.class écrit en code octet Java.

$ java HelloWorld
Hello World!

C'est fait. Vérifions maintenant le code d'octet Java. Vous pouvez utiliser la commande ** javap ** pour convertir un fichier de classe dans un format lisible par l'homme.

$ javap -c HelloWorld
Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

classe publique À partir de HelloWorld, cette classe a deux fonctions, la première est le constructeur et la seconde est le bytecode de la fonction principale. Le code d'origine n'avait pas de constructeur, mais il semble être généré automatiquement. Regardons à l'intérieur de la fonction. Le code se compose de trois parties: «index: instruction #constant pool number». Un pool de constantes est une zone qui stocke des constantes et des symboles dans une machine virtuelle Java, mais jetons un œil. Vous pouvez vérifier en spécifiant l'option -v dans la commande javap.

Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // Hello World!
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // HelloWorld
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               HelloWorld.java
  #15 = NameAndType        #7:#8          // "<init>":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               Hello World!
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               HelloWorld
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V

Vérifions la fonction principale et voyons le déroulement de Hello World! Display.

public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

Tout d'abord, l'instruction getstatic se réfère au n ° 2. c'est #2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream; Vous pouvez voir que nous obtenons le champ à utiliser, java / lang / System.out.

L'instruction ldc suivante, qui charge les valeurs constantes du pool de constantes au moment de l'exécution. #3 = String #18 // Hello World! #18 = Utf8 Hello World! La chaîne Hello World! A été chargée ici.

Et l'instruction virtuelle d'invocation, #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V Exécutez la fonction println avec la chaîne de caractères précédente comme argument.

Enfin, retournez vide pour terminer. Merci pour votre travail acharné, Hello World! Est affiché.

en conclusion

J'ai essayé d'en faire quelque chose que je voulais savoir lorsque j'étudiais Java pour la première fois, mais il est difficile de l'écrire de manière concise et avec une bonne compréhension des principaux points. Ai-je vraiment envie de lire ce contenu il y a un peu moins d'un an? Cependant, j'espère que cet article a aidé quelqu'un. Si vous voulez apprendre les bases de Java avec cela comme opportunité, c'est le meilleur et le plus élevé. Et j'ai décidé d'étudier les bases de Java afin de pouvoir l'envoyer de cette manière.

Si vous faites une erreur, veuillez la signaler.

Recommended Posts

Premiers pas avec les bases de Java
Premiers pas avec Java Collection
Premiers pas avec Ruby pour les ingénieurs Java
Premiers pas avec DBUnit
Premiers pas avec Ruby
Introduction à Java à partir de 0 Partie 1
Premiers pas avec Swift
Premiers pas avec Doma-Transactions
Liens et mémos pour démarrer avec Java (pour moi-même)
Premiers pas avec Java 1 Assembler des éléments similaires
Premiers pas avec Kotlin à envoyer aux développeurs Java
Premiers pas avec JSP et servlet
Premiers pas avec Spring Boot
Premiers pas avec les modules Ruby
Les bases de Java
Les bases de Java
Premiers pas avec les anciens ingénieurs Java (Stream + Lambda)
Les bases de Java
Premiers pas avec Java_Chapitre 5_Exercices pratiques 5_4
[Google Cloud] Premiers pas avec Docker
Premiers pas avec Docker avec VS Code
Premiers pas avec Java et création d'un éditeur Ascii Doc avec JavaFX
Premiers pas avec Doma-Criteria API Cheet Sheet
Revenir au début, démarrer avec Java ② Instructions de contrôle, instructions de boucle
bases de la programmation Java
Premiers pas avec Docker pour Mac (installation)
Introduction au test de paramétrage dans JUnit
Premiers pas avec Ratpack (4) - Routage et contenu statique
Notions de base orientées objet (Java)
Démarrez avec le fonctionnement de JVM GC
Principes de base du traitement parallèle Java
Premiers pas avec Language Server Protocol avec LSP4J
Premiers pas avec la création d'ensembles de ressources avec ListResoueceBundle
Premiers pas avec le Machine Learning avec Spark "Price Estimate" # 1 Chargement des ensembles de données avec Apache Spark (Java)
Premiers pas avec Java_Chapter 8_A propos des "Instances" et des "Classes"
Premiers pas avec Doma-Using Projection avec l'API Criteira
Premiers pas avec les sous-requêtes utilisant Doma avec l'API Criteria
Premiers pas avec Doma-Using Joins avec l'API Criteira
Premiers pas avec Doma - Introduction à l'API Criteria
J'ai essayé de démarrer avec Gradle sur Heroku
Installez java avec Homebrew
Changer de siège avec Java
Téléchargement confortable avec JAVA
Bases de la programmation Java Practice-array
Changer java avec direnv
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Commencez avec Gradle
Muscle Java Basics Jour 1
Conversion Endian avec JAVA
Les utilisateurs Java expérimentés se lancent dans le développement d'applications Android
[Bases de Java] Créons un triangle avec une instruction for
Commencez avec Java sans serveur avec le framework léger Micronaut!
Revenir au début et démarrer avec Java ① Types de données et modificateurs d'accès
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java
Créer un multi-projet Java avec Gradle