web-dev-qa-db-fra.com

Comment est Java indépendant de la plate-forme lorsqu'il a besoin d'une machine virtuelle Java pour s'exécuter?)

Je viens de commencer à apprendre Java) et je suis confus sur le sujet de l'indépendance de la plate-forme.

"Indépendant" n'implique-t-il pas que le code Java) doit s'exécuter sur n'importe quelle machine et ne nécessite aucun logiciel spécial à installer? La machine virtuelle Java doit cependant être présente dans la machine.

Par exemple, nous avons besoin du compilateur Turbo C pour pouvoir compiler le code source C/C++, puis l’exécuter. La machine doit avoir le compilateur C.

Quelqu'un pourrait-il indiquer ce que l’on entend par Java est décrit comme "indépendant de la plate-forme")?

76
Serenity

Typiquement, le code compilé est l'ensemble exact d'instructions nécessaires à la CPU pour "exécuter" le programme. En Java, le code compilé est un ensemble exact d’instructions pour un "CPU virtuel" qui doit fonctionner de la même manière sur toutes les machines physiques.

Donc, dans un sens, les concepteurs du langage Java ont décidé que le langage et le code compilé allaient être indépendants de la plate-forme, mais comme le code devait éventuellement être exécuté sur une plate-forme physique, ils ont tout le code dépendant de la plate-forme dans la machine virtuelle Java.

Cette exigence pour une machine virtuelle Java contraste avec votre exemple Turbo C. Avec Turbo C, le compilateur produira un code dépendant de la plate-forme. Il n’est pas nécessaire d’utiliser une machine virtuelle Java car le programme Turbo C compilé peut être exécuté directement par la CPU.

Avec Java, le CPU exécute la JVM, qui dépend de la plate-forme. Cette machine virtuelle Java en cours d'exécution exécute ensuite le bytecode Java qui est indépendant de la plate-forme, à condition que vous disposiez d'une machine virtuelle Java sur laquelle elle puisse s'exécuter. Vous pourriez dire que l'écriture de code Java, vous ne programmez pas l'exécution du code sur la machine physique, vous écrivez le code à exécuter sur la machine virtuelle Java.

La seule façon dont tout ce bytecode Java fonctionne sur toutes les machines virtuelles Java est qu'un standard assez strict a été écrit pour le fonctionnement des machines virtuelles Java. Cela signifie que quelle que soit la plate-forme physique que vous utilisez, la partie dans laquelle les interfaces de bytecode Java avec la machine virtuelle Java est garantie ne fonctionne que dans un sens. Étant donné que toutes les machines virtuelles fonctionnent exactement de la même manière, le même code fonctionne de la même manière partout, sans recompilation. Si vous ne pouvez pas passer les tests pour vous assurer que c'est la même chose, vous n'êtes pas autorisé à appeler votre machine virtuelle une "machine virtuelle Java".

Bien sûr, il existe des moyens de casser la portabilité d'un programme Java. Vous pouvez écrire un programme qui recherche les fichiers uniquement sur un système d'exploitation (cmd.exe par exemple). Vous pouvez utiliser JNI, qui vous permet effectivement de mettre du code C ou C++ compilé dans une classe. Vous pouvez utiliser des conventions qui ne fonctionnent que pour un certain système d'exploitation (comme en supposant que ":" sépare les répertoires). Mais vous êtes assuré de ne jamais avoir à recompiler votre programme pour une machine différente à moins de faire quelque chose de vraiment spécial (comme JNI).

106
Edwin Buck
            Technical Article on How Java is platform indepedent?

Avant d'entrer dans les détails, vous devez d'abord comprendre quel est le moyen de plate-forme? La plate-forme comprend le matériel informatique (principalement l'architecture du microprocesseur) et le système d'exploitation. Plate-forme = matériel + système d'exploitation

Tout ce qui est indépendant de la plate-forme peut fonctionner sur tous les systèmes d'exploitation et tous les matériels.

Java est indépendant de la plate-forme, donc Java peut fonctionner sur tous les systèmes d'exploitation et tous les matériels. Maintenant, la question est de savoir comment cette plate-forme est-elle indépendante?

Ceci est dû à la magie de Byte Code qui est indépendant de l'OS. Lorsque Java compile un code, il génère le code octet et non le code natif de la machine (contrairement au compilateur C.). Ce code doit maintenant être interprété par une machine. Il est appelé JVM. Ainsi, la machine virtuelle Java lit ce code octet (indépendant de la machine) qu'AMD l'exécute, car elle est conçue pour différents systèmes d'exploitation et le code octet peut être exécuté sur différents systèmes d'exploitation.

Dans le cas de C ou C++ (le langage n'est pas indépendant de la plate-forme), le compilateur génère le fichier .exe qui dépend du système d'exploitation. Ainsi, lorsque nous exécutons ce fichier .exe sur un autre système d'exploitation, il ne s'exécutera pas car ce fichier dépend de l'OS, il n'est donc pas compatible. l'autre OS.

Enfin, un code Byte indépendant du système d'exploitation rend la plate-forme Java indépendante.

54
Jatin Khurana

Cela signifie que le Java le programmeur n'a pas (en théorie) besoin de connaître les détails de la machine ou du système d'exploitation. Ces détails existent et les bibliothèques de la JVM et des bibliothèques les gèrent. De plus, en contraste frappant avec C, = Java Les fichiers binaires (bytecode) peuvent souvent être déplacés vers des systèmes entièrement différents sans modification ni recompilation.

25

Non, c'est l'inverse. C'est parce que vous utilisez la machine virtuelle que le programme Java est indépendant.

La machine virtuelle n'est pas indépendante, vous devez en installer une qui est spécialement conçue pour votre type de système. La machine virtuelle crée une plate-forme indépendante au-dessus du système d'exploitation.

8
Guffa

La JVM est une "machine simulée" pouvant être installée sur différents systèmes. De cette manière, le même code Java) peut être exécuté sur des systèmes différents, car il repose sur la machine virtuelle Java et non sur le système opérationnel lui-même.

En d'autres termes, cela permet au programmeur de communiquer avec le système virtuel (JVM) et d'utiliser ses fonctions, au lieu des fonctions spécifiques de la machine et du système d'exploitation. Depuis Java ne repose que sur la machine virtuelle Java, celle-ci est indépendante de la plate-forme (si la plate-forme dispose de la machine virtuelle Java installée).

En bref, Java n'est pas indépendant de la plate-forme en tant que tel, il nécessite une installation JVM pour tous les systèmes sur lesquels il doit s'exécuter. Cependant, il s'exécutera sur tous les systèmes sur lesquels la JVM est installée.

7
Lars Andren

Java est indépendant de la plate-forme car il dispose de la JVM (machine virtuelle Java). Illustrons-le avec un exemple concret. Supposons que vous êtes libre pour les membres de votre famille. Mais pourquoi?

Parce que tu les connais bien et qu'ils te connaissent aussi. Mais vous n'êtes pas libre pour les membres de ma famille. Parce que tu ne les connais pas et qu'ils ne te connaissent pas non plus. Mais si je suis ton ami et que je peux te présenter aux membres de ma famille, tu pourras leur parler librement.

De la même manière, si vous êtes un code et que je suis une machine virtuelle. En outre, votre famille est la plate-forme Windows et la mienne est la plate-forme Linux. Dans le cas où vous étiez une langue C ou une autre langue dépendante de la plate-forme, vous ne connaissez que les membres de votre famille et inversement. C'est pourquoi seule la plate-forme sur laquelle vous avez été écrit connaît ce code et le supportera. Mais si vous êtes un code Java et que vous venez chez moi, à savoir la plate-forme Linux et si vous me trouvez, JVM, je peux vous présenter ma famille, la plate-forme Linux et vous pourrez interagir avec elle.

Pour les langues dépendantes de la plate-forme, aucun ami tel que JVM n'est disponible pour se présenter à une famille de plates-formes. C’est ainsi que Java est indépendant de la plate-forme. :)

4
Tazwar Utshas

Dans c/c ++, le code source (fichier de programme c) après la compilation à l'aide d'un compilateur est directement converti en code machine natif (ce qui est compréhensible pour une machine particulière sur laquelle vous compilez le code). Et par conséquent, le code compilé de c/c ++ ne peut pas s'exécuter sur un système d'exploitation différent.

Mais dans le cas de Java: le fichier source de Java (.Java) sera compilé à l’aide du compilateur JAVAC (présent dans JDK) qui fournit le code Byte (fichier .class) compréhensible pour tout JVM installée sur n’importe quel système d’exploitation (système physique).

Ici, nous devons avoir différentes machines virtuelles (dépendantes de la plate-forme) pour différents systèmes d'exploitation sur lesquels nous voulons exécuter le code, mais le fichier .class (code compilé/code intermédiaire) reste le même, car il est compréhensible pour toute machine virtuelle installée. sur n'importe quel OS.

En c/c ++: seul le code source est indépendant de la machine. Dans Java: le code source et le code compilé sont indépendants de la plate-forme.

Cela rend Java Plate-forme (machine) indépendante.

3
PRATHIKSHA JAIN

Java n'est pas une plate-forme indépendante, elle-même est une plate-forme, basée sur cette plate-forme Java applications s'exécute, mais Java est elle-même dépendante de la plate-forme

3
user3647490

La JVM extrait de la plate-forme concrète. Votre programme repose uniquement sur la machine virtuelle Java et, comme celle-ci est disponible pour différentes plates-formes telles que Windows et Linux, votre programme est indépendant de la plate-forme (mais dépend de jvm).

3
deamon

1:jvm (c’est-à-dire Java)) est un ensemble de programmes contenant un grand nombre de fichiers fournissant diverses fonctions présentes sur un dossier (c'est-à-dire des ensembles de programmes au format intermédiaire) appelée packages.jvm aide à ne pas être surchargé sur o/s où son aide à exécuter uniquement le .class fichiers ou Java uniquement par lui-même.Il permet de rendre son format d’égalité intermédiaire après la compliation par le compilateur Java puis il fournit le code octet Représentation (fichier .class) qui n'est pas spécifique à o/s et processor.
2: jvm crée un code octet en .exe fichier pour le processeur indiquant l’allocation de mémoire compréhensible et présente pour chaque fonction après réception du code par octet.
3: jvm libère également l’allocation de mémoire à partir de la mémoire vive après que le contrôle ait terminé son exécution.

2
ranjan

En termes simples:

Langage de programmation Java est indépendant de la plateforme.

JVM dépend de la plateforme

2
Mohan

La machine virtuelle est dépendante. pour chaque os JVM différent.

".class" est identique pour toutes les machines virtuelles. ainsi, chaque machine virtuelle Java comprend que les données de fichier ".class".

la JVM dépendante de Windows donne des instructions dépendantes de Windows à la machine virtuelle Java dépendante de Windows Linux. Elle donne des instructions dépendantes de Linux à Linux.

c'est comme ça pour d'autres systèmes d'exploitation. alors, Java s'exécute sur n'importe quel système d'exploitation.

c'est pourquoi Java est indépendant.

2
time pass

JVM dépendra de la plate-forme.
Mais quoi qu’il en soit, ce sera indépendant de la plate-forme. [que nous avons appelé en tant que bytecode ou simplement vous pouvez dire ... le fichier de classe]. pour cela pourquoi Java est appelé indépendant de la plate-forme.
Vous pouvez également exécuter le même fichier de classe sur Mac sous Windows, mais cela nécessite JRE.

1
Nitz

Independent ne signifie-t-il pas que Java devrait pouvoir être exécuté sur n'importe quelle machine et ne nécessiterait aucun logiciel spécial pour être installé (dans ce cas, la machine virtuelle Java doit être présente dans la machine)?

Avec Java, vous pouvez compiler le code source sous Windows et l'exécution de code compilé (code binaire précis) peut être exécutée (interprétée) sur toute plate-forme exécutant une machine virtuelle Java. Donc oui, vous avez besoin d'une machine virtuelle mais la machine virtuelle peut exécuter n'importe quel code compilé, le code compilé est indépendant de la plate-forme.

En d'autres termes, vous avez à la fois la portabilité du code source et celle du code compilé.

Comme par exemple, nous avons besoin du compilateur Turbo C pour compiler le code source C/C++, puis l’exécuter. La machine doit disposer du compilateur C.

La machine n’a pas besoin d’un compilateur C, elle doit utiliser un binaire spécifique à la plate-forme. Avec C ou C++, le code compilé est spécifique à chaque architecture, il est indépendant de la plate-forme.

En d'autres termes, avec C/C++, vous avez la portabilité du code source (avec une certaine discipline) mais pas celle du code compilé: vous devez recompiler pour chaque architecture des binaires spécifiques à la plate-forme.

1
Pascal Thivent

Java n'est pas indépendant de la plate-forme en ce sens qu'il s'exécute sur la machine virtuelle Java. Cela dit, vous gagnez en indépendance par plate-forme via la programmation par rapport à une seule machine abstraite dotée de réalisations concrètes sur la plupart des plates-formes de système d'exploitation courantes (et de certaines appliances intégrées).

Une idée apparentée est la couche d'abstraction matérielle présente dans de nombreux systèmes d'exploitation qui permet au même système d'exploitation de s'exécuter sur un matériel différent.

Dans votre question initiale, Turbo C est analogue au programme javac et la machine virtuelle Java correspond à OS/HAL.

Juste une note de côté à la discussion sur JVM et JIT Compilation. C'est le même principe qu'avec C # et le CLR et dans une certaine mesure en Python, et quand quelqu'un dit que le code s'exécute "directement sur le matériel", cela est vrai dans la mesure où les instructions déjà compilées pourront tirer parti de l'optimisation. sur la machine/cpu, il est en cours d'exécution. Ainsi, même si la compilation initiale d'un module est plutôt lente, lors de l'exécution suivante de ce module, le code en cours d'exécution s'exécute à la vitesse native et s'exécute donc directement sur le matériel, pour ainsi dire.

0
user1712937

Lorsque nous compilons des données source C, elles génèrent un code natif qui peut être compris par le système d'exploitation actuel. Lorsque nous déplaçons ce code source vers l'autre système d'exploitation, il ne peut pas être compris par le système d'exploitation car son code natif signifie que la représentation change de O.S à O.S. Donc, C ou C++ dépendent de la plate-forme.

Maintenant, dans le cas de Java, après la compilation, nous obtenons du code octet au lieu du code natif. Lorsque nous allons exécuter le code d'octet, il est converti en code natif à l'aide de la machine virtuelle Java, puis il sera exécuté.

Donc Java est indépendant de la plate-forme et C ou C++ n'est pas indépendant de la plate-forme.

0
Monis Majeed

le bytecode n'est pas indépendant de la plateforme, mais de sa machine virtuelle qui le rend indépendant. Bytecode n'est pas le code de la matchine. Les bytecodes sont des codes numériques, des constantes et des références compacts (généralement des adresses numériques) qui codent le résultat de l'analyse syntaxique et de l'analyse sémantique d'éléments tels que le type, la portée et les profondeurs d'imbrication d'objets de programme. Ils permettent donc de bien meilleures performances que l’interprétation directe du code source. Le bytecode doit être interprété avant l'exécution, ce qui est toujours fait par l'interpréteur JVM.

0
ScoRpion

Java est indépendant de la plate-forme en ce qui concerne Java développeur, mais ce n'est pas le cas pour l'utilisateur final, qui doit disposer d'une machine virtuelle Java dépendante de la plate-forme pour s'exécuter Java Fondamentalement, lorsque Java est compilé, un bytecode est en général indépendant de la plate-forme. Par conséquent, le développeur doit avoir écrit un code unique pour l’ensemble de la série de plates-formes. avec un casse-tête pour l'utilisateur final qui a besoin d'installer la machine virtuelle Java pour exécuter ce code compilé (cette machine virtuelle étant différente pour chaque plate-forme), la dépendance n'entre en vigueur que pour l'utilisateur final.

0
user1641361

Javac - compilateur qui convertit le code source en code octet. [~ # ~] jvm [~ # ~] - interpréteur qui convertit le code octet en code de langage machine.

Comme nous le savons, Java est à la fois un langage basé sur un interpréteur ** r & ** . Une fois que le code Java, également appelé code source, est compilé, il est converti en code natif appelé BYTE CODE, qui est portable et peut être facilement exécuté sur tous les systèmes d'exploitation. Le code d'octet généré est essentiellement représenté au format décimal hexa . Ce format est identique sur chaque plate-forme, qu’il s’agisse d’un poste de travail Solaris, d’un Macintosh, de Windows ou de Linux. Après la compilation, l'interprète lit le code d'octet généré et le traduit en fonction de la machine hôte. . Le code d'octet est interprété par Java Machine virtuelle disponible avec tous les systèmes d'exploitation que nous installons. pour porter des programmes Java sur une nouvelle plate-forme, il suffit de porter l'interpréteur et certaines des routines de la bibliothèque.

J'espère que ça aide!!!

0
user3401570

bien bonne question, mais lorsque le code source est modifié en code octet natif intermédiaire par un compilateur dans lequel il convertit le programme en code octet en donnant les erreurs après la vérification complète en une fois (si trouvé), puis le programme a besoin d'un interpréteur qui vérifierait le programme ligne par ligne et le changerait directement en code machine ou en code objet et chaque système d’exploitation par défaut ne peut pas avoir un interpréteur Java pour des raisons de sécurité, vous devez donc avoir jvm à tout moment). Le coût de l’exécution dans cette indépendance de plate-forme d’exploitation différente, comme vous l’avez dit ici, signifie que le programme peut être exécuté dans n’importe quel système d’exploitation tel qu’unix, mac, linux, windows, etc., mais cela ne signifie pas que chaque des codes sans jvm qui spécifient les spécifications, l'implémentation et l'instance, si j'avance puis en modifiant la configuration de votre ordinateur afin que vous puissiez avoir un chargeur de classe pouvant ouvrir même le code d'octet, vous pouvez également exécuter Java code octet, applets, etc. -b y nimish :) bonne chance

0
Nimish Maskara

{App1 (code Java) ------> App1byteCode} ........ {l'aide de (JVM + MacOS) fonctionne avec App1, App2, App3}

{App2 (code Java) -----> App2byteCode} ........ {l'aide de (JVM + LinuxOS) fonctionne avec App1, App2, App3}

{App3 (code Java) -----> App3byteCode} ........ {l'aide de (JVM + WindowsOS) fonctionne avec App1, App2, App3}

Comment ça se passe?

Réponse: La machine virtuelle Java peut lire ByteCode et répondre en fonction du système d'exploitation sous-jacent, car la machine virtuelle Java est synchronisée avec le système d'exploitation.

Nous avons donc besoin de JVM avec Sync with Platform.

Mais l’essentiel est que le programmeur n’a pas besoin de connaître la connaissance spécifique de la plate-forme et de programmer son application en gardant à l’esprit une plate-forme spécifique.

Cette flexibilité du programme d’écriture dans Java --- est compilée pour ByteCode et exécutée sur n’importe quelle machine (la plate-forme JVM DEPENDENT de la plate-forme est nécessaire pour l’exécuter) = Java indépendant de la plate-forme.

0
RishiKesh Pathak