Au début du chapitre 2, je vous disais qu'il n'existe que deux catégories de langages : compilés ou interprétés. Eh bien j'ai menti :p En réalité, il existe une troisième catégorie que l'on pourrait qualifier d'hybride, car située à mi-chemin entre compilation et interprétation. Parmi ceux-ci figurent des pointures comme Java ou C#.
En quoi ces langages sont-ils hybrides me direz-vous ? A première vue, il est vrai que ces langages sont des langages compilés puisque les fichiers sources doivent être compilés avant toute utilisation. En réalité, c'est un peu plus complexe.
Le point commun entre tous les langages hybrides, c'est la nécessité d'avoir à installer une machine virtuelle sur les postes informatiques qui auront à exécuter les fichiers produits en sortie de la compilation : Après compilation, un fichier source Java ou C# ne devient pas un fichier binaire, mais un fichier bytecode, c'est-à-dire un fichier écrit dans un langage plus concret (comprenez plus proche du processeur) que le code source mais pas directement compréhensible par le processeur pour autant !
A la différence d'un fichier binaire, un fichier bytecode ne peut être exécuté par le processeur qu'à la condition qu'un interpréteur appelé machine virtuelle traduise à la volée les instructions bytecode en une suite de 0 et de 1.
A ce stade, vous devez certainement vous demander l'intérêt d'un truc aussi compliqué :D Je dois traduire mon fichier source en bytecode (étape de compilation) puis exécuter le fichier bytecode dans une machine virtuelle (étape d'interprétation)... ... ... gromel gromel... mais quelle perte de temps !!!%%
En somme, on cumule les inconvénients des langages compilés et interprétés. Eh bien vous avez (presque) raison...
Presque... car il existe un avantage à s'encombrer d'une machine virtuelle, c'est la portabilité ! La portabilité d'un code source est sa capacité (ou non) à être exploitable dans des environnements différents, comprenez par là sous des systèmes d'exploitations divers : Windows, GNU/Linux, BSD, MAC OS etc...
Ainsi, la traduction en bytecode d'un code source JAVA est directement exécutable dans n'importe quel environnement, à partir du moment ou la machine virtuelle adéquate est installée. C'est la raison pour laquelle on qualifie souvent les machines virtuelles de plate-forme, sorte d'intermédiaire entre le bytecode et le système d'exploitation. La machine virtuelle rend un code source indépendant de son environnement d'exécution.
Attention : Un programmage écrit dans langage compilé traditionnel comme le C n'est pas portable. Un code source écrit en C devra être recompilé dans chacun des environnements d'exécution envisagés car l'étape de compilation induit une dépendance avec le système d'exploitation.
- Cas du Java :
Java est un langage hybride inventé par Sun Microsystems. Il n'est exploitable qu'en association avec une JVM (Java Virtual Machine). Cette JVM peut être la version officielle de Sun Microsystems ou une version officieuse optimisée dans un but différent. Bien sûre, la JVM est une application disponible sur tous les systèmes d'exploitation, sinon l'atout portable du Java serait perdu.
- Cas du Microsoft.NET :
Les langages .NET ne fonctionnent qu'en association avec la machine virtuelle .NET de Microsoft. La plate-forme .NET n'est pourtant distribuée que pour les systèmes d'exploitation Microsoft, bien que des portages officieux sous d'autres environnements soient en cours (projet Mono). Quel est l'avantage d'une telle machine virtuelle me direz-vous ?
Eh bien plus que la portabilité, avec .NET Microsoft a offert aux développeurs l'opportunité de coder dans différents langages pour collaborer par delà la limite imposée par leurs compétences.
C'est la raison pour laquelle .NET propose de coder en plusieurs langages : VB.NET (à ne pas confondre avec le VBA), C + +.NET (à ne pas confondre avec le C + +) et C#.NET. Ainsi, la machine virtuelle de Microsoft sert d'interface entre différents développeurs et différents langages d'un côté, et un système d'exploitation Microsoft de l'autre. Tandis que la JVM sert d'interface entre un développeur JAVA d'un côté, et différents systèmes d'exploitation de l'autre. L'objectif recherché n'est pas le même !
Dernière remarque pour finir :
Le nom .NET peut désigner plusieurs choses. Il s'agit souvent de la machine virtuelle. Parfois c'est aussi le mot chapeau pour recouvrir les trois langages VB.NET, C + +.NET et C#.NET. En toute rigueur, .NET est le nom du framework (comprenez, environnement de travail) regroupant la machine virtuelle, des bibliothèques DLL Windows et un pack de logiciels permettant de développer en VB.NET, C + +.NET ou C#.NET. Ces logiciels font partie de la famille des IDE (Integrated Development Environments, Environnements de Développement Intégrés). Ce sont des outils destinés à simplifier le travail du développeur.
