Vue d’ensemble du Langage Java

Vue d'ensemble du Langage Java

Java est certainement un bon langage de programmation. Il ne fait aucun doute que c’est l’un des meilleurs langages disponibles pour les programmeurs sérieux.

La première version de Java apparue en 1996 a suscité un enthousiasme incroyable, non seulement dans la presse informatique, mais aussi dans les médias grand public tels que le New York Times, le Washington Post et BusinessWeek.

Java comme plate-forme de programmation

Le langage Java a beaucoup de fonctionnalités intéressantes que nous examinerons en détail plus loin dans cet article. Il a sa part de défauts, et certains des nouveaux ajouts au langage ne sont pas aussi élégants que les fonctionnalités d’origine en raison des exigences de compatibilité.

Java n’a jamais été qu’un langage. Il existe de nombreux langages de programmation, mais peu d’entre eux font beaucoup de bruit.

Java est une plate-forme complète, avec une énorme bibliothèque, contenant beaucoup de code réutilisable, et un environnement d’exécution qui fournit des services tels que la sécurité, la portabilité entre systèmes d’exploitation et le ramasse-miettes (Garbage collection).

En tant que programmeur, vous cherchez un langage avec une syntaxe agréable et une sémantique compréhensible (c’est-à-dire pas en C++). Java convient parfaitement, tout comme des douzaines d’autres langages de qualité.

Certaines langues vous donnent la portabilité, le ramasse-miettes, etc., mais elles n’ont pas beaucoup de bibliothèque, vous obligeant à compter sur vos efforts si vous voulez des graphiques attrayants ou un accès réseau ou base de données.

Eh bien, Java a tout – un bon langage, un environnement d’exécution de haute qualité et une vaste bibliothèque. Cette combinaison est ce qui fait de Java une proposition irrésistible pour tant de programmeurs.

Caractéristiques du langage Java

Java est un langage et un environnement de programmation qui a été conçu pour résoudre un certain nombre de problèmes dans la pratique moderne de la programmation.

Elle a commencé dans le cadre d’un projet plus vaste de développement de logiciels avancés pour l’électronique grand public.

Java est un langage de programmation simple, orienté objet, distribué, interprété, robuste, sécurisé, Neutre au niveau de l’architecture, portable, performant, multi-thread, et dynamique.

Java est un langage de programmation simple

La syntaxe pour Java est, en effet, une version nettoyée de la syntaxe du lanage de programmation C++.

Il n’y a pas besoin de fichiers d’en-tête, d’arithmétique de pointeur (ou même d’une syntaxe de pointeur), de structures, d’unions, de surcharge des opérateurs, de classes de base virtuelle, etc.

Les concepteurs n’ont cependant pas essayé de corriger toutes les fonctionnalités maladroites du C++. Par exemple, la syntaxe de l’instruction switch est inchangée en Java. Si vous connaissez C++, vous trouverez la transition vers la syntaxe Java facile.

Au moment de la sortie de Java, C++ n’était pas le langage de programmation le plus couramment utilisé. Beaucoup de développeurs ont utilisé Visual Basic et son environnement de programmation drag-and-drop.

Ces développeurs n’ont pas trouvé Java simple. Il a fallu plusieurs années pour que les environnements de développement Java rattrapent leur retard. De nos jours, les environnements de développement Java sont bien en avance sur ceux de la plupart des autres langages de programmation.

Un autre aspect de la simplicité est d’être petit. L’un des objectifs de Java est de permettre la construction de logiciels capables de fonctionner de manière autonome sur de petites machines.

La taille de l’interpréteur de base et du support de classe est d’environ 40K ; les bibliothèques standard de base et le support des threads (essentiellement un micro-noyau autonome) ajoutent 175K supplémentaires.

C’était une grande réussite à l’époque. Bien sûr, la bibliothèque s’est développée au fil des années dans des dimensions énormes. Il existe maintenant une version séparée de Java Micro Edition avec une bibliothèque plus petite, adaptée aux appareils embarqués.

Java est un langage de programmation orienté objet

En termes simples, la conception orientée objet est une technique de programmation qui met l’accent sur les données – les objets – et sur les interfaces avec ces objets.

Pour faire une analogie avec la charpenterie, un charpentier “orienté objet” s’occuperait surtout de la chaise qu’il construit, et accessoirement des outils utilisés pour la fabriquer. Un charpentier “non orienté objet” penserait principalement à ses outils. Les fonctionnalités orientées objet de Java sont essentiellement celles du C++.

L’orientation objet était assez bien établie lorsque Java a été développé. Les fonctionnalités orientées objet de Java sont comparables à celles de C++.

La différence majeure entre Java et C++ réside dans l’héritage multiple, que Java a remplacé par un concept plus simple d’interfaces. Java a une capacité d’introspection d’exécution plus riche que le C++.

Java est un langage de programmation distribué

Java dispose d’une vaste bibliothèque de routines pour faire face aux protocoles TCP/IP tels que HTTP et FTP. Les applications Java peuvent ouvrir et accéder à des objets sur le Net via des URLs avec la même facilité que lors de l’accès à un système de fichiers local.

De nos jours, on tient cela pour acquis, mais en 1995, la connexion à un serveur Web à partir d’un programme C++ ou Visual Basic était une lourde tâche.

Java est un langage de programmation robuste

Java est destiné à écrire des programmes qui doivent être fiables de différentes manières. Java met beaucoup de soin à la vérification anticipée des problèmes éventuels, à la vérification dynamique (runtime) ultérieure et à l’élimination des situations sujettes aux erreurs.

La plus grande différence entre Java et C/C+++ est que Java a un modèle de pointeur qui élimine la possibilité d’écraser la mémoire et de corrompre les données.

Le compilateur Java détecte de nombreux problèmes qui, dans d’autres langages, n’apparaîtraient qu’au moment de l’exécution.

Quant au deuxième point, quiconque a passé des heures à poursuivre la défaillance de la mémoire causée par un bogue de pointeur sera très satisfait de cet aspect de Java.

Java est un langage de programmation sécurisé

Java est destiné à être utilisé dans des environnements réseau/distribués. À cette fin, l’accent a été mis sur la sécurité. Java permet la construction de systèmes sans virus, systèmes auto-protégés.

Dès le début, Java a été conçu pour rendre certains types d’attaques impossibles, parmi eux :

  • Dépassement de la pile d’exécution – une attaque courante des vers et des virus
  • Corruption de la mémoire en dehors de son propre espace de processus
  • Lecture ou écriture de fichiers sans permission

A l’origine, l’attitude de Java à l’égard du code téléchargé était “Bring it on !”. Le code non fiable a été exécuté dans un environnement sandbox où il ne pouvait pas avoir d’impact sur le système hôte.

Les utilisateurs étaient assurés que rien de mal ne pouvait arriver parce que le code Java, peu importe d’où il venait, ne pouvait jamais s’échapper du bac à sable (sandbox).

Cependant, le modèle de sécurité de Java est complexe. Peu de temps après la livraison de la première version du Java Development Kit, un groupe d’experts en sécurité de l’Université de Princeton a découvert des bogues subtils qui permettaient au code non fiable d’attaquer le système hôte.

Au départ, les bogues de sécurité ont été corrigés rapidement. Malheureusement, avec le temps, les pirates informatiques sont devenus assez doués pour repérer les failles subtiles dans la mise en œuvre de l’architecture de sécurité. Sun, puis Oracle, ont eu du mal à suivre les corrections de bogues.

Après un certain nombre d’attaques très médiatisées, les vendeurs de navigateurs et Oracle sont devenus de plus en plus prudents. Les plug-ins du navigateur Java ne font plus confiance au code distant à moins qu’il ne soit signé numériquement et que les utilisateurs aient accepté son exécution.

Même si, rétrospectivement, le modèle de sécurité Java n’a pas connu le succès escompté, Java était très en avance sur son temps.

Un mécanisme de livraison de code concurrent de Microsoft s’appuyait uniquement sur les signatures numériques pour des raisons de sécurité.

De toute évidence, ce n’était pas suffisant: Comme n’importe quel utilisateur des produits Microsoft peut le confirmer, les programmes de fournisseurs renommés s’écrasent et créent des dommages.

Java est un langage de programmation neutre au niveau de l’architecture

Le compilateur génère un format de fichier objet neutre du point de vue de l’architecture du processeurs exécutant le code Java. Le code compilé est exécutable sur de nombreux processeurs, étant donné la présence du système d’exécution Java.

Le compilateur Java le fait en générant des instructions de bytecode qui n’ont rien à voir avec une architecture informatique particulière. Ils sont plutôt conçus pour être à la fois faciles à interpréter sur n’importe quelle machine et faciles à traduire en code machine natif à la volée.

Générer du code pour une “machine virtuelle” n’était pas une idée nouvelle à l’époque. Les langages de programmation tels que Lisp, Smalltalk et Pascal utilisaient cette technique depuis de nombreuses années.

Bien sûr, l’interprétation des instructions de la machine virtuelle est plus lente que l’exécution des instructions de la machine à pleine vitesse. Cependant, les machines virtuelles ont la possibilité de traduire les séquences de bytecodes les plus fréquemment exécutées en code machine – un processus appelé compilation juste-à-temps (just-in-time).

La machine virtuelle de Java a un autre avantage. Il augmente la sécurité parce qu’il peut vérifier le comportement des séquences d’instructions.

Java est un langage de programmation portable

Contrairement au C et au C++, il n’y a pas d’aspects “dépendants de l’implémentation” de la spécification. Les tailles des types de données primitives sont spécifiées, ainsi que le comportement de l’arithmétique sur celles-ci.

Par exemple, un int en Java est toujours un entier 32 bits. En C/C++, int peut signifier un entier de 16 bits, un entier de 32 bits, ou toute autre taille que le compilateur peut préférer.

La seule restriction est que le type int doit avoir au moins autant d’octets qu’un int court et ne peut pas avoir plus d’octets qu’un int long. Le fait d’avoir une taille fixe pour les types numériques élimine un casse-tête majeur de portabilité.

Les données binaires sont stockées et transmises dans un format fixe, ce qui élimine toute confusion quant à l’ordre des octets. Les chaînes sont sauvegardées dans un format Unicode standard.

Les bibliothèques qui font partie du système définissent les interfaces portables. Par exemple, il existe une classe Window abstraite et ses implémentations pour UNIX, Windows et Macintosh.

L’exemple d’une classe Window a peut-être été mal choisi. Comme tous ceux qui ont déjà essayé le savent, c’est un effort héroïque de mettre en œuvre une interface utilisateur qui semble bonne sur Windows, Macintosh, et les dix variétés d’UNIX.

Java 1.0 a fait l’effort héroïque, fournissant une boîte à outils simple qui fournissait des éléments d’interface utilisateur sur un certain nombre de plateformes. Malheureusement, le résultat était une bibliothèque qui, avec beaucoup de travail, pouvait à peine donner des résultats acceptables sur différents systèmes.

Cette trousse d’outils de l’interface utilisateur initiale a été remplacée pas mal, de fois, et la transférabilité d’une plate-forme à l’autre demeure un problème.

Cependant, pour tout ce qui n’est pas lié aux interfaces utilisateur, les bibliothèques Java font un excellent travail en vous permettant de travailler de manière indépendante de la plate-forme.

Vous pouvez travailler avec des fichiers, des expressions régulières, XML, des dates et heures, des bases de données, des connexions réseau, des threads, etc. sans vous soucier du système d’exploitation sous-jacent.

Non seulement vos programmes sont portables, mais les API Java sont souvent de meilleure qualité que les API natives.

Java est un langage de programmation interprété

L’interpréteur Java peut exécuter des bytecodes Java directement sur toute machine sur laquelle il a été installé. Puisque la création de liens (linking) est un processus plus progressif et plus léger, le processus de développement peut être beaucoup plus rapide et exploratoire.

Quiconque a utilisé Lisp, Smalltalk, Visual Basic, Python, R ou Scala sait ce qu’est un processus de développement “rapide et exploratoire”. Vous essayez quelque chose, et vous voyez instantanément le résultat.

Pendant les 20 premières années d’existence de Java, les environnements de développement n’étaient pas axés sur cette expérience. Ce n’est qu’à partir de Java 9 que l’outil Jshell a permis une programmation rapide et exploratoire.

Java est un langage de programmation performant

Bien que la performance des bytecodes interprétés soit généralement plus qu’adéquate, il y a des situations où une performance supérieure est requise. Les bytecodes peuvent être traduits à la volée (au moment de l’exécution) en code machine pour le CPU particulier sur lequel l’application est en cours d’exécution.

Dans les premières années de Java, de nombreux utilisateurs n’étaient pas d’accord avec l’affirmation selon laquelle la performance était “plus qu’adéquate”.

Aujourd’hui, cependant, les compilateurs juste-à-temps sont devenus si bons qu’ils sont concurrentiels par rapport aux compilateurs traditionnels et, dans certains cas, surpassent même leurs performances parce qu’ils disposent de plus d’informations.

Par exemple, un compilateur juste-à-temps peut surveiller quel code est exécuté fréquemment et optimiser la vitesse de ce code. Une optimisation plus sophistiquée est l’élimination (ou “inlining”) des appels de fonction. Le compilateur juste-à-temps sait quelles classes ont été chargées.

Il peut utiliser l’inlining lorsque, sur la base de la collection de classes actuellement chargée, une fonction particulière n’est jamais surchargée, et il peut annuler cette optimisation ultérieurement si nécessaire.

Java est un langage de programmation multithread

Les avantages du multithreading sont une meilleure réactivité interactive et un comportement en temps réel. De nos jours, nous nous soucions de la concurrence parce que la loi de Moore a pris fin.

Au lieu d’avoir des processeurs plus rapides, nous en avons plus, et nous devons les garder occupés. Pourtant, lorsqu’on regarde la plupart des langages de programmation, on constate une indifférence choquante à l’égard de ce problème.

Java était en avance sur son temps. C’était le premier langage grand public à soutenir la programmation simultanée. A l’époque, les processeurs multicœurs étaient exotiques, mais la programmation web venait juste de commencer, et les processeurs passaient beaucoup de temps à attendre une réponse du serveur.

Une programmation simultanée était nécessaire pour s’assurer que l’interface utilisateur ne gèle pas. La programmation simultanée n’est jamais facile, mais Java a fait un très bon travail en la rendant gérable.

Java est un langage de programmation dynamique

De plusieurs façons, Java est un langage plus dynamique que C ou C++. Il a été conçu pour s’adapter à un environnement en évolution.

Les bibliothèques peuvent librement ajouter de nouvelles méthodes et variables d’instance sans aucun effet sur leurs clients. En Java, la recherche des informations de type exécution est très simple.

C’est une caractéristique importante dans les situations où le code doit être ajouté à un programme en cours d’exécution. Un bon exemple est le code qui est téléchargé à partir d’Internet pour fonctionner dans un navigateur.

En C ou C++, c’est en effet un défi majeur, mais les concepteurs Java étaient bien conscients des langages dynamiques qui permettaient de faire évoluer facilement un programme en cours d’exécution. Leur réalisation a été d’introduire cette fonctionnalité dans un langage de programmation grand public.

Peu après le succès initial de Java, Microsoft a lancé un produit appelé J++ avec un langage de programmation et une machine virtuelle qui étaient presque identiques à Java.

Cet effort n’a pas réussi à gagner de la traction, et Microsoft a suivi avec un autre langage appelé C# qui a aussi beaucoup de similitudes avec Java mais fonctionne sur une machine virtuelle différente.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here