¿Cómo es la plataforma Java independiente cuando necesita una JVM para ejecutarse?

79

Acabo de comenzar a aprender Java y estoy confundido sobre el tema de la independencia de la plataforma.

¿No implica "independiente" que el código Java debe ejecutarse en cualquier máquina y no necesita ningún software especial para ser instalado? Sin embargo, la JVM debe estar presente en la máquina.

Por ejemplo, necesitamos tener el compilador Turbo C para compilar el código fuente C / C ++ y luego ejecutarlo. La máquina debe tener el compilador C.

¿Alguien podría complacer lo que se quiere decir cuando se describe a Java como "independiente de la plataforma"?

Serenidad
fuente
4
@aaa: La última vez que lo comprobé, estaba disponible para su descarga gratuita en el sitio web de Borland.
dan04
1
Sí, listado como software antiguo ... ( edn.embarcadero.com/article/20841 ).
Matthew Flaschen
2
Turbo C (o cualquier otro compilador "nativo") no es necesario para ejecutar el programa compilado. el compilador genera un .exearchivo. como mucho, requiere una biblioteca en tiempo de ejecución (en un .dllarchivo), no todo el compilador
Javier

Respuestas:

111

Normalmente, el código compilado es el conjunto exacto de instrucciones que la CPU requiere para "ejecutar" el programa. En Java, el código compilado es un conjunto exacto de instrucciones para una "CPU virtual" que debe funcionar de la misma manera en cada máquina física.

Entonces, en cierto sentido, los diseñadores del lenguaje Java decidieron que el lenguaje y el código compilado iban a ser independientes de la plataforma, pero como el código finalmente tiene que ejecutarse en una plataforma física, optaron por poner todo el código dependiente de la plataforma en la JVM.

Este requisito para una JVM contrasta con el ejemplo de Turbo C. Con Turbo C, el compilador producirá código dependiente de la plataforma, y ​​no hay necesidad de que una JVM funcione igual porque el programa Turbo C compilado puede ser ejecutado directamente por la CPU.

Con Java, la CPU ejecuta la JVM, que depende de la plataforma. Esta JVM en ejecución luego ejecuta el código de bytes de Java, que es independiente de la plataforma, siempre que tenga una JVM disponible para que se ejecute. Podría decir que al escribir código Java, no programa para que el código se ejecute en la máquina física, escribe el código para que se ejecute en la Máquina Virtual Java.

La única forma en que todo este código de bytes de Java funciona en todas las máquinas virtuales de Java es que se ha escrito un estándar bastante estricto sobre cómo funcionan las máquinas virtuales de Java. Esto significa que no importa qué plataforma física esté utilizando, se garantiza que la parte en la que el código de bytes de Java interactúa con la JVM funcionará de una sola manera. Dado que todas las JVM funcionan exactamente igual, el mismo código funciona exactamente igual en todas partes sin volver a compilar. Si no puede pasar las pruebas para asegurarse de que sea igual, no puede llamar a su máquina virtual "máquina virtual Java".

Por supuesto, hay formas de romper la portabilidad de un programa Java. Puede escribir un programa que busque archivos que solo se encuentran en un sistema operativo (cmd.exe, por ejemplo). Puede usar JNI, que efectivamente le permite poner código C o C ++ compilado en una clase. Puede utilizar convenciones que solo funcionen para un determinado sistema operativo (como suponer que ":" separa directorios). Pero está garantizado que nunca tendrá que volver a compilar su programa para una máquina diferente a menos que esté haciendo algo realmente especial (como JNI).

Edwin Buck
fuente
1
"Dado que todas las JVM funcionan exactamente igual, el mismo código funciona exactamente igual en todas partes sin volver a compilar". ¿Qué significa esta oración? Siempre que ejecute el mismo programa en diferentes sistemas que tengan JVM instalado, siempre hacemos esto "javac filename.java". (Tome cualquier programa simple, por ejemplo) Si no es necesario volver a compilar el programa, entonces ¿por qué se dice que "podríamos ejecutar el mismo código en cualquier lugar sin volver a compilar?". Por favor explique.
Karan Thakkar
3
Necesita compilar el código fuente de Java, de ahí el "javac filename.java" Sin embargo, solo necesita hacerlo una vez, y no en todas las máquinas donde se usa (esto difiere de C y C ++). Si cambia CPU, sistemas de 32/64 bits, órdenes de bytes, etc., el código aún se ejecuta. Esto se debe a que la salida "filename.class" contiene código de bytes, que son instrucciones para la JVM. Dado que todas las JVM son funcionalmente idénticas, una vez que se compila el código, puede ejecutar ese código de bytes en cualquier máquina virtual Java sin tener el código fuente. Pruébelo, funciona. Además, algunos comentarios confunden la compilación con la recompilación.
Edwin Buck
@KaranThakkar - Creo que una extensión de lo que Edwin quiso decir podría ser, poder usar fácilmente los mismos archivos .jar en sus proyectos en cualquier plataforma sin compilarlos.
vanguard69
54
            Technical Article on How java is platform indepedent?

Antes de entrar en detalles, primero debe comprender cuál es el significado de plataforma. La plataforma consta del hardware de la computadora (principalmente la arquitectura del microprocesador) y el sistema operativo. Plataforma = hardware + sistema operativo

Todo lo que sea independiente de la plataforma se puede ejecutar en cualquier sistema operativo y hardware.

Java es independiente de la plataforma, por lo que Java se puede ejecutar en cualquier sistema operativo y hardware. Ahora la pregunta es ¿cómo es independiente de la plataforma?

Esto se debe a la magia de Byte Code, que es independiente del sistema operativo. Cuando el compilador de Java compila cualquier código, genera el código de bytes, no el código nativo de la máquina (a diferencia del compilador de C). Ahora, este código de bytes necesita un intérprete para ejecutarse en una máquina. Este intérprete es JVM. Entonces, JVM lee ese código de bytes (que es independiente de la máquina) y lo ejecuta. Diferentes JVM están diseñadas para diferentes sistemas operativos y el código de bytes puede ejecutarse en diferentes sistemas operativos.

En el caso de C o C ++ (lenguaje que no es independiente de la plataforma), el compilador genera el archivo .exe que depende del sistema operativo, por lo que cuando ejecutamos este archivo .exe en otro sistema operativo, no se ejecutará porque este archivo depende del sistema operativo, por lo que no es compatible con el otro sistema operativo.

Finalmente, un código Byte independiente del SO intermedio hace que la plataforma Java sea independiente.

Jatin Khurana
fuente
5
Esta es una respuesta estúpida. Lo que hace que la plataforma Java sea independiente es el hecho de que Java depende de la VM. No le importa en qué sistema operativo se esté ejecutando siempre que la VM satisfaga las llamadas a las operaciones del sistema operativo. Y la VM por sí sola no es independiente de la plataforma. La comparación que proporcionó con el lenguaje C / C ++ fue falsa, simplemente compile el código fuente en esa misma plataforma y se ejecutará, ¿por qué llevar ese conjunto de instrucciones a una plataforma diferente y esperar tontamente que se ejecute? ¿Puede llevar su código fuente de Java a ARM y esperar que se ejecute en una máquina virtual compilada para mi custom_processor?
Abhinav Gauniyal
El diseño de una JVM es el mismo. Oracle se volverá loco diseñando diferentes JVM para todas y cada una de las máquinas. La única diferencia es el código de bytes del programa que desea ejecutar en alguna máquina. Cada programa genera un tipo de bytecode diferente. El archivo de código de bytes tiene formato hexadecimal para que la JVM y la CPU comprendan y ejecuten el conjunto de instrucciones.
Karan Thakkar
26

Significa que el programador de Java no necesita (en teoría) conocer los detalles de la máquina o del sistema operativo. Estos detalles existen y la JVM y las bibliotecas de clases los manejan. Además, en marcado contraste con C, los binarios de Java (código de bytes) a menudo se pueden mover a sistemas completamente diferentes sin modificarlos ni volver a compilarlos.

Matthew Flaschen
fuente
10
"... Los binarios de Java (código de bytes) a menudo se pueden mover a arquitecturas completamente diferentes sin volver a compilar". De hecho, siempre pueden. La recompilación solo es necesaria cuando se mueve el código compilado para una JVM más nueva a una más antigua.
Stephen C
@ Stephen, lo cambié a "sistemas". Hay muchos factores que pueden impedir la portabilidad, incluido el uso de JNA o JNI para vincular bibliotecas que solo están escritas para una única arquitectura.
Matthew Flaschen
1
JNA o JNI parecen ser el único factor para mí, y esos son bastante raros en el uso en el mundo real. Incluso entonces, el código de bytes siempre se puede mover sin volver a compilar; es solo que puede que también tenga que volver a compilar las bibliotecas que JNI espera que estén allí. Sin embargo, el código de bytes sigue siendo portátil.
Kendall Helmstetter Gelner
de acuerdo ... pero en ninguno de esos casos la recompilación de los "binarios de Java (código de bytes)" hará la más mínima diferencia !!
Stephen C
Tengo una pregunta, ¿el código de bytes Java cumplido interactúa con el kernel del sistema operativo? Si es así, el mismo código de bytes no se puede aplicar a diferentes núcleos ya que las funciones del núcleo son diferentes, ¿verdad? O la JVM contiene todas las funciones del kernel para cada kernel diferente, lo cual es muy increíble ...
henryyao
9

No, es al revés. Es porque usa la máquina virtual que el programa Java se vuelve independiente.

La máquina virtual no es independiente, debe instalar una que esté hecha específicamente para su tipo de sistema. La máquina virtual crea una plataforma independiente sobre el sistema operativo.

Guffa
fuente
8

La JVM es una "máquina simulada" que se puede instalar en diferentes sistemas. De esta manera, el mismo código Java se puede ejecutar en diferentes sistemas, porque se basa en la JVM, no en el sistema operativo en sí.

Es decir, esto permite al programador comunicarse con el sistema virtual (JVM) y utilizar sus funciones, en lugar de las funciones específicas de la máquina y el sistema operativo. Dado que Java solo se basa en JVM, es independiente de la plataforma (si la plataforma tiene JVM instalada).

En resumen, Java no es independiente de la plataforma como tal, requiere una instalación de JVM para todos los sistemas en los que debería ejecutarse. Sin embargo, se ejecutará en todos los sistemas que tengan instalada la JVM.

Lars Andren
fuente
4

Java es independiente de la plataforma, ya que tiene JVM (máquina virtual Java). Ilustremos esto con un ejemplo de la vida real. Supongamos que eres libre para los miembros de tu familia. ¿Pero por qué?

Porque los conoces bien y ellos también te conocen a ti. Pero no eres libre para los miembros de mi familia. Porque no los conoces y ellos tampoco te conocen a ti. Pero, si soy tu amigo y puedo presentarte a los miembros de mi familia, podrás hablar con ellos libremente.

De manera similar, si eres un código y yo soy una JVM. Además, su familia es la plataforma Windows y la mía es la plataforma Linux. En el caso de que fuera un C u otros lenguajes dependientes de la plataforma, solo conoce a los miembros de su familia y viceversa. Es por eso que solo la plataforma en la que fue escrito conoce ese Código y lo admitirá. Pero si eres un código JAVA y cuando vienes a mi familia a saber. la plataforma Linux y si ahí me encuentras, JVM, entonces puedo presentarte a mi familia, la plataforma Linux y podrás interactuar con ella.

Para los lenguajes dependientes de la plataforma, no hay ningún amigo como JVM disponible para que se presenten a ninguna familia de plataformas. Así es como Java es independiente de la plataforma. :)

Tazwar Utshas
fuente
3

La JVM se abstrae de la plataforma de hormigón. Su programa se basa solo en la JVM y, dado que la JVM está disponible para diferentes plataformas como Windows y Linux, su programa es independiente de la plataforma (pero depende de jvm).

demonio
fuente
3

En c / c ++, el código fuente (archivo de programa c) después de la compilación usando un compilador se convierte directamente en código de máquina nativo (que es comprensible para la máquina en particular en la que está compilando el código). Y, por lo tanto, el código compilado de c / c ++ no se puede ejecutar en diferentes sistemas operativos.

Pero en el caso de Java: el archivo fuente de java (.java) se compilará utilizando el compilador JAVAC (presente en JDK) que proporciona el código Byte (archivo .class) que es comprensible para cualquier JVM instalado en cualquier SO (sistema físico) .

Aquí necesitamos tener diferentes JVM (que dependen de la plataforma) para diferentes sistemas operativos donde queremos ejecutar el código, pero el archivo .class (código compilado / código intermedio) sigue siendo el mismo, porque es comprensible para cualquiera de las JVM instaladas. en cualquier sistema operativo.

En c / c ++: solo el código fuente es independiente de la máquina. En Java: tanto el código fuente como el código compilado son independientes de la plataforma.

Esto hace que la plataforma Java (máquina) sea independiente.

PRATHIKSHA JAIN
fuente
3

Java no es una plataforma Independiente, en sí misma es una plataforma, basada en esa plataforma que se ejecutan las aplicaciones de Java, pero la plataforma de Java en sí depende de la plataforma

usuario3647490
fuente
2

1:jvm(es decir, la máquina virtual java) es una colección de programas que contiene muchos archivos que proporcionan varias funciones presentes en una carpeta (es decir, colecciones de programas en formato de nivel medio) como se llama packages. jvmayuda a no sobrecargarse o/sdonde ayuda a ejecutar solo los .classarchivos o aplicaciones java solo por sí mismo.Ayuda a hacer que su formato de nivel medio de igualdad después de la compilación por parte del compilador java, luego proporcione la representación del código de bytes (archivo .class) que no es específico de o/sy processor.
2: jvm convierte el código de bytes en el .exearchivo para que el procesador sea comprensible y presenta la asignación de memoria para cada función después de recibir el código de bytes frm.
3: jvm también libera la ubicación de memoria de la RAM después de que el control finaliza su ejecución.

ranjan
fuente
2

JVM depende del sistema operativo. para cada sistema operativo JVM diferente.

".class" es el mismo para todas las JVM. por lo tanto, cada JVM entiende los datos del archivo ".class".

La JVM dependiente de Windows da instrucciones dependientes de Windows a Windows La JVM dependiente de Linux proporciona instrucciones dependientes de Linux a Linux.

eso es lo mismo para otros sistemas operativos. entonces, java se ejecuta en cualquier sistema operativo.

es por eso que Java es independiente del sistema operativo.

pasa el tiempo
fuente
2

En lenguaje sencillo:

El lenguaje de programación Java es independiente de la plataforma.

JVM depende de la plataforma

Mohan
fuente
1

Java no es independiente de la plataforma, ya que se ejecuta en la JVM. Dicho esto, obtiene independencia de la plataforma a través de la programación contra una sola máquina abstracta que tiene realizaciones concretas en las plataformas de sistemas operativos más comunes (y algunos dispositivos integrados).

Una idea relacionada es la capa de abstracción de hardware presente en muchos sistemas operativos que permite que el mismo sistema operativo se ejecute en hardware diferente.

En su pregunta original, Turbo C es análogo al programa javac, y la JVM es el OS / HAL.

John Percival Hackworth
fuente
1

¿No significa independiente que el código Java debería poder ejecutarse en cualquier máquina y no necesitaría ningún software especial para ser instalado (JVM en este caso tiene que estar presente en la máquina)?

Con Java, puede compilar código fuente en Windows y el código compilado ( código de bytes para ser precisos) se puede ejecutar (interpretar) en cualquier plataforma que ejecute una JVM. Entonces, sí, necesita una JVM, pero la JVM puede ejecutar cualquier código compilado, el código compilado es independiente de la plataforma .

En otras palabras, tiene tanto la portabilidad del código fuente como la portabilidad del código compilado.

Como, por ejemplo, necesitamos tener Turbo C Compiler para compilar el código fuente C / C ++ y luego ejecutarlo. La máquina tiene que tener el compilador C.

La máquina no tiene que tener un compilador de C, la máquina tiene que usar un binario específico de la plataforma. Con C o C ++, el código compilado es específico para cada arquitectura, es independiente de la plataforma .

En otras palabras, con C / C ++ tiene portabilidad del código fuente (con cierta disciplina) pero no portabilidad del código compilado: necesita recompilar para cada arquitectura en binarios específicos de la plataforma.

Pascal Thivent
fuente
1

JVM dependerá de la plataforma.
Pero cualquier cosa que genere será independiente de la plataforma. [que llamamos como bytecode o simplemente puede decir ... el archivo de clase]. por eso Java se llama independiente de la plataforma.
también puede ejecutar el mismo archivo de clase en Mac en Windows, pero requerirá JRE.

Nitz
fuente
0

bytecode no es independiente de la plataforma, sino su JVM que hace que el bytecode sea independiente. Bytecode no es el código de coincidencia. Los códigos de bytes son códigos numéricos compactos, constantes y referencias (normalmente direcciones numéricas) que codifican el resultado del análisis sintáctico y semántico de cosas como el tipo, el alcance y las profundidades de anidación de los objetos del programa. Por lo tanto, permiten un rendimiento mucho mejor que la interpretación directa del código fuente. El código de bytes debe interpretarse antes de la ejecución, lo que siempre lo realiza el intérprete de JVM.

Escorpión
fuente
0

Solo una nota al margen de la discusión sobre JVM y JIT Compilation. Este es el mismo principio que con C # y CLR y, hasta cierto punto, en Python, y cuando alguien dice que el código se ejecuta "directamente en el hardware", en realidad es cierto que las instrucciones que ya están compiladas podrán aprovechar la optimización. en la máquina / CPU en la que se está ejecutando. Entonces, incluso si la compilación inicial de un módulo es bastante lenta, la próxima vez que se ejecute este módulo, el código que se ejecuta se ejecutará a velocidad nativa y, por lo tanto, se ejecutará directamente en el hardware, por así decirlo.


fuente
0

Java es independiente de la plataforma en el aspecto del desarrollador de Java, pero este no es el caso del usuario final, que necesita tener una JVM dependiente de la plataforma para ejecutar código Java. Básicamente, cuando se compila el código Java, se genera un código de bytes que normalmente es independiente de la plataforma. Por lo tanto, el desarrollador debe escribir un código único para toda la serie de plataformas. Pero este beneficio viene con un dolor de cabeza para el usuario final que necesita instalar JVM para ejecutar este código compilado. Esta JVM es diferente para cada plataforma. Por lo tanto, la dependencia entra en vigor solo para el usuario final.

user1641361
fuente
0

Javac : compilador que convierte el código fuente en código de bytes. JVM : intérprete que convierte código de bytes en código de lenguaje de máquina.

Como sabemos, Java es un lenguaje compilado ** r & ** basado en intérpretes . Una vez que se compila el código Java, también conocido como código fuente, se convierte a código nativo conocido como BYTE CODE, que es portátil y se puede ejecutar fácilmente en todos los sistemas operativos. El código de bytes generado se representa básicamente en formato decimal hexadecimal . Este formato es el mismo en todas las plataformas, ya sea una estación de trabajo Solaris o Macintosh, Windows o Linux. Después de la compilación, el intérprete lee el código de bytes generado y lo traduce de acuerdo con la máquina host. . El código de bytes es interpretado por Java Virtual Machine, que está disponible con todos los sistemas operativos que instalamos. así que para portar programas Java a una nueva plataforma, todo lo que se requiere es portar el intérprete y algunas de las rutinas de la biblioteca.

¡¡¡Espero eso ayude!!!


fuente
0

Cuando compilamos datos fuente en C, genera código nativo que puede ser entendido por el sistema operativo actual. Cuando trasladamos este código fuente al otro sistema operativo, el sistema operativo no puede entenderlo debido al código nativo, lo que significa que la representación cambia de un sistema operativo a otro. Por lo tanto, C o C ++ dependen de la plataforma.

Ahora, en el caso de Java, después de la compilación obtenemos código de bytes en lugar de código nativo. Cuando ejecutamos el código de bytes, se convierte en código nativo con la ayuda de JVM y luego se ejecutará.

Así que Java es independiente de la plataforma y C o C ++ no es independiente de la plataforma.

Monis Majeed
fuente
0

bueno, buena pregunta, pero cuando el código fuente se cambia a código de bytes nativo intermedio por un compilador en el que convierte el programa en el código de bytes dando los errores después de la comprobación completa de una vez (si se encuentra) y luego el programa necesita un intérprete que Verificaría el programa línea por línea y lo cambiaría directamente a código de máquina o código de objeto y cada sistema operativo por defecto no puede tener un intérprete de Java debido a algunas razones de seguridad, por lo que debe tener jvm a cualquier costo para ejecutarlo en esa plataforma de sistema operativo diferente independencia, como dijiste aquí, significa que el programa se puede ejecutar en cualquier sistema operativo como Unix, Mac, Linux, Windows, etc., pero esto no significa que todos y cada uno de los sistemas operativos podrán ejecutar los códigos sin un jvm que dice especificación, implementación, e instancia,si avanzo, entonces cambiando la configuración de su PC para que pueda tener un cargador de clases que pueda abrir incluso el código de bytes, entonces también puede ejecutar código de bytes de Java, applets, etc. -por nimish :) la mejor de las suertes

Nimish Maskara
fuente
0

{App1 (código Java) ------> App1byteCode} ........ {(JVM + MacOS) ayuda a trabajar con App1, App2, App3}

{App2 (Java Code) -----> App2byteCode} ........ {(JVM + LinuxOS) ayuda a trabajar con App1, App2, App3}

{App3 (Java Code) -----> App3byteCode} ........ {(JVM + WindowsOS) ayuda a trabajar con App1, App2, App3}

Como esta pasando esto

Respuesta: JVM tiene capacidad para leer ByteCodey responder de acuerdo con el sistema operativo subyacente, ya que la JVM está sincronizada con el sistema operativo.

Entonces encontramos que necesitamos JVM con Sync with Platform.

Pero lo principal es que el programador no tiene que tener conocimientos específicos de la Plataforma y programar su aplicación teniendo en cuenta una plataforma específica.

Esta flexibilidad del programa de escritura en Java --- compilar ByteCodey ejecutar en cualquier máquina (Sí, es necesario tener JVM DEPENDIENTE de la plataforma para ejecutarlo) hace que la plataforma Java sea independiente.

RishiKesh Pathak
fuente
-1

cuando compilamos el archivo java, se genera el archivo .class de ese programa, ese archivo .class contiene el código de bytes. Ese código de bytes es independiente de la plataforma, el código de bytes puede ejecutarse en cualquier sistema operativo que utilice una máquina virtual Java. independencia de la plataforma no solo del sistema operativo, sino también del hardware. Cuando ejecuta su aplicación Java en una máquina de 16 bits que creó en 32 bits, no tiene que preocuparse por convertir los tipos de datos de acuerdo con el sistema de destino. Puede ejecutar su aplicación en cualquier arquitectura y obtendrá el mismo resultado en cada una.

Nikita Rawool
fuente
-3

Editar: No del todo. Vea los comentarios a continuación.

Java no se ejecuta directamente en nada. Debe convertirse a código de bytes mediante una JVM.

Debido a que las JVM existen para todas las plataformas principales, esto hace que Java sea independiente de la plataforma A TRAVÉS de la JVM.

Amy B
fuente
1
La JVM interpreta el código de bytes de JIT. No se compila con él.
Matthew Flaschen
Si. "para la JVM" es más precisa.
polygenelubricants
1
jopdesign.com ~ podría intentarlo de nuevo. estos chicos dicen que puede ejecutarse directamente en hardware.
jcolebrand