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
Comment fonctionne la JVM ?
Le processus d'exécution par la JVM se déroule en plusieurs étapes :
- Chargement des classes : La JVM charge les fichiers .class nécessaires
- Vérification : Vérifie l'intégrité et la sécurité du bytecode
- Préparation : Prépare la mémoire pour les variables de classe
- Résolution : Résout les références symboliques
- Initialisation : Initialise les classes et les variables
- Exécution : Exécute le bytecode, éventuellement en le compilant en code machine natif (JIT)
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
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
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 Javajava: Lanceur d'applications Javajar: Création et manipulation d'archives JARjavadoc: Génération de documentationjdb: Débogueur Javajavap: Désassembleur de bytecode- Et bien d'autres outils...
- Bibliothèques de développement : API supplémentaires pour le développement
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
💡 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
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 :
- Écriture du code source : Vous écrivez votre programme en Java (.java)
- Compilation : Le compilateur javac transforme le code source en bytecode (.class)
- Exécution : La JVM exécute le bytecode
✍️ É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!");
}
}
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
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 :
- Analyse lexicale : Découpe le code source en tokens (mots-clés, identifiants, opérateurs, etc.)
- Analyse syntaxique : Vérifie que la syntaxe est correcte selon les règles de Java
- Analyse sémantique : Vérifie la cohérence du code (types, portée des variables, etc.)
- 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.classest 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
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
▶️ É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!
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 :
- Chargement de la classe : La JVM charge le fichier HelloWorld.class
- Vérification : Vérifie l'intégrité et la sécurité du bytecode
- Préparation : Prépare la mémoire (variables de classe, etc.)
- Résolution : Résout les références (autres classes, méthodes, etc.)
- Initialisation : Initialise les variables statiques et exécute les blocs statiques
- 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
📋 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 :
javactransforme .java en .class (bytecode) - Bytecode : Code intermédiaire portable, indépendant de la plateforme
- Exécution :
javalance 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