Introduction aux scripts en Java, partie 1

Extrait de Scripting in Java: Languages, Frameworks, and Patterns .

Par Dejan Bosanac

Edité par Addison Wesley Professional

ISBN-10: 0-321-32193-6

ISBN-13: 978-0-321-32193-0

Jusqu'à récemment, seuls les hardcore étaient enthousiasmés par les scripts sur la plate-forme Java, mais c'était avant que Sun ne renforce le support du JRE pour les langages à typage dynamique tels que Python, Ruby et JavaScript. Dans cet extrait en deux parties du prochain Scripting in Java: Languages, Frameworks, and Patterns (Addison Wesley Professional, août 2007) Dejan Bosanac précise ce qui différencie la plupart des langages de script d'un langage de programmation comme Java, puis explique pourquoi le script est un un ajout précieux à vos compétences en programmation Java.

Introduction aux scripts en Java: langages, cadres et modèles

Le sujet principal de ce livre est la synergie des technologies de script et de la plate-forme Java. Je décris les projets que les développeurs Java peuvent utiliser pour créer un environnement de développement plus puissant, et certaines des pratiques qui rendent les scripts utiles.

Avant de commencer à discuter de l'application des scripts dans le monde Java, je résume une partie de la théorie derrière les scripts en général et son utilisation dans l'infrastructure des technologies de l'information. C'est le sujet des deux premiers chapitres du livre, et cela nous donne une meilleure perspective de la technologie de script ainsi que de la façon dont cette technologie peut être utile dans la plate-forme Java.

Pour commencer, nous devons définir ce que sont les langages de script et décrire leurs caractéristiques. Leurs caractéristiques déterminent grandement les rôles dans lesquels ils pourraient (devraient) être utilisés. Dans ce chapitre, j'explique ce que signifie le terme langage de script et je discute de leurs caractéristiques de base.

À la fin de ce chapitre, je discute des différences entre les langages de script et de programmation système et comment ces différences les rendent adaptés à certains rôles dans le développement.

Contexte

La définition d'un langage de script est floue et parfois incompatible avec la façon dont les langages de script sont utilisés dans le monde réel, c'est donc une bonne idée de résumer certains des concepts de base sur la programmation et l'informatique en général. Ce résumé fournit une base nécessaire pour définir les langages de script et discuter de leurs caractéristiques.

Commençons par le début. Les processeurs exécutent des instructions machine , qui opèrent sur des données soit dans les registres des processeurs soit dans la mémoire externe. En termes simples, une instruction machine se compose d'une séquence de chiffres binaires (0 et 1) et est spécifique au processeur particulier sur lequel elle s'exécute. Les instructions machine se composent du code d'opération indiquant au processeur quelle opération il doit effectuer, et d' opérandes représentant les données sur lesquelles l'opération doit être effectuée.

Par exemple, considérons l'opération simple consistant à ajouter une valeur contenue dans un registre à la valeur contenue dans un autre. Imaginons maintenant un processeur simple avec un jeu d'instructions de 8 bits, où les 5 premiers bits représentent le code d'opération (par exemple, 00111 pour l'ajout de valeur de registre), et les registres sont adressés par un modèle de 3 bits. Nous pouvons écrire cet exemple simple comme suit:

00111 001 010

Dans cet exemple, j'ai utilisé 001 et 010 pour adresser les registres numéro un et deux (R1 et R2, respectivement) du processeur.

Cette méthode de calcul de base est bien connue depuis des décennies et je suis sûr que vous la connaissez. Différents types de processeurs ont des stratégies différentes concernant l'apparence de leurs jeux d'instructions (architecture RISC ou CISC), mais du point de vue du développeur de logiciels, le seul fait important est que le processeur est capable d'exécuter uniquement des instructions binaires. Quel que soit le langage de programmation utilisé, l'application résultante est une séquence d'instructions machine exécutées par le processeur.

Ce qui a changé au fil du temps, c'est la façon dont les gens créent l'ordre dans lequel les instructions de la machine sont exécutées. Cette séquence ordonnée d'instructions machine est appelée un programme informatique . À mesure que le matériel devient plus abordable et plus puissant, les attentes des utilisateurs augmentent. Tout le but du développement logiciel en tant que discipline scientifique est de fournir des mécanismes permettant aux développeurs de créer des applications plus complexes avec le même effort (voire moins) qu'avant.

Le jeu d'instructions d'un processeur spécifique est appelé son langage machine . Les langages machine sont classés comme langages de programmation de première génération. Les programmes écrits de cette manière sont généralement très rapides car ils sont optimisés pour l'architecture particulière du processeur. Mais malgré cet avantage, il est difficile (voire impossible) pour les humains d'écrire des applications volumineuses et sécurisées en langage machine car les humains ne sont pas doués pour gérer de grandes séquences de 0 et de 1.

Pour tenter de résoudre ce problème, les développeurs ont commencé à créer des symboles pour certains modèles binaires, et avec cela, des langages d'assemblage ont été introduits. Les langages d'assemblage sont des langages de programmation de deuxième génération . Les instructions dans les langages d'assemblage ne sont qu'un niveau au-dessus des instructions de la machine, en ce sens qu'elles remplacent les chiffres binaires par des mots-clés faciles à retenir tels que ADD, SUB et ainsi de suite. En tant que tel, vous pouvez réécrire l'exemple d'instruction simple précédent en langage d'assemblage comme suit:

AJOUTER R1, R2

Dans cet exemple, le mot-clé ADD représente le code opération de l'instruction, et R1 et R2 définissent les registres impliqués dans l'opération. Même si vous n'observez que cet exemple simple, il est évident que les langages d'assemblage ont rendu les programmes plus faciles à lire pour les humains et ont ainsi permis la création d'applications plus complexes.

Bien qu'ils soient plus orientés vers l'humain, cependant, les langages de deuxième génération n'étendent en aucun cas les capacités du processeur.

Entrez des langages de haut niveau , qui permettent aux développeurs de s'exprimer sous des formes sémantiques de plus haut niveau. Comme vous l'avez peut-être deviné, ces langages sont appelés langages de programmation de troisième génération . Les langages de haut niveau fournissent diverses boucles puissantes, structures de données, objets, etc., ce qui facilite considérablement la création de nombreuses applications avec eux.

Au fil du temps, un large éventail de langages de programmation de haut niveau a été introduit, et leurs caractéristiques ont beaucoup varié. Certaines de ces caractéristiques classent les langages de programmation en tant que langages de script (ou dynamiques), comme nous le verrons dans les sections suivantes.

En outre, il existe une différence dans la manière dont les langages de programmation sont exécutés sur la machine hôte. Habituellement, les compilateurs traduisent les constructions de langage de haut niveau en instructions machine qui résident en mémoire. Bien que les programmes écrits de cette manière au départ aient été légèrement moins efficaces que les programmes écrits en langage assembleur en raison de l'incapacité des premiers compilateurs à utiliser efficacement les ressources système, au fil du temps, les compilateurs et les machines se sont améliorés, rendant les langages de programmation système supérieurs aux langages assembleurs. Finalement, les langages de haut niveau sont devenus populaires dans un large éventail de domaines de développement, des applications et des jeux d'entreprise aux logiciels de communication et aux implémentations de systèmes d'exploitation.

Mais il existe un autre moyen de transformer des constructions sémantiques de haut niveau en instructions machine, et c'est de les interpréter au fur et à mesure de leur exécution. De cette façon, vos applications résident dans des scripts, dans leur forme d'origine, et les constructions sont transformées à l'exécution par un programme appelé interpréteur . Fondamentalement, vous exécutez l'interpréteur qui lit les instructions de votre application, puis les exécute. Appelés langages de script ou langages dynamiques , ces langages offrent un niveau d'abstraction encore plus élevé que celui offert par les langages de programmation système, et nous les aborderons en détail plus loin dans ce chapitre.

Les langages présentant ces caractéristiques conviennent naturellement à certaines tâches, telles que l'automatisation des processus, l'administration système et le collage des composants logiciels existants; en bref, partout où la syntaxe et les contraintes strictes introduites par les langages de programmation système gênaient les développeurs et leur travail. Une description des rôles habituels des langages de script est au centre du chapitre 2, «Applications appropriées pour les langages de script».

Mais qu'est-ce que tout cela a à voir avec vous en tant que développeur Java? Pour répondre à cette question, résumons d'abord brièvement l'histoire de la plateforme Java. Au fur et à mesure que les plates-formes se diversifient, il est devenu de plus en plus difficile pour les développeurs d'écrire des logiciels pouvant fonctionner sur la majorité des systèmes disponibles. C'est à ce moment que Sun a développé Java, qui offre la simplicité «d'écrire une fois, exécuter n'importe où».

L'idée principale derrière la plate-forme Java était d'implémenter un processeur virtuel en tant que composant logiciel, appelé machine virtuelle . Lorsque nous avons une telle machine virtuelle, nous pouvons écrire et compiler le code pour ce processeur, au lieu de la plate-forme matérielle ou du système d'exploitation spécifique. La sortie de ce processus de compilation est appelée bytecode et représente pratiquement le code machine de la machine virtuelle ciblée. Lorsque l'application est exécutée, la machine virtuelle est démarrée et le bytecode est interprété. Il est évident qu'une application développée de cette manière peut fonctionner sur n'importe quelle plate-forme avec une machine virtuelle appropriée installée. Cette approche du développement logiciel a trouvé de nombreuses utilisations intéressantes.

La principale motivation de l'invention de la plate-forme Java était de créer un environnement pour le développement d'un logiciel client simple, portable et compatible réseau. Mais principalement en raison des pénalités de performances introduites par la machine virtuelle, Java est désormais le mieux adapté dans le domaine du développement de logiciels serveur. Il est clair qu'à mesure que la vitesse des ordinateurs personnels augmente, de plus en plus d'applications de bureau sont écrites en Java. Cette tendance ne fait que se poursuivre.

L'une des exigences de base d'un langage de script est d'avoir un interpréteur ou une sorte de machine virtuelle. La plate-forme Java est fournie avec la machine virtuelle Java (JVM), qui lui permet d'héberger divers langages de script. Il y a un intérêt croissant dans ce domaine aujourd'hui dans la communauté Java. Il existe peu de projets qui tentent de fournir aux développeurs Java la même puissance que les développeurs de langages de script traditionnels. En outre, il existe un moyen d'exécuter votre application existante écrite dans un langage dynamique tel que Python à l'intérieur de la JVM et de l'intégrer à une autre application ou module Java.

C'est ce dont nous discutons dans ce livre. Nous adoptons une approche de programmation par script, tout en discutant de toutes les forces et faiblesses de cette approche, comment utiliser au mieux les scripts dans une architecture d'application et quels outils sont disponibles aujourd'hui dans la JVM.