Historique, définition et syntaxe principale, plate-forme : l'essentiel de ce qu'il faut savoir en un coup d'oeil.

Apparu au milieu des années 90, le langage Java a rapidement su devenir l'un des grands langages sur lesquels se repose les entreprises et les projets complexes. Combinant robustesse, portabilité et sécurité, c'est également devenu le chantre de la programmation orientée Objet, pourtant inventée bien avant.

Reprenant le meilleur de certains langages et apportant ses propres innovations, Java a rapidement vu sa suprématie s'exercer sur de nombreux types de projets et systèmes, au point d'être en grande partie copié par C#, le principal langage de la plate-forme .Net de Microsoft. Les deux plates-formes sont aujourd'hui en coude à coude en matière de fonctionnalités, mais Java conserve son avance historique.

Secoué par les attaques de .Net et le succès grandissant des langages de scripts (PHP, Perl, Ruby), Java continue d'évoluer et de s'adapter aux demandes des développeurs et du marché. Java 6 promet de s'ouvrir aux autres langages, et de parfaire le "Write Once, Run Anywhere" qu'il promeut depuis 10 ans déjà.

Le livre blanc décrivant Java, publié par James Gosling et Henry McGilton en mai 1996, indique que le langage s'inspire des avancées de Smalltalk, Eiffel, Objective C et Cedar/Mesa, et se concentre sur 5 objectifs :

Etre simple, orienté Objet et syntaxiquement familier Etre robuste et sécurisé Avoir une architecture neutre, et être portable Avoir de hautes performances Etre interprété et disposer de processus légers (multithreading) Java répond au premier en proposant des principes fondamentaux rapidement compréhensibles. Le langage est conçu dès le départ comme étant orienté Objet, par le biais d'une large bibliothèque d'objets directement exploitables. Enfin, la syntaxe est aussi proche que nécessaire de celle de C++, pour faciliter la migration des développeurs.

La robustesse voulue par le second objectif est atteinte par les nombreux tests réalisés lors de la compilation, et une gestion de la mémoire très stricte, sans pointeurs explicites ni arithmétiques, et avec un ramasse-miettes. La sécurité est assurée par la plate-forme, qui interdit à toute application d'être atteinte par un programme tiers.

Java a été conçu dès le départ pour fonctionner au sein d'environnements hétérogènes. Le compilateur résout cela en produisant des bytes-codes, un format intermédiaire de programme, et qui seront interprétés par une machine virtuelle spécifique à chaque système. C'est cette JVM (Java Virtual Machine) qui assure donc la portabilité du code Java.

Les performances de Java ne seront jamais comparables à celles des compilateurs natifs, mais les concepts de compilateurs JIT (Just In Time) autorisent des vitesses plus qu'honorables.

Java est avant tout un langage interprété, mais également compilé : les fichiers sources sont compilés en bytes-codes, qui eux-mêmes sont interprétés par la JVM de chaque machine. La plate-forme gère le multithreading directement depuis le langage, grâce à la classe Thread. Cette simplicité de gestion des threads qui est l'une des raisons du succès de Java côté serveurs.

Le langage Java se reconnaît avant tout par sa syntaxe, volontairement très proche de celle de C : il en reprend les opérateurs (, +=, !=, ...), le principe des accolades pour délimiter un bloc de code, les structures de contrôle...

Java introduit notamment ses propres mots-clefs, à commencer par l'opérateur new pour instancier un objet à partir d'une classe.

La syntaxe Java est reconnaissable même dans sa forme la plus simple, car le langage requiert nombre de mots-clefs pour valider la pureté du fonctionnement Objet. Un simple "Hello World", simple et rapide avec Perl ou Python, prend ainsi une tout autre dimension en Java : fichier HelloMonde.java

public class HelloMonde {

 public static void main(String args) { 
   System.out.println("Hello, toute la terre !"); 
   } 
 }

Ainsi, même un grand débutant en Java devra connaître les implications de chaque mot-clef pour comprendre le fonctionnement du langage. La première ligne suppose de connaître ce qu'est une classe Java, la correspondance obligatoire nom de la classe/nom du fichier .java, et la signification des modificateurs d'accès (public, private, protected)... La seconde ligne ajoute aux modificateurs d'accès les champs (final et static, mais aussi transcient et volatile), les valeurs de renvoi d'une méthode (void, mais également toutes les classes disponibles), l'importance de la méthode main() d'une classe, la gestion des arguments d'une méthode et le fonctionnement d'un tableau, le type String() (chaîne)... La troisième ligne de code, enfin, implique de connaître la méthode println() du flux out de la classe System(), ce flux étant lui-même une occurrence de la classe PrintStream()...

On notera donc que la simplicité voulue par les créateurs du langage, laisse la place aux besoins du fonctionnement Objet et du typage strict de la plate-forme.

Le langage Java n'est pas compilé pour une machine comme le serait un programme C++. Au lieu de cela, chaque classe est compilée en byte-code, qui sera interprété de la même manière par chaque version spécifique de la plate-forme, que ce soit une version Windows que Mac ou Linux (dans les limites d'une implémentation correcte).

Java, "le langage", repose donc entièrement sur Java, "la plate-forme". Celle-ci correspond véritablement à un environnement de développement, apportant à tout programme le jeu de bibliothèques que lui est nécessaire. Un programme Java est lancé au sein d'une machine virtuelle, gérée par la plate-forme. Celle-ci se décompose en trois versions : JSE pour les applications standard, JEE pour les applications "entreprise" (les classes de JSE, les classes spécifiques aux serveurs et aux traitements SQL, XML et services Web), et JME, une version optimisée pour systèmes mobiles.

La machine virtuelle exécute donc les byte-codes produits par le compilateur Java. Ce composant central de la plate-forme est le coeur de la portabilité d'une programme Java : chaque version de la plate-forme créée une JVM identique malgré les différences du système, permettant aux byte-codes de se lancer toujours de la même manière - d'où l'adage Java "Write Once, Run Everywhere" ("Ecrire une fois, exécuter partout").