web-dev-qa-db-fra.com

Compilateur/interprète Java

Pourquoi dit-on que Java est un langage compilé et interprété?

Quel est l'avantage de cela (être compilé et interprété)?

19
JavaUser

Java est compilé en un "code d'octet" intermédiaire lors de la compilation. Cela contraste avec un langage tel que C qui est compilé en langage machine au moment de la compilation. Le code d'octet Java ne peut pas être exécuté directement sur le matériel de la même manière que le code C compilé. Au lieu de cela, le code d'octet doit être interprété par la JVM (Java Virtual Machine) lors de l'exécution pour pouvoir être exécuté. Le principal inconvénient d’un langage tel que C est que, lorsqu’il est compilé, ce fichier binaire ne fonctionnera que sur une architecture particulière (par exemple, x86). 

Les langages interprétés comme PHP sont en réalité indépendants du système et reposent sur un interpréteur spécifique au système et à l'architecture. Cela conduit à une portabilité beaucoup plus grande (les mêmes scripts PHP fonctionnent sur les machines Windows et Linux, etc.). Cependant, cette interprétation entraîne une baisse significative des performances. Les langages de haut niveau tels que PHP nécessitent plus de temps pour interpréter que des instructions spécifiques à une machine pouvant être exécutées par le matériel. 

Java cherche à trouver un compromis entre un langage purement compilé (sans portabilité) et un langage purement interprété (beaucoup plus lent). Pour ce faire, il compile le code dans un formulaire plus proche du langage machine (en réalité, le code octet Java est un langage machine, simplement pour la machine virtuelle Java), mais peut toujours être facilement transporté entre architectures. Comme Java nécessite toujours une couche logicielle pour son exécution (la machine virtuelle Java), il s’agit d’un langage interprété. Cependant, l'interpréteur (la JVM) fonctionne sur une forme intermédiaire appelée code d'octet plutôt que sur les fichiers source bruts. Ce code d'octet est généré à la compilation par le compilateur Java. Par conséquent, Java est également un langage compilé. En fonctionnant de cette manière, Java tire parti des avantages des langages compilés et des avantages des langages interprétés. Cependant, il hérite également de certaines limitations de ces deux langages. 

Comme le fait remarquer Bozho, il existe certaines stratégies pour augmenter les performances du code Java (et d'autres langages de code octet tels que .Net) grâce à l'utilisation de la compilation Just in Time (JIT). Le processus réel varie d'une implémentation à l'autre en fonction des exigences, mais le résultat final est que le code d'origine est compilé en code octet au moment de la compilation, mais qu'il est ensuite exécuté via un compilateur au moment de l'exécution avant d'être exécuté. En faisant cela, le code peut être exécuté à des vitesses proches de l’origine. Certaines plates-formes (je pense que .Net le fait) enregistrent le résultat de la compilation JIT en remplaçant le code octet. En faisant cela, toutes les futures exécutions du programme seront exécutées comme si le programme avait été compilé nativement depuis le début. 

44
Chris Thompson

Pourquoi disons-nous que Java est un langage compilé et interprété?.

Parce que le code source (fichiers .Java) est compilé en bytecode (fichiers .class), il est ensuite interprété par une machine virtuelle Java (également appelée JVM) pour exécution ( la machine virtuelle Java peut continuer à optimiser mais ceci est une autre histoire). 

Quel est l'avantage par rapport à cela (en cours de compilation/interprétation)

Portabilité. Le same bytecode peut être exécuté sur n’importe quelle plate-forme tant qu’une machine virtuelle est installée ("compile une fois, exécuté n'importe où").

12
Pascal Thivent

C'est un long sujet et vous feriez mieux de lire sur JIT . En bref, Java est compilé en bytecode, lequel est ensuite compilé (dans la JVM) en code machine.

6
Bozho

Java est considéré comme un langage "compilé" car le code est compilé au format bytecode qui est ensuite exécuté par la machine virtuelle Java (JVM). Cela donne plusieurs avantages dans le domaine de la performance et de l'optimisation du code, sans oublier de garantir l'exactitude du code.

Il est considéré comme un langage "interprété" car, une fois le bytecode compilé, il peut être exécuté sur toute machine sur laquelle une machine virtuelle Java est installée. C’est ainsi que Java ressemble beaucoup à un langage interprété en ce sens qu’il ne dépend généralement pas de la plate-forme sur laquelle il est exécuté. Ce comportement est similaire à d'autres langages interprétés tels que Perl, Python, PHP, etc.

Un inconvénient théorique au fait que les programmes Java peuvent être exécutés sur n’importe quel système en l’absence du code source est que, même si cette méthode de distribution assure la compatibilité entre plates-formes, les développeurs ont une raison de moins de publier leur code source, ce qui entraîne entre les significations idéologiques des expressions "multiplate-forme" et "open source".

3
amphetamachine

Java est compilé, en code octet et non en binaire. Les codes d'octet ne sont pas directement exécutables, ils ont besoin de la machine virtuelle Java pour les compiler à temps et les compiler à nouveau en code machine au moment de l'exécution.

À un niveau très basique, il sépare le code écrit par les programmeurs de la machine locale sur laquelle la JVM fonctionne, d'où une meilleure portabilité. Tandis que la compilation en bytecode améliore les performances de la compilation juste à temps, réduit la taille des fichiers et dissimule plus ou moins le code réel. (cela élimine également certaines erreurs de compilation)

2
Viele

Compilé: votre programme est syntaxiquement un programme Java correct, avant le démarrage du programme.

Interprété: Exécutez sur différentes plates-formes le même code (octet).

Compilé: Lorsque votre programme a été compilé correctement, vous pouvez vous assurer de maîtriser 80% des bogues logiciels. Et votre code ne s’arrêtera pas car vous n’avez pas correctement fermé un bloc de code, etc. 

Interprété: Vous savez ce que sont les applets? C'était l'application "killer" lorsque Java est sorti. Votre navigateur télécharge l'applet depuis le site Web et exécute le code de l'applet dans votre navigateur. Ce n'est pas très cool. Mais, la même applet fonctionne sous Windows, Linux, Mac, Solaris, ... car exécute/interprète un langage intermédium: le code d'octet.

1
PeterMmm

Un compilateur statique convertit le code source directement en code machine pouvant être exécuté directement sur la plate-forme cible. Différentes plates-formes matérielles requièrent différents compilateurs.

Le compilateur Java convertit le code source Java en bytecodes portables, qui sont des "instructions de machine virtuelle" pour la machine virtuelle. La première génération de JVM a été entièrement interprétée. La génération suivante des machines virtuelles Java ont utilisé des compilateurs JIT (Just-In-Time) pour accélérer l'exécution

Le processus d’exécution du HotSpot associe interprétation, profilage et compilation dynamique. Plutôt que de convertir tous les octets en code machine avant leur exécution, HotSpot s’exécute d’abord en tant qu’interpréteur et ne compile que le code "à chaud" - le code exécuté le plus souvent.

Lisez plus ici - https://www.ibm.com/developerworks/Java/library/j-jtp12214/

0
yoAlex5