SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
1
Java Avancé
Le langage Java
Rémi Forax
forax@univ-mlv.fr
2
Java Avancé
3
La technologie Java
En quelques mots :
● Orienté Objet
● Simple, Robuste, Dynamique et Sécurisé
● Indépendant de la Plateforme (VM)
● Semi Compilé/Semi Interprété
● Bibliothèque Importante (JDK API)
4
Java Aujourd'hui
3 environnements d'exécutions différents
● Java ME (Micro Edition) pour PDA, téléphone
● Java SE (Standard Edition) pour desktop
● Java EE (Entreprise Edition) pour serveur
Servlet/JSP/JSTL
Portlet/JSF
JTA/JTS, JDO/EJB
JavaMail, etc.
5
Java Aujourd'hui (2)
API du JDK 1.6 (~7000 classes) :
● java.lang, java.lang.reflect, java.lang.annotation
● java.util, java.util.prefs, java.util.concurrent
● java.awt, java.applet, javax.swing
● java.io, java.nio, java.net
● java.beans, java.sql, javax.sql
etc...
6
Java Standard Edition
● JDK 1.0 (1995)
● JDK 1.1 (1997)
● JDK 1.2 aka Java 2 (1999)
● JDK 1.3 (2001)
● JDK 1.4 (2002)
● JDK 1.5 aka Java 5 (2004)
● JDK 1.6 aka Java 6 (2006)
Compatibilitée ascendante
7
Java/OpenSource
● Java est OpenSource depuis novembre 2006
(2008 complètement)
● Toutes les sources sont disponibles :
http://www.openjdk.org
● N'importe qui peut contribuer, trouver des bugs,
etc.
● Install pour linux (ubuntu, fedora)
http://www.openjdk.org/install/
8
Papa et Maman de Java
SmallTalk :
● Tout est objet (même if)
● Machine Virtuelle
● Pas de déclaration de type
C/C++ :
● Ecriture du code {, /*, //
● Tout est structure (même la pile :)
9
Architecture en C
● Le code est compilé sous
forme objet relogeable
● L'éditeur de liens lie les
différentes bibliothèques
entre elles pour créer
l'exécutable
Editeur de lien
Compilateur
Plateforme + OS
Code en Ascii 010
010
010
010
010
10
Architecture en Java
● Le code est compilé dans un
code intermédiaire (byte-
code)
● La Machine Virtuelle charge
les classes et interprète le
code
Compilateur
Plateforme + OS
Code en Unicode 0xCaf
0xCaf
0xCaf
0xCaf
VM
API
0xCaf
0xCaf
11
Le byte-code
● Il assure la portabilité entre différents environnements
(machine/OS)
javac 0xCaf
0xCaf
0xCaf
0xCaf
bytecode
VM VM VM
WindowsLinuxMacOS
Et Solaris, HP-UX, BSD etc...
12
Fichiers sources et byte-code
● Habituellement, on sépare les fichier sources (dans
src) des fichiers binaire (dans classes)
13
Compilation simple
● Dans src
● Compiler avec la ligne suivante :
javac -d ../classes HelloWorld.java
crée le fichier
HelloWorld.class
dans classes
14
Exécution simple
● En remontant d'un répertoire
● Exécuter avec la ligne suivante :
java -classpath classes HelloWorld
● On indique où se trouve les fichiers binaires
(avec -classpath) ainsi que le nom de la classe qui
contient le main.
15
Compilation des sources
● Les sources sont compilés avec javac :
– -d destination répertoire des .class générés
(le compilateur crée les sous répertoires)
– -classpath/-cp fichiers .class et .jar dont dépendent les sources
– -sourcepath les fichiers sources
● Exemple :
javac -d classes -cp ../other/classes:lib/truc.jar
-sourcepath src src/fr/umlv/projet/Toto.java
16
Variable d'environnement
Java et certains programmes annexes utilisent les
variables d'environnement :
● CLASSPATH qui correspond aux répertoires des
classes
(valeur par défaut de -cp/-classpath si l'option n'est
pas présente)
● JAVA_HOME qui correspond au répertoire racine du
JDK (ant en à besoin !!)
17
Version du langage
● Gestion version de Java :
-source version [1.2, 1.3, 1.4, 1.5, 1.6]
-target version [1.2, 1.3, 1.4, 1.5, 1.6]
● Cela permet de compiler contre un JDK moins récent
● Toutes les combinaisons ne sont pas valides
Ex: -source 1.5 implique -target 1.5
18
Gestion des warnings
● Par défault, le compilateur indique qu'il y a des
warnings sans préciser lesquelles
● Il faut ajouter :
– -Xlint:deprecation affiche le code déprécié
(fonction existante à ne plus utiliser)
– -Xlint:unchecked affiche les cast non vérifiable à
l'exécution (cf generics)
– -Xlint:all demande tout les warnings
19
Autres Compilateurs
Trois compilateurs (Java -> bytecode)
● Javac (livré avec Java SDK)
● Jikes (écrit en C++, IBM)
● Eclipse (ex IBM)
Compilateur de Java vers code machine
● GCJ (GCC + frontend/backend Java)
● Excelsior JET
20
Machine Virtuelle
● Machine virtuelle :
– Garantie le même environnement d'exécution pour
différentes machines
(Write Once Run Anywhere)
– Surveille la où les applications lancées dans le but de les
optimiser en fonction de la machine
(comme un OS)
● Pas propre à Java, Perl, Python, Ruby, PHP
possèdent des machines virtuelles
21
Exécuter une classe
● On lance la VM avec la commande java
– -cp/-classpath locations des archives et .class
– -ea active les assertions
– -Dname=value change/ajoute une propriété au système
– -server demande des optimisation plus agressive
● Exemple :
java -cp classes:lib/truc.jar fr.umlv.projet.Toto
22
Paramètre de la VM
● Autres options de la VM :
– -Xint mode interpréter uniquement
– -Xbootclasspath
spécifie le chemin des classes de l'API
– -Xms taille initiale de la mémoire
– -Xmx taille maximale de la mémoire
● http://blogs.sun.com/roller/resources/watt/jvm-options-list.html
23
Autres Machine Virtuelle et JIT
Les machine virtuelles :
● Hotspot (SUN) pour Windows, Linux, Solaris et
Hotspot (Apple)
● JVM (IBM)
● JRockit (BEA)
(AOT: ahead of Time compiler)
● Kaffe, SableVM, Jikes RVM
● gij (avec GCJ)
24
Machine Virtuelle et Interprétation
● La machine virtuelle interprète le byte-code
● Un interpréteur :
– Tant qu'il y a des instructions
● On lit une instruction de byte-code
Ex: iadd
● On effectue l'opération correspondante
● Problème : facteur 1 à 1000 par rapport à du code
compilé en assembleur.
25
Le JIT (Just In Time)
● Pour améliorer les performances, lors de l'exécution, on
transforme le byte-code en code assembleur pour la
machine courante
– Avantage :
● Exécution, pas interprétation (très rapide)
● On adapter l'assembleur au processeur courant
(P4 si c'est un P4, Turion si c'est un Turion, etc.)
– Inconvénient :
● La transformation prend du temps (allocation des registres,
inlining, déroulement des boucles etc)
● Impossible de produire l'assembleur de tout le programme sans
exploser la mémoire
26
Un exemple
Mesure le temps passé dans la fonction de Fibonacci
(mal codée) :
public class JITExample {
private static int fibo(int n) {
if (n==0 || n==1)
return 1;
return fibo(n-1)+fibo(n-2);
}
private static long time(int n) {
long time=System.nanoTime();
for(int i=0;i<20;i++)
fibo(n);
long time2=System.nanoTime();
return time2-time;
}
public static void main(String[] args) {
for(int i=0;i<10;i++)
System.out.println(time(5));
}
}
On déclare les types
le plus près de là où
on les utilise
27
Un exemple (suite)
● Compilons avec javac
C:eclipseworkspacejava-avancésrc>dir
Répertoire de C:eclipseworkspacejava-avancésrc
19/07/2004 16:08 509 JITExample.java
1 fichier(s) 509 octets
C:eclipseworkspacejava-avancésrc>javac JITExample.java
C:eclipseworkspacejava-avancésrc>dir
Répertoire de C:eclipseworkspacejava-avancésrc
19/07/2004 16:12 650 JITExample.class
19/07/2004 16:08 509 JITExample.java
2 fichier(s) 1 159 octets
C:eclipseworkspacejava-avancésrc>
28
On exécute avec la VM
On utilise la commande java
C:eclipseworkspacejava-avancésrc>java JITExample
34082
32966
31568
31568
809041
61739
5867
5587
5587
5587
Expliquez les fluctuations de vitesse ?
29
Explication
● Le code est interprété un certain nombre de fois
puis transformé en code machine à l'aide du JIT
● Cette transformation à lieu en tâche de fond ce qui
ralenti l'exécution (au moins sur une machine
mono-processeur)
● Une fois généré, le code assembleur remplace le
code interprété ce qui accélère l'exécution
30
Explication (2)
●
L'option +PrintCompilation affiche la
transformation en code machine
C:eclipseworkspacejava-avancésrc15>java -XX:+PrintCompilation
JITExample
1 b java.lang.String::charAt (33 bytes)
32686
29054
28495
28774
2 b JITExample::fibo (25 bytes)
994260
61181
5587
...
31
Architecture en Java (revisité)
● Un chargeur de classe
(classloader)
● Un JIT
(transformation à la volée du byte-
code)
● Le Garbage Collector
(récupère les objets
non utilisés)
Plateforme + OS
0xCaf
0xCaf
0xCaf
0xCaf
VM
ClassLoader
API
0xCaf
0xCaf
JIT
GC
010
32
Java & Performance
● Même ordre de magnitude que le C ou le C++
(dépend de l'application)
● Théoriquement plus rapide car :
– Compilation à l'exécution donc :
● Optimisé en fonction de l'utilisation
● Optimisé en fonction du processeur réel
● Inline inter-bibliothèque
– GC est plus efficace que malloc/free !!
http://www.idiom.com/~zilla/Computer/javaCbenchmark.html
33
Archive java
● La commande jar permet de créer une archive (au
fromat ZIP) contenant les fichiers .class et les
ressources
● Une archive contient des méta-données stockées
dans un fichier manifest
● Créer une archive avec manifest :
cd classes
jar cvfm ../manifest ../archive.jar
34
Archive java
● La commande jar permet de créer une archive (au
fromat ZIP) contenant les fichiers .class et les
ressources
● Une archive contient des méta-données stockées
dans un fichier manifest
● Créer une archive avec manifest :
cd classes
jar cvfm ../manifest ../archive.jar
35
Désassembleur de bytecode
● Javap permet d'afficher les informations contenues
dans les fichiers de classes
– -classpath localisation des fichiers
– -public/-protected/-package/-private visibilité minimum
des membres affichés
– -c affiche le code en plus de la signature des méthodes
– -s affiche les types des membres suivants le format interne
de la VM
36
Exemple de javap
-bash-2.05b$ javap -classpath classes -c JITExample
public class JITExample extends java.lang.Object{
public JITExample();
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
0: iconst_0
1: istore_1
2: goto 18
5: getstatic #33; //Field
java/lang/System.out:Ljava/io/PrintStream;
8: iconst_5
9: invokestatic #37; //Method time:(I)J
12: invokevirtual #39; //Method java/io/PrintStream.println:
(J)V
15: iinc 1, 1
18: iload_1
19: bipush 10
21: if_icmplt 5
24: return
}
37
debugger/profileur
● Le debugger :
– jdb remplace la commande java, même ligne de commande
que java
– permet de lancer le debugger sur une machine différente
de la machine de production
● Le profiler :
– Utilise le système d'agent
– java -agentlib:hprof=[help]|[<option>=<value>, ...]
38
Autre outils autour de Java
● javadoc
génération de la doc automatique
● jstat, jconsole, jmap, jps, jinfo, jhat
monitoring de la machine virtuelle
● javah
génération header en C (interop avec C)
● keytool, policytool
gestion signature et sécurité
● rmiregistry, ordb, derby.jar (JavaDB)
Registry RMI, Orb CORBA, BD embarquée
39
Organisation d'un projet Java
● A la racine, un README et un build.xml
● Les sources (.java) sont dans le répertoire src
● Les fichiers de byte-code (.class) sont dans le
répertoire classes
● Les bibliothèques nécessaire (jar et so/dll en cas
de JNI) sont dans le répertoire lib
● La documentation dans docs, la javadoc dans
docs/api
40
Script ant
● Un script ant est l'équivalent d'un makefile pour les
projets java
● Ant utilise un fichier XML appelé build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="mon projet" default="compile"
basedir="."
<description>
Description du projet
</description>
<!-- déclaration des tâches -->
</project>
41
Script ant
● Les tâches ont la forme suivante
● Ant utilise un fichier XML appelé build.xml
● Chaque action est une balise XML dont les
attributs/élements sont spécifiques
<target name=”run” depends=”compile”>
<!-- action a effectuer -->
</target>
<javac srcdir=”src” destdir=”classes”
debug=”true”/>
42
Script ant
● Les tâches ont la forme suivante
● Ant utilise un fichier XML appelé build.xml
● Chaque action est une balise XML dont les
attributs/élements sont spécifiques
<target name=”run” depends=”compile.jar”>
<!-- action a effectuer -->
</target>
<javac srcdir=”src” destdir=”classes”
debug=”true”/>
43
Tâche ant : compilation
● La tâche javac à la forme suivante :
● En utilisant une liste de fichier :
<javac srcdir=”src” destdir=”classes”
debug=”true”>
<compilerarg value=”-Xlint:all”/>
</javac>
<javac srcdir=”src” destdir=”classes”
debug=”true”>
<compilerarg value=”-Xlint:all”/>
<fileset dir="${src}" includes="fr/umlv/monprojet//**/*.java"/>
</javac>
44
Tâche ant : exécution
● Pour exécuter des classes :
● Exécuter un jar :
● Pour exécuter dans une autre VM :
<java classpath=”classes”
classname=”fr.umlv.projet.Main”/>
<java jarfile=”projet.jar”/>
<java fork=”true” jarfile=”projet.jar”/>
45
Script ant : Paramétrage
● Les properties permettre de paramétré facilement un
fichier ant
<property name=”src.dir” location=”src”/>
<property name=”classes.dir” location=”classes”/>
<property name=”main” value=”fr.umlv.projet.Main”/>
<target name=”compile”>
<javac srcdir=”${src.dir}” destdir=”${classes.dir}”/>
</target>
<target name=”run” depends=””compile>
<java classpath=”${classes.dir}”
mainclass=”${main}”/>
</target>
46
IDE pour programmer en Java
Outils de développement visuels (IDE) :
● Eclipse (ex IBM)
● NetBeans (ex SUN)
● IDEA (IntelliJ)
47
Plateforme Java - En résumé
● Code portable (VM)
● Syntaxe du C mais objet
● Accès à la mémoire fortement contrôlé
(pas de pointeurs mais des références)
Libération automatique de la mémoire (GC)
● Transformation en code machine à la volée
● Exécution de morceaux de code en concurrence
● Introspection

Weitere ähnliche Inhalte

Was ist angesagt?

Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchTarek Halloul
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Jean-Michel Doudoux
 
Mender 2.0 101: Bien démarrer avec les 'update modules'
Mender 2.0 101: Bien démarrer avec les 'update modules'Mender 2.0 101: Bien démarrer avec les 'update modules'
Mender 2.0 101: Bien démarrer avec les 'update modules'Pierre-jean Texier
 
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...Pierre-jean Texier
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
Formation Linux lpi 101
Formation Linux lpi 101 Formation Linux lpi 101
Formation Linux lpi 101 Kais Baccour
 
Formation JAVA (1)
Formation JAVA (1)Formation JAVA (1)
Formation JAVA (1)Ahmed Charef
 
Java scripting api
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
 
Du Docker dans notre workflow de dev
Du Docker dans notre workflow de devDu Docker dans notre workflow de dev
Du Docker dans notre workflow de devKodo Kojo
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 

Was ist angesagt? (20)

Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuch
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Mender 2.0 101: Bien démarrer avec les 'update modules'
Mender 2.0 101: Bien démarrer avec les 'update modules'Mender 2.0 101: Bien démarrer avec les 'update modules'
Mender 2.0 101: Bien démarrer avec les 'update modules'
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...
Mises à jour logicielles en environnement Linux Embarqué, petit guide et tour...
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Introduction à Java
Introduction à JavaIntroduction à Java
Introduction à Java
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Formation Linux lpi 101
Formation Linux lpi 101 Formation Linux lpi 101
Formation Linux lpi 101
 
Formation JAVA (1)
Formation JAVA (1)Formation JAVA (1)
Formation JAVA (1)
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 
Du Docker dans notre workflow de dev
Du Docker dans notre workflow de devDu Docker dans notre workflow de dev
Du Docker dans notre workflow de dev
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
Outils de gestion de projets
Outils de gestion de projetsOutils de gestion de projets
Outils de gestion de projets
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 

Andere mochten auch

Andere mochten auch (20)

Préprocesseurs css
Préprocesseurs cssPréprocesseurs css
Préprocesseurs css
 
Installation et-configuration-d-un a175
Installation et-configuration-d-un a175Installation et-configuration-d-un a175
Installation et-configuration-d-un a175
 
LESS, Le CSS avancé
LESS, Le CSS avancéLESS, Le CSS avancé
LESS, Le CSS avancé
 
Dios mio
Dios mioDios mio
Dios mio
 
Inventive technologies " Les jeunes et la musique "
Inventive technologies   "  Les jeunes et la musique "Inventive technologies   "  Les jeunes et la musique "
Inventive technologies " Les jeunes et la musique "
 
Desde mi cruz
Desde mi cruzDesde mi cruz
Desde mi cruz
 
Iguazu
IguazuIguazu
Iguazu
 
et en plus elle peint !
et en plus elle peint !et en plus elle peint !
et en plus elle peint !
 
Citrus Designs
Citrus DesignsCitrus Designs
Citrus Designs
 
Programme
ProgrammeProgramme
Programme
 
Arte de poblete
Arte de pobleteArte de poblete
Arte de poblete
 
DGT
DGTDGT
DGT
 
Deco boites à chaussures - bricolage enfant
Deco boites à chaussures - bricolage enfantDeco boites à chaussures - bricolage enfant
Deco boites à chaussures - bricolage enfant
 
Con Un Angel
Con Un AngelCon Un Angel
Con Un Angel
 
El nuevo rol que deben asumir los SUJETOS de la EDUCACIÓN CATÓLICA en el s. XXI
El nuevo rol que deben asumir los SUJETOS de la EDUCACIÓN CATÓLICA en el s. XXIEl nuevo rol que deben asumir los SUJETOS de la EDUCACIÓN CATÓLICA en el s. XXI
El nuevo rol que deben asumir los SUJETOS de la EDUCACIÓN CATÓLICA en el s. XXI
 
Modèle bracelet elastique 6ans
Modèle bracelet elastique 6ansModèle bracelet elastique 6ans
Modèle bracelet elastique 6ans
 
Arenas
ArenasArenas
Arenas
 
El centrodelabiblia
El centrodelabibliaEl centrodelabiblia
El centrodelabiblia
 
Pres images 2ème extrait prose
Pres images 2ème extrait prosePres images 2ème extrait prose
Pres images 2ème extrait prose
 
Metrología jhohan cabrera
Metrología   jhohan cabreraMetrología   jhohan cabrera
Metrología jhohan cabrera
 

Ähnlich wie I le langage java d'una manière avancée introduction

Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeformationobjetdirect
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKJean-Michel Doudoux
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro javaAmel Morchdi
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Chap1_PresentationJava.pdf
Chap1_PresentationJava.pdfChap1_PresentationJava.pdf
Chap1_PresentationJava.pdfsayf7
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
Java-Introduction (1).pdf
Java-Introduction (1).pdfJava-Introduction (1).pdf
Java-Introduction (1).pdfKuateTanguy2
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !ochafik
 
Pluggable annotation processing api
Pluggable annotation processing apiPluggable annotation processing api
Pluggable annotation processing apiArnaud Tournier
 
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...Jérôme Petazzoni
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 

Ähnlich wie I le langage java d'una manière avancée introduction (20)

Objet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonomeObjet Direct Formation Java pour devenir autonome
Objet Direct Formation Java pour devenir autonome
 
Chap 02 poo en java
Chap 02 poo en javaChap 02 poo en java
Chap 02 poo en java
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
threads.pdf
threads.pdfthreads.pdf
threads.pdf
 
Rapport tp1 j2ee
Rapport tp1 j2eeRapport tp1 j2ee
Rapport tp1 j2ee
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
 
Java uik-chap1-intro java
Java uik-chap1-intro javaJava uik-chap1-intro java
Java uik-chap1-intro java
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Chap1_PresentationJava.pdf
Chap1_PresentationJava.pdfChap1_PresentationJava.pdf
Chap1_PresentationJava.pdf
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
Java-Introduction (1).pdf
Java-Introduction (1).pdfJava-Introduction (1).pdf
Java-Introduction (1).pdf
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
 
Pluggable annotation processing api
Pluggable annotation processing apiPluggable annotation processing api
Pluggable annotation processing api
 
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...
Docker : quels enjeux pour le stockage et réseau ? Paris Open Source Summit ...
 
Meetup PM2 @delicious-insights
Meetup PM2 @delicious-insightsMeetup PM2 @delicious-insights
Meetup PM2 @delicious-insights
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 

I le langage java d'una manière avancée introduction

  • 1. 1 Java Avancé Le langage Java Rémi Forax forax@univ-mlv.fr
  • 3. 3 La technologie Java En quelques mots : ● Orienté Objet ● Simple, Robuste, Dynamique et Sécurisé ● Indépendant de la Plateforme (VM) ● Semi Compilé/Semi Interprété ● Bibliothèque Importante (JDK API)
  • 4. 4 Java Aujourd'hui 3 environnements d'exécutions différents ● Java ME (Micro Edition) pour PDA, téléphone ● Java SE (Standard Edition) pour desktop ● Java EE (Entreprise Edition) pour serveur Servlet/JSP/JSTL Portlet/JSF JTA/JTS, JDO/EJB JavaMail, etc.
  • 5. 5 Java Aujourd'hui (2) API du JDK 1.6 (~7000 classes) : ● java.lang, java.lang.reflect, java.lang.annotation ● java.util, java.util.prefs, java.util.concurrent ● java.awt, java.applet, javax.swing ● java.io, java.nio, java.net ● java.beans, java.sql, javax.sql etc...
  • 6. 6 Java Standard Edition ● JDK 1.0 (1995) ● JDK 1.1 (1997) ● JDK 1.2 aka Java 2 (1999) ● JDK 1.3 (2001) ● JDK 1.4 (2002) ● JDK 1.5 aka Java 5 (2004) ● JDK 1.6 aka Java 6 (2006) Compatibilitée ascendante
  • 7. 7 Java/OpenSource ● Java est OpenSource depuis novembre 2006 (2008 complètement) ● Toutes les sources sont disponibles : http://www.openjdk.org ● N'importe qui peut contribuer, trouver des bugs, etc. ● Install pour linux (ubuntu, fedora) http://www.openjdk.org/install/
  • 8. 8 Papa et Maman de Java SmallTalk : ● Tout est objet (même if) ● Machine Virtuelle ● Pas de déclaration de type C/C++ : ● Ecriture du code {, /*, // ● Tout est structure (même la pile :)
  • 9. 9 Architecture en C ● Le code est compilé sous forme objet relogeable ● L'éditeur de liens lie les différentes bibliothèques entre elles pour créer l'exécutable Editeur de lien Compilateur Plateforme + OS Code en Ascii 010 010 010 010 010
  • 10. 10 Architecture en Java ● Le code est compilé dans un code intermédiaire (byte- code) ● La Machine Virtuelle charge les classes et interprète le code Compilateur Plateforme + OS Code en Unicode 0xCaf 0xCaf 0xCaf 0xCaf VM API 0xCaf 0xCaf
  • 11. 11 Le byte-code ● Il assure la portabilité entre différents environnements (machine/OS) javac 0xCaf 0xCaf 0xCaf 0xCaf bytecode VM VM VM WindowsLinuxMacOS Et Solaris, HP-UX, BSD etc...
  • 12. 12 Fichiers sources et byte-code ● Habituellement, on sépare les fichier sources (dans src) des fichiers binaire (dans classes)
  • 13. 13 Compilation simple ● Dans src ● Compiler avec la ligne suivante : javac -d ../classes HelloWorld.java crée le fichier HelloWorld.class dans classes
  • 14. 14 Exécution simple ● En remontant d'un répertoire ● Exécuter avec la ligne suivante : java -classpath classes HelloWorld ● On indique où se trouve les fichiers binaires (avec -classpath) ainsi que le nom de la classe qui contient le main.
  • 15. 15 Compilation des sources ● Les sources sont compilés avec javac : – -d destination répertoire des .class générés (le compilateur crée les sous répertoires) – -classpath/-cp fichiers .class et .jar dont dépendent les sources – -sourcepath les fichiers sources ● Exemple : javac -d classes -cp ../other/classes:lib/truc.jar -sourcepath src src/fr/umlv/projet/Toto.java
  • 16. 16 Variable d'environnement Java et certains programmes annexes utilisent les variables d'environnement : ● CLASSPATH qui correspond aux répertoires des classes (valeur par défaut de -cp/-classpath si l'option n'est pas présente) ● JAVA_HOME qui correspond au répertoire racine du JDK (ant en à besoin !!)
  • 17. 17 Version du langage ● Gestion version de Java : -source version [1.2, 1.3, 1.4, 1.5, 1.6] -target version [1.2, 1.3, 1.4, 1.5, 1.6] ● Cela permet de compiler contre un JDK moins récent ● Toutes les combinaisons ne sont pas valides Ex: -source 1.5 implique -target 1.5
  • 18. 18 Gestion des warnings ● Par défault, le compilateur indique qu'il y a des warnings sans préciser lesquelles ● Il faut ajouter : – -Xlint:deprecation affiche le code déprécié (fonction existante à ne plus utiliser) – -Xlint:unchecked affiche les cast non vérifiable à l'exécution (cf generics) – -Xlint:all demande tout les warnings
  • 19. 19 Autres Compilateurs Trois compilateurs (Java -> bytecode) ● Javac (livré avec Java SDK) ● Jikes (écrit en C++, IBM) ● Eclipse (ex IBM) Compilateur de Java vers code machine ● GCJ (GCC + frontend/backend Java) ● Excelsior JET
  • 20. 20 Machine Virtuelle ● Machine virtuelle : – Garantie le même environnement d'exécution pour différentes machines (Write Once Run Anywhere) – Surveille la où les applications lancées dans le but de les optimiser en fonction de la machine (comme un OS) ● Pas propre à Java, Perl, Python, Ruby, PHP possèdent des machines virtuelles
  • 21. 21 Exécuter une classe ● On lance la VM avec la commande java – -cp/-classpath locations des archives et .class – -ea active les assertions – -Dname=value change/ajoute une propriété au système – -server demande des optimisation plus agressive ● Exemple : java -cp classes:lib/truc.jar fr.umlv.projet.Toto
  • 22. 22 Paramètre de la VM ● Autres options de la VM : – -Xint mode interpréter uniquement – -Xbootclasspath spécifie le chemin des classes de l'API – -Xms taille initiale de la mémoire – -Xmx taille maximale de la mémoire ● http://blogs.sun.com/roller/resources/watt/jvm-options-list.html
  • 23. 23 Autres Machine Virtuelle et JIT Les machine virtuelles : ● Hotspot (SUN) pour Windows, Linux, Solaris et Hotspot (Apple) ● JVM (IBM) ● JRockit (BEA) (AOT: ahead of Time compiler) ● Kaffe, SableVM, Jikes RVM ● gij (avec GCJ)
  • 24. 24 Machine Virtuelle et Interprétation ● La machine virtuelle interprète le byte-code ● Un interpréteur : – Tant qu'il y a des instructions ● On lit une instruction de byte-code Ex: iadd ● On effectue l'opération correspondante ● Problème : facteur 1 à 1000 par rapport à du code compilé en assembleur.
  • 25. 25 Le JIT (Just In Time) ● Pour améliorer les performances, lors de l'exécution, on transforme le byte-code en code assembleur pour la machine courante – Avantage : ● Exécution, pas interprétation (très rapide) ● On adapter l'assembleur au processeur courant (P4 si c'est un P4, Turion si c'est un Turion, etc.) – Inconvénient : ● La transformation prend du temps (allocation des registres, inlining, déroulement des boucles etc) ● Impossible de produire l'assembleur de tout le programme sans exploser la mémoire
  • 26. 26 Un exemple Mesure le temps passé dans la fonction de Fibonacci (mal codée) : public class JITExample { private static int fibo(int n) { if (n==0 || n==1) return 1; return fibo(n-1)+fibo(n-2); } private static long time(int n) { long time=System.nanoTime(); for(int i=0;i<20;i++) fibo(n); long time2=System.nanoTime(); return time2-time; } public static void main(String[] args) { for(int i=0;i<10;i++) System.out.println(time(5)); } } On déclare les types le plus près de là où on les utilise
  • 27. 27 Un exemple (suite) ● Compilons avec javac C:eclipseworkspacejava-avancésrc>dir Répertoire de C:eclipseworkspacejava-avancésrc 19/07/2004 16:08 509 JITExample.java 1 fichier(s) 509 octets C:eclipseworkspacejava-avancésrc>javac JITExample.java C:eclipseworkspacejava-avancésrc>dir Répertoire de C:eclipseworkspacejava-avancésrc 19/07/2004 16:12 650 JITExample.class 19/07/2004 16:08 509 JITExample.java 2 fichier(s) 1 159 octets C:eclipseworkspacejava-avancésrc>
  • 28. 28 On exécute avec la VM On utilise la commande java C:eclipseworkspacejava-avancésrc>java JITExample 34082 32966 31568 31568 809041 61739 5867 5587 5587 5587 Expliquez les fluctuations de vitesse ?
  • 29. 29 Explication ● Le code est interprété un certain nombre de fois puis transformé en code machine à l'aide du JIT ● Cette transformation à lieu en tâche de fond ce qui ralenti l'exécution (au moins sur une machine mono-processeur) ● Une fois généré, le code assembleur remplace le code interprété ce qui accélère l'exécution
  • 30. 30 Explication (2) ● L'option +PrintCompilation affiche la transformation en code machine C:eclipseworkspacejava-avancésrc15>java -XX:+PrintCompilation JITExample 1 b java.lang.String::charAt (33 bytes) 32686 29054 28495 28774 2 b JITExample::fibo (25 bytes) 994260 61181 5587 ...
  • 31. 31 Architecture en Java (revisité) ● Un chargeur de classe (classloader) ● Un JIT (transformation à la volée du byte- code) ● Le Garbage Collector (récupère les objets non utilisés) Plateforme + OS 0xCaf 0xCaf 0xCaf 0xCaf VM ClassLoader API 0xCaf 0xCaf JIT GC 010
  • 32. 32 Java & Performance ● Même ordre de magnitude que le C ou le C++ (dépend de l'application) ● Théoriquement plus rapide car : – Compilation à l'exécution donc : ● Optimisé en fonction de l'utilisation ● Optimisé en fonction du processeur réel ● Inline inter-bibliothèque – GC est plus efficace que malloc/free !! http://www.idiom.com/~zilla/Computer/javaCbenchmark.html
  • 33. 33 Archive java ● La commande jar permet de créer une archive (au fromat ZIP) contenant les fichiers .class et les ressources ● Une archive contient des méta-données stockées dans un fichier manifest ● Créer une archive avec manifest : cd classes jar cvfm ../manifest ../archive.jar
  • 34. 34 Archive java ● La commande jar permet de créer une archive (au fromat ZIP) contenant les fichiers .class et les ressources ● Une archive contient des méta-données stockées dans un fichier manifest ● Créer une archive avec manifest : cd classes jar cvfm ../manifest ../archive.jar
  • 35. 35 Désassembleur de bytecode ● Javap permet d'afficher les informations contenues dans les fichiers de classes – -classpath localisation des fichiers – -public/-protected/-package/-private visibilité minimum des membres affichés – -c affiche le code en plus de la signature des méthodes – -s affiche les types des membres suivants le format interne de la VM
  • 36. 36 Exemple de javap -bash-2.05b$ javap -classpath classes -c JITExample public class JITExample extends java.lang.Object{ public JITExample(); 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); 0: iconst_0 1: istore_1 2: goto 18 5: getstatic #33; //Field java/lang/System.out:Ljava/io/PrintStream; 8: iconst_5 9: invokestatic #37; //Method time:(I)J 12: invokevirtual #39; //Method java/io/PrintStream.println: (J)V 15: iinc 1, 1 18: iload_1 19: bipush 10 21: if_icmplt 5 24: return }
  • 37. 37 debugger/profileur ● Le debugger : – jdb remplace la commande java, même ligne de commande que java – permet de lancer le debugger sur une machine différente de la machine de production ● Le profiler : – Utilise le système d'agent – java -agentlib:hprof=[help]|[<option>=<value>, ...]
  • 38. 38 Autre outils autour de Java ● javadoc génération de la doc automatique ● jstat, jconsole, jmap, jps, jinfo, jhat monitoring de la machine virtuelle ● javah génération header en C (interop avec C) ● keytool, policytool gestion signature et sécurité ● rmiregistry, ordb, derby.jar (JavaDB) Registry RMI, Orb CORBA, BD embarquée
  • 39. 39 Organisation d'un projet Java ● A la racine, un README et un build.xml ● Les sources (.java) sont dans le répertoire src ● Les fichiers de byte-code (.class) sont dans le répertoire classes ● Les bibliothèques nécessaire (jar et so/dll en cas de JNI) sont dans le répertoire lib ● La documentation dans docs, la javadoc dans docs/api
  • 40. 40 Script ant ● Un script ant est l'équivalent d'un makefile pour les projets java ● Ant utilise un fichier XML appelé build.xml <?xml version="1.0" encoding="UTF-8"?> <project name="mon projet" default="compile" basedir="." <description> Description du projet </description> <!-- déclaration des tâches --> </project>
  • 41. 41 Script ant ● Les tâches ont la forme suivante ● Ant utilise un fichier XML appelé build.xml ● Chaque action est une balise XML dont les attributs/élements sont spécifiques <target name=”run” depends=”compile”> <!-- action a effectuer --> </target> <javac srcdir=”src” destdir=”classes” debug=”true”/>
  • 42. 42 Script ant ● Les tâches ont la forme suivante ● Ant utilise un fichier XML appelé build.xml ● Chaque action est une balise XML dont les attributs/élements sont spécifiques <target name=”run” depends=”compile.jar”> <!-- action a effectuer --> </target> <javac srcdir=”src” destdir=”classes” debug=”true”/>
  • 43. 43 Tâche ant : compilation ● La tâche javac à la forme suivante : ● En utilisant une liste de fichier : <javac srcdir=”src” destdir=”classes” debug=”true”> <compilerarg value=”-Xlint:all”/> </javac> <javac srcdir=”src” destdir=”classes” debug=”true”> <compilerarg value=”-Xlint:all”/> <fileset dir="${src}" includes="fr/umlv/monprojet//**/*.java"/> </javac>
  • 44. 44 Tâche ant : exécution ● Pour exécuter des classes : ● Exécuter un jar : ● Pour exécuter dans une autre VM : <java classpath=”classes” classname=”fr.umlv.projet.Main”/> <java jarfile=”projet.jar”/> <java fork=”true” jarfile=”projet.jar”/>
  • 45. 45 Script ant : Paramétrage ● Les properties permettre de paramétré facilement un fichier ant <property name=”src.dir” location=”src”/> <property name=”classes.dir” location=”classes”/> <property name=”main” value=”fr.umlv.projet.Main”/> <target name=”compile”> <javac srcdir=”${src.dir}” destdir=”${classes.dir}”/> </target> <target name=”run” depends=””compile> <java classpath=”${classes.dir}” mainclass=”${main}”/> </target>
  • 46. 46 IDE pour programmer en Java Outils de développement visuels (IDE) : ● Eclipse (ex IBM) ● NetBeans (ex SUN) ● IDEA (IntelliJ)
  • 47. 47 Plateforme Java - En résumé ● Code portable (VM) ● Syntaxe du C mais objet ● Accès à la mémoire fortement contrôlé (pas de pointeurs mais des références) Libération automatique de la mémoire (GC) ● Transformation en code machine à la volée ● Exécution de morceaux de code en concurrence ● Introspection