CHAPITRE 1.2

La plateforme Java

Comprendre JVM, JRE, JDK et le cycle de compilation et d'exécution
Dans cette section, vous allez découvrir les composants fondamentaux de la plateforme Java : la JVM (Java Virtual Machine), le JRE (Java Runtime Environment) et le JDK (Java Development Kit). Vous apprendrez également comment fonctionne le cycle de compilation et d'exécution d'un programme Java, depuis le code source jusqu'à l'exécution finale. Cette compréhension est essentielle pour bien maîtriser Java et son environnement d'exécution.

1.2La plateforme Java

1.2.1 – JVM, JRE et JDK

Pour comprendre comment fonctionne Java, il est essentiel de connaître les trois composants principaux de la plateforme Java : la JVM (Java Virtual Machine), le JRE (Java Runtime Environment) et le JDK (Java Development Kit). Ces composants travaillent ensemble pour permettre le développement et l'exécution d'applications Java.

🖥️ La JVM (Java Virtual Machine)

La JVM (Java Virtual Machine) est le cœur de la plateforme Java. C'est une machine virtuelle qui exécute le bytecode Java.

Qu'est-ce que la JVM ?

La JVM est un programme qui :

  • Exécute le bytecode : Lit et exécute les fichiers .class (bytecode) générés par le compilateur Java
  • Gère la mémoire : Alloue et libère la mémoire automatiquement (Garbage Collector)
  • Fournit l'environnement d'exécution : Crée l'environnement nécessaire pour exécuter les programmes Java
  • Optimise le code : Utilise la compilation JIT (Just-In-Time) pour optimiser les performances
Important : La JVM est spécifique à chaque plateforme. Il existe une JVM pour Windows, une pour macOS, une pour Linux, etc. Cependant, le bytecode Java est le même pour toutes les plateformes. C'est ce qui permet la portabilité de Java !

Comment fonctionne la JVM ?

Le processus d'exécution par la JVM se déroule en plusieurs étapes :

  1. Chargement des classes : La JVM charge les fichiers .class nécessaires
  2. Vérification : Vérifie l'intégrité et la sécurité du bytecode
  3. Préparation : Prépare la mémoire pour les variables de classe
  4. Résolution : Résout les références symboliques
  5. Initialisation : Initialise les classes et les variables
  6. Exécution : Exécute le bytecode, éventuellement en le compilant en code machine natif (JIT)
Exemple concret :
Quand vous exécutez un programme Java avec la commande java MonProgramme, c'est la JVM qui :
  • Charge le fichier MonProgramme.class
  • Vérifie qu'il est valide
  • Crée l'environnement d'exécution
  • Exécute la méthode main()
  • Gère la mémoire pendant l'exécution

📦 Le JRE (Java Runtime Environment)

Le JRE (Java Runtime Environment) est l'environnement d'exécution Java. Il contient tout ce qui est nécessaire pour exécuter des applications Java, mais pas pour les développer.

Composants du JRE

  • JVM : La machine virtuelle Java
  • Bibliothèques de classes Java : Les classes standard de Java (java.lang, java.util, java.io, etc.)
  • Fichiers de configuration : Fichiers de propriétés et de configuration
  • Outils de support : Quelques outils utilitaires
Important : Le JRE ne contient PAS le compilateur Java (javac). Il ne permet que d'exécuter des programmes Java déjà compilés. Si vous voulez développer des applications Java, vous devez installer le JDK.

Quand utiliser le JRE ?

Le JRE est suffisant si vous voulez seulement :

  • Exécuter des applications Java : Lancer des programmes Java déjà compilés
  • Utiliser des applets Java : Exécuter des applets dans un navigateur (moins utilisé aujourd'hui)
  • Exécuter des applications tierces : Utiliser des logiciels développés en Java
Exemple d'utilisation du JRE :
Si vous téléchargez un logiciel développé en Java (comme Minecraft, IntelliJ IDEA, etc.), vous avez seulement besoin du JRE pour l'exécuter. Vous n'avez pas besoin du JDK car vous ne développez pas, vous utilisez simplement l'application.

🛠️ Le JDK (Java Development Kit)

Le JDK (Java Development Kit) est l'environnement de développement Java complet. Il contient tout ce qui est nécessaire pour développer et exécuter des applications Java.

Composants du JDK

Le JDK contient le JRE plus les outils de développement :

  • JRE complet : Tout ce qui est dans le JRE (JVM + bibliothèques)
  • Compilateur Java (javac) : Compile le code source (.java) en bytecode (.class)
  • Outils de développement :
    • javac : Compilateur Java
    • java : Lanceur d'applications Java
    • jar : Création et manipulation d'archives JAR
    • javadoc : Génération de documentation
    • jdb : Débogueur Java
    • javap : Désassembleur de bytecode
    • Et bien d'autres outils...
  • Bibliothèques de développement : API supplémentaires pour le développement
Relation JDK et JRE :
JDK = JRE + Outils de développement

Si vous installez le JDK, vous avez automatiquement le JRE inclus. Vous n'avez pas besoin d'installer les deux séparément.

Quand utiliser le JDK ?

Vous devez installer le JDK si vous voulez :

  • Développer des applications Java : Écrire et compiler du code Java
  • Compiler des programmes : Utiliser le compilateur javac
  • Utiliser des outils de développement : Utiliser javadoc, jar, jdb, etc.
  • Apprendre Java : Pour suivre ce cours, vous aurez besoin du JDK !

📊 Comparaison JVM, JRE et JDK

Composant Description Contient Utilisation
JVM Machine virtuelle Java Moteur d'exécution du bytecode Exécution des programmes
JRE Environnement d'exécution JVM + Bibliothèques Java Exécuter des applications
JDK Kit de développement JRE + Outils de développement (javac, etc.) Développer des applications

🔗 Relation entre JVM, JRE et JDK

🛠️
JDK
Java Development Kit
📦
JRE
Java Runtime Environment
🖥️
JVM
Java Virtual Machine
📚
Bibliothèques
Java Libraries
Outils de développement
⚙️ javac Compilateur
▶️ java Lanceur
📦 jar Archives
📖 javadoc Documentation
🐛 jdb Débogueur
🔍 javap Désassembleur
Hiérarchie des composants de la plateforme Java

💡 Points clés à retenir

  • JVM : Machine virtuelle qui exécute le bytecode Java
  • JRE : JVM + bibliothèques Java (pour exécuter des applications)
  • JDK : JRE + outils de développement (pour développer des applications)
  • Relation : JDK contient le JRE, qui contient la JVM
  • Pour développer : Vous devez installer le JDK
  • Pour exécuter seulement : Le JRE suffit
  • Portabilité : Le bytecode est le même sur toutes les plateformes, mais la JVM est spécifique à chaque plateforme
Conseil pratique : Pour suivre ce cours et développer en Java, vous devez installer le JDK. Ne vous inquiétez pas, nous verrons comment l'installer dans la section suivante (1.3.1) !

1.2.2 – Cycle de compilation et d'exécution

Comprendre le cycle de compilation et d'exécution d'un programme Java est fondamental. Ce processus transforme votre code source en un programme exécutable. Dans cette section, nous allons détailler chaque étape de ce cycle, depuis l'écriture du code source jusqu'à l'exécution finale.

🔄 Vue d'ensemble du cycle

Le cycle de développement Java suit ces étapes principales :

  1. Écriture du code source : Vous écrivez votre programme en Java (.java)
  2. Compilation : Le compilateur javac transforme le code source en bytecode (.class)
  3. Exécution : La JVM exécute le bytecode
✍️
Code source
Fichier .java
🔨
Compilation
Compilateur javac
📦
Bytecode
Fichier .class
▶️
Exécution
JVM
Cycle de compilation et d'exécution Java

✍️ Étape 1 : Écriture du code source

La première étape consiste à écrire votre programme Java dans un fichier avec l'extension .java.

Exemple de code source

Voici un exemple de code source Java simple :

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

Règles importantes

  • Nom du fichier : Le nom du fichier doit correspondre exactement au nom de la classe publique (avec la casse)
  • Extension : Le fichier doit avoir l'extension .java
  • Encodage : Utilisez l'encodage UTF-8 de préférence
Important : Si votre classe s'appelle HelloWorld, le fichier doit s'appeler HelloWorld.java (avec un H et un W majuscules). Java est sensible à la casse !

🔨 Étape 2 : Compilation

La compilation transforme le code source Java en bytecode. Cette étape est effectuée par le compilateur javac (Java Compiler).

Processus de compilation

Le compilateur javac effectue plusieurs opérations :

  1. Analyse lexicale : Découpe le code source en tokens (mots-clés, identifiants, opérateurs, etc.)
  2. Analyse syntaxique : Vérifie que la syntaxe est correcte selon les règles de Java
  3. Analyse sémantique : Vérifie la cohérence du code (types, portée des variables, etc.)
  4. Génération du bytecode : Produit le fichier .class contenant le bytecode

Commande de compilation

Pour compiler un fichier Java, utilisez la commande :

Syntaxe :

javac NomDuFichier.java

Exemple :

javac HelloWorld.java

Résultat de la compilation

Si la compilation réussit :

  • Fichier .class créé : Un fichier HelloWorld.class est généré
  • Bytecode : Ce fichier contient le bytecode (code intermédiaire)
  • Portable : Ce bytecode peut être exécuté sur n'importe quelle plateforme avec une JVM
Note : Le bytecode n'est pas du code machine natif. C'est un code intermédiaire qui sera interprété et/ou compilé par la JVM lors de l'exécution.

Erreurs de compilation

Si le code contient des erreurs, le compilateur affiche des messages d'erreur et ne génère pas de fichier .class :

Exemple d'erreur de compilation :

$ javac HelloWorld.java
HelloWorld.java:3: error: ';' expected
        System.out.println("Hello, World!")
                                              ^
1 error
Dans cet exemple, il manque un point-virgule à la fin de la ligne. Le compilateur indique précisément où se trouve l'erreur.

▶️ Étape 3 : Exécution

Une fois le bytecode généré, vous pouvez exécuter le programme avec la commande java (qui lance la JVM).

Commande d'exécution

Syntaxe :

java NomDeLaClasse

Exemple :

java HelloWorld

Résultat :

Hello, World!
Important : Notez que vous utilisez java (pas javac) pour exécuter, et vous ne mettez PAS l'extension .class ! Vous spécifiez seulement le nom de la classe.

Processus d'exécution par la JVM

Quand vous exécutez java HelloWorld, la JVM effectue ces étapes :

  1. Chargement de la classe : La JVM charge le fichier HelloWorld.class
  2. Vérification : Vérifie l'intégrité et la sécurité du bytecode
  3. Préparation : Prépare la mémoire (variables de classe, etc.)
  4. Résolution : Résout les références (autres classes, méthodes, etc.)
  5. Initialisation : Initialise les variables statiques et exécute les blocs statiques
  6. Exécution : Exécute la méthode main()

Compilation JIT (Just-In-Time)

Pendant l'exécution, la JVM peut compiler certaines parties du bytecode en code machine natif pour améliorer les performances :

  • Interprétation initiale : La JVM commence par interpréter le bytecode
  • Détection des "hot spots" : Identifie les parties de code fréquemment exécutées
  • Compilation JIT : Compile ces parties en code machine natif
  • Exécution optimisée : Exécute le code natif pour de meilleures performances
Performance : La compilation JIT permet à Java d'atteindre des performances proches des langages compilés comme C++, tout en gardant la portabilité du bytecode.

📋 Exemple complet du cycle

Voici un exemple complet du cycle de compilation et d'exécution :

1. Écriture du code source (HelloWorld.java) :

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

2. Compilation :

$ javac HelloWorld.java

Résultat : Création du fichier HelloWorld.class (bytecode)

3. Exécution :

$ java HelloWorld
Hello, World!

🔍 Différences importantes

javac vs java

Commande Rôle Extension Exemple
javac Compilateur .java javac HelloWorld.java
java Lanceur JVM (sans extension) java HelloWorld

💡 Points clés à retenir

  • Cycle en 3 étapes : Écriture → Compilation → Exécution
  • Code source : Fichier .java écrit par le développeur
  • Compilation : javac transforme .java en .class (bytecode)
  • Bytecode : Code intermédiaire portable, indépendant de la plateforme
  • Exécution : java lance la JVM qui exécute le bytecode
  • JIT Compilation : La JVM peut compiler le bytecode en code natif pour optimiser les performances
  • Portabilité : Le même bytecode fonctionne sur toutes les plateformes avec une JVM
Conseil pratique : Pour bien comprendre ce cycle, essayez de compiler et d'exécuter un programme Java simple. Dans la section suivante (1.4), nous créerons ensemble votre premier programme Java et suivrons tout ce cycle étape par étape !