¿Qué es la portabilidad? ¿Cómo es java más portable que otros lenguajes? [cerrado]


Me pregunto cómo Java es más portable que C, C++ y.NET y cualquier otro lenguaje. He leído muchas veces sobre java siendo portable debido al intérprete y JVM, pero la JVM solo oculta las diferencias arquitectónicas en el hardware, ¿verdad? Todavía necesitaríamos diferentes JVM para diferentes arquitecturas de máquinas. ¿Qué me estoy perdiendo aquí? Así que si alguien escribe una capa de abstracción para C para las arquitecturas más comunes, digamos el CVM, entonces cualquier programa de C se ejecutará en esas arquitecturas una vez CVM está instalado, ¿no?

¿Qué es exactamente esta portabilidad? ¿Se puede llamar. NET portable?

Author: Hari Menon, 2010-10-13

11 answers

La portabilidad no es una cosa en blanco y negro, sí o no. La portabilidad es lo fácil que uno puede tomar un programa y ejecutarlo en todas las plataformas que le importan.

Hay algunas cosas que afectan esto. Uno es el idioma en sí. La especificación del lenguaje Java generalmente deja mucho menos hasta "la implementación". Por ejemplo, "i = i++" no está definido en C y C++, pero tiene un significado definido en Java. En términos más prácticos, tipos como "int" tienen un tamaño específico en Java (por ejemplo: int siempre es de 32 bits), mientras que en C y C++ el tamaño varía dependiendo de la plataforma y el compilador. Estas diferencias por sí solas no le impiden escribir código portable en C y C++, pero debe ser mucho más diligente.

Otra son las bibliotecas. Java tiene un montón de bibliotecas estándar que C y C++ no tienen. Por ejemplo, subprocesos, redes y bibliotecas GUI. Existen bibliotecas de este tipo para C y C++, pero no forman parte del estándar y las bibliotecas correspondientes están disponibles puede variar ampliamente de una plataforma a otra.

Finalmente, está toda la cuestión de si simplemente puede tomar un ejecutable y soltarlo en la otra plataforma y hacer que funcione allí. Esto generalmente funciona con Java, asumiendo que hay una JVM para la plataforma de destino. (y hay JVM para muchas / la mayoría de las plataformas que a la gente le importan) Esto generalmente no es cierto con C y C++. Por lo general, vas a al menos necesita una recompilación, y eso asumiendo que ya se ha ocupado de la dos puntos anteriores.

Sí, si existiera un "CVM" para múltiples plataformas, eso haría que C y C++ fueran más portátiles sort algo así. Todavía tendría que escribir su código C ya sea de una manera portátil (por ejemplo: asumiendo nada sobre el tamaño de un int que no sea lo que dice el estándar) o escribiría al CVM (asumiendo que ha tomado una decisión uniforme para todo este tipo de cosas en todas las plataformas de destino). También tendrá que renunciar al uso de bibliotecas no estándar (sin redes, subprocesos o GUI) o escribir a las bibliotecas específicas de CVM para esos fines. Entonces no estamos hablando realmente de hacer que C y C++ sean más portátiles, sino de un CVM-C / C++ especial que sea portátil.

Una vez más, la portabilidad no es una cosa en blanco y negro. Incluso con Java todavía puede haber incompatibilidades. Las bibliotecas GUI (especialmente AWT) eran un poco notorias por tener un comportamiento inconsistente, y cualquier cosa que involucre hilos puede comportarse de manera diferente si se descuida. En general, sin embargo, es mucho más fácil tomar un programa Java no trivial escrito en una plataforma y ejecutarlo en otra de lo que es hacer lo mismo con un programa escrito en C o C++.

 39
Author: Laurence Gonsalves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 17:24:41

Como otros ya han dicho, la portabilidad es algo así como un concepto difuso. Desde una cierta perspectiva, C es en realidad más portable than Java. C hace muy pocas suposiciones sobre el hardware subyacente. Ni siquiera asume que hay 8 bits en un byte, o que los números negativos deben representarse usando el complemento de dos. Teóricamente, siempre y cuando tenga una máquina basada en Von Neumann y un compilador, está bien ir con C.

De hecho, un "Hola mundo" un programa escrito en C va a funcionar en muchas más plataformas que un programa "Hello world" escrito en Java. Probablemente podría obtener el mismo programa" hola mundo " para trabajar en un PDP-11 y un iPhone.

Sin embargo, la realidad es que la mayoría de los programas del mundo real hacen mucho más que "Hola mundo". Java tiene una reputación de ser más portátil que C porque en la práctica , se necesita mucho más esfuerzo para portar programas C del mundo real a diferentes plataformas que programas Java del mundo real.

Esto se debe a que el lenguaje C es realmente ANSI-C, que es un lenguaje extremadamente básico y de propósito general. No tiene soporte para programación de red, subprocesos o desarrollo de GUI. Por lo tanto, tan pronto como escribas un programa que incluya cualquiera de esas cosas, tienes que recurrir a una extensión menos portátil a C, como Win32 o POSIX o lo que sea.

Pero con Java, la programación de red, el threading y las herramientas GUI están definidas por el lenguaje e integrado en cada implementación de VM.

Dicho esto, creo que muchos programadores también subestiman el progreso que C/C++ moderno ha hecho en relación con la portabilidad en estos días. POSIX va un largo camino hacia el suministro de subprocesos multiplataforma, y cuando se trata de C++, Boost proporciona redes y bibliotecas de subprocesos que son básicamente tan portátiles como cualquier cosa en Java. Estas bibliotecas tienen algunas peculiaridades específicas de la plataforma, pero también Java.

Esencialmente, Java se basa en que cada plataforma tenga una implementación de VM que interpretará el código de bytes de una manera predecible, y C/C++ se basa en bibliotecas que incorporan código específico de la plataforma utilizando el preprocesador (#ifdefs). Ambas estrategias permiten el subproceso multiplataforma, la creación de redes y el desarrollo de GUI. Es simplemente que Java ha hecho un progreso más rápido que C/C++ cuando se trata de portabilidad. La especificación del lenguaje Java tenía subprocesos, redes y desarrollo de GUI casi desde el primer día, mientras que el impulso la biblioteca de redes solo salió alrededor de 2005, y no fue hasta 2011 con C++11 que el subproceso portátil estándar se incluyó en C++.

 20
Author: Charles Salvia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-16 14:28:47

Cuando se escribe un programa Java, se ejecuta en todas las plataformas que tienen JVM escrito para ellos - Windows, Linux, macOS, etc.

Si escribes un programa en C++, tendrás que compilarlo específicamente para cada plataforma.

Ahora, se dice que el lema de Java "escribir una vez, ejecutar en todas partes" es un mito. No es del todo cierto para las aplicaciones de escritorio, que necesitan interacción con muchos recursos nativos, pero cada aplicación JavaEE se puede ejecutar en cualquier plataforma. Actualmente estoy trabajando en Windows, y otros colegas están trabajando en Linux sin ningún problema.

(Otra cosa relacionada con la portabilidad es JavaEE (enterprise edition). Se dice que las aplicaciones escritas con tecnologías JavaEE se ejecutan en cualquier servidor de aplicaciones certificado por JavaEE. Esto, sin embargo, no es cierto al menos hasta JavaEE6. (ver aquí))

 7
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 22:19:24

La portabilidad es una medida de la cantidad de esfuerzo para hacer que un programa se ejecute en otro entorno que el de donde se originó.

Ahora se puede debatir si una JVM en Linux es un entorno diferente que en Windows (yo diría que sí), pero el hecho es que en muchos casos no hay ningún esfuerzo involucrado si se cuida de evitar algunos gotchas.

El CVM del que está hablando es en gran medida lo que las bibliotecas POSIX y las bibliotecas de tiempo de ejecución intentan proporcionar, sin embargo, hay grandes diferencias de implementación que hacen que los obstáculos sean altos para cruzar. Ciertamente, en el caso de Microsoft y Apple, estos son probablemente intencionalmente para evitar que los desarrolladores saquen productos a plataformas competidoras.

En el frente.net, si puede atenerse a lo que mono proporciona, una implementación de. Net de código abierto, disfrutará aproximadamente del mismo tipo de portabilidad que Java, pero como mono está significativamente detrás de las versiones de Windows, esta no es una opción popular. No lo sé lo popular que es esto para el desarrollo basado en servidores, donde puedo imaginar que es un problema menor.

 5
Author: Peter Tillemans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 16:49:46

Java es portable desde la perspectiva del desarrollador: el código escrito en Java se puede ejecutar en cualquier entorno sin necesidad de recompilar. C no es portable porque no solo está vinculado a un sistema operativo específico en muchos casos, también está siempre vinculado a una arquitectura de hardware específica una vez que se ha compilado. Lo mismo es cierto para C++. . net es más portátil que C / C++, ya que también depende de una máquina virtual y, por lo tanto, no está vinculado a una arquitectura de hardware específica en tiempo de compilación, pero se limita a las máquinas Windows (oficialmente).

Tienes razón, la JVM es específica de la plataforma (¡tiene que serlo!), pero cuando dices que Java es portable, estás hablando de ello desde el punto de vista del desarrollador y los desarrolladores estándar de Java no escriben la JVM, la usan :-).

Edita @Raze2Dust Para responder a tu pregunta. Sí, podrías. De hecho, puede hacer que la plataforma Java sea específica escribiendo un compilador que genere código máquina en lugar de bytecode. Pero como algunos de los otros comentarios sugieren, ¿por qué harías eso? Tendría que crear un intérprete que mapee el código compilado a las operaciones de la misma manera que funciona la JVM. Así que a largo y corto plazo es, absolutamente, definitivamente podrías, pero ¿por qué lo harías?

 3
Author: Chris Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 17:32:49

Se pregunta si se podría escribir una "C VM". No exactamente. "Java" es un gran término utilizado por Sun para significar muchas cosas, incluyendo tanto el lenguaje de programación, y la máquina virtual. "C" es solo un lenguaje de programación: depende del compilador, del sistema operativo y de la CPU decidir qué formato debe tener el binario resultante.

A veces se dice que C es portable porque no especifica el tiempo de ejecución. Las personas que escribieron su compilador fueron capaces de elegir las cosas que tienen sentido para eso plataforma. La desventaja es que C es lo suficientemente de bajo nivel, y las plataformas son lo suficientemente diferentes, que es común que los programas de C funcionen bien en un sistema y no en absoluto en otro.

Si combina el lenguaje C con una ABI específica, podría definir una máquina virtual para ella, análoga a la JVM. Hay algunas cosas como esta ya, por ejemplo:

  • La "Especificación de compatibilidad Binaria Intel" es un ejemplo de tal ABI (que casi nadie usa hoy en día)
  • "Microsoft Windows " también podría ser una ABI (aunque una enorme y poco específica), para la cual Wine es una máquina virtual que ejecuta programas escritos para ella
  • "MS-DOS", para el cual dosemu es una VM
  • "Linux" es uno de los más populares hoy en día, cuyos programas pueden ser ejecutados por el propio Linux, NetBSD , o FreeBSD
  • "PA-RISC", para el cual la dinamo de HP era una VM tipo JIT

Todas estas máquinas virtuales C son de hecho una máquina real nobody nadie, AFAIK, ha hecho una C VM que era puramente virtual. Esto no es sorprendente, ya que C fue diseñado para ejecutarse eficientemente en hardware, por lo que también podría hacerlo funcionar normalmente en un sistema. Como HP mostró, todavía puede hacer un JIT para ejecutar el código de manera más eficiente, incluso en la misma plataforma.

 2
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 17:55:50

Java proporciona tres distintos tipos de portabilidad:

Portabilidad del código fuente: Un programa Java dado debe producir resultados idénticos independientemente de la CPU subyacente, el sistema operativo o el compilador Java.

Portabilidad de la arquitectura de CPU: los compiladores Java actuales producen código objeto (llamado byte-code) para una CPU que aún no existe. Para cada CPU real en la que se pretende ejecutar programas Java, un intérprete de Java o virtual máquina, "ejecuta" el código J. Esta CPU inexistente permite que el mismo código objeto se ejecute en cualquier CPU para la que exista un intérprete Java.

Portabilidad OS / GUI: Java resuelve este problema proporcionando un conjunto de funciones de biblioteca (contenidas en bibliotecas suministradas por Java como awt, util y lang) que hablan con un sistema operativo imaginario y una GUI imaginaria. Al igual que la JVM presenta una CPU virtual, las bibliotecas Java presentan un SO/GUI virtual. Cada implementación de Java proporciona bibliotecas implementando este sistema operativo virtual / GUI. Programas Java que utilizan estas bibliotecas para proporcionar el sistema operativo necesario y el puerto de funcionalidad GUI con bastante facilidad.

Ver este enlace

 2
Author: Gaurava Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 03:13:03

Necesita la JVM para diferentes arquitecturas, pero por supuesto sus programas Java se ejecutan en esa JVM. Así que una vez que tienes una JVM para una arquitectura, entonces tus programas Java están disponibles para esa arquitectura.

Así que puedo escribir un programa Java, compilarlo en bytecode Java (que es independiente de la arquitectura), y eso significa que puedo ejecutarlo en cualquier JVM en cualquier arquitectura. La JVM abstrae la arquitectura subyacente y mi programa se ejecuta en una máquina virtual.

 1
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 16:43:29

La idea es que el lenguaje Java es portable (o más exactamente, el código de bytes compilado es portable). Tiene razón en que cada máquina virtual requiere una implementación específica para un perfil de hardware determinado. Sin embargo, una vez que se ha hecho ese esfuerzo, todo bytecode java se ejecutará en esa plataforma. Escribes el código java / bytecode una vez, y se ejecuta en cualquier JVM.

. NET es bastante similar, pero con un énfasis mucho menor en el principio. El CLR es análogo a la JVM y se tiene su propio bytecode. Mono existe en * nix, pero tienes razón de que no es "oficial".

 1
Author: Kirk Woll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 16:44:43

Portabilidad o como está escrito en Wikipedia, Portabilidad de software es la capacidad de reutilizar el mismo software (código) en múltiples entornos (sistemas operativos). La JVM java es una JVM que se puede ejecutar en cualquier sistema operativo para el que fue diseñada: Windows, Linux, Mac OS, etc.

En.NET, es posible portar su software a diferentes plataformas. De Wikipedia:

El diseño de. NET Framework permite que teóricamente sea plataforma agnóstico, y así multiplataforma compatible. Es decir, un programa escrito para usar el framework se debe ejecutar sin cambio en ningún tipo de sistema para los cuales el marco es aplicado.

Y debido a que Microsoft nunca implementó.NET framework fuera de Windows y al ver que. NET es independiente de la plataforma, Mono ha hecho posible ejecutar aplicaciones. NET y compilar código para ejecutarlo en Linux.

Para lenguajes como C++, Pascal, etc. usted tendrá que ir a cada sistema operativo y construirlo en esa plataforma para ejecutarlo en esa plataforma. El archivo EXE en Windows no es el mismo que el .so en linux (el código máquina) ya que ambos usan diferentes bibliotecas para hablar con el núcleo y cada sistema operativo tiene su propio núcleo.

 1
Author: Buhake Sindi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 16:54:28

WORE-Escribe Una vez Corre por todas partes

En realidad, esto se limita a las plataformas que tienen una JVM, pero esto cubre la mayoría de las plataformas en las que desea implementar. Está casi a medio camino entre un lenguaje interpretado y un lenguaje compilado, ganando los beneficios de ambos.

 0
Author: Codemwnci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 17:28:19