¿Por qué Android usa Java? [cerrado]

114

De acuerdo, esto debería preguntárselo a alguien de Google, pero solo quiero otras opiniones.

Incluso Android admite aplicaciones de código nativo, la principal herramienta de desarrollo es Java. ¿Pero por qué? Quiero decir, ¿no es demasiado lento interpretar el código en un dispositivo móvil? Al presentar Froyo, Google dijo que el nuevo compilador JIT puede lograr aplicaciones de 2 a 5 veces más rápidas. Esto significa que usar Java sobre código nativo es 2 veces más lento.

Sí, sé que usar aplicaciones de código administrado es más seguro en términos de estabilidad del sistema, ya que la máquina virtual tiene un mejor control del programa, pero aún así, esta caída de rendimiento es enorme y no veo por qué usarla.

B.Gen.Jack.O.Neill
fuente
12
El código Java no se interpreta, al menos no en Android: se compila y ejecuta en una máquina virtual.
Radomir Dopieralski
4
Pensé que Sun demostró que Java puede ser (en algunas áreas, pero casi siempre) tan rápido como el código nativo. Además, los chicos de Google son un paquete inteligente: estoy seguro de que el JIT que introdujeron recientemente producirá, tarde o temprano, muy buen código.
1
@ b-gen-jack-o-neill La respuesta es en realidad no, porque la VM puede decir qué código se está ejecutando en tiempo de ejecución y cómo se está ejecutando. Por ejemplo, Apple usa LLVM en OS X con el propósito explícito de optimizar las funciones gráficas críticas para el rendimiento en tiempo de ejecución. Esto se hace específicamente porque es más rápido que las técnicas de código nativo.
PeterAllenWebb
1
@ b-gen-jack-o-neill, el código de bytes de Java se puede compilar en código nativo en tiempo de ejecución.
Mike Daniels
1
@ b-gen-jack-o-neill: la máquina virtual tiene acceso a más información sobre el entorno de excitación que un compilador típico, por lo que puede tomar decisiones más inteligentes. Hasta qué punto esto compensa la sobrecarga adicional variará de una aplicación a otra.
CurtainDog

Respuestas:

98

Algunos puntos:

  1. Java es un lenguaje conocido, los desarrolladores lo conocen y no tienen que aprenderlo

  2. es más difícil dispararse con Java que con código C / C ++ ya que no tiene aritmética de punteros

  3. se ejecuta en una máquina virtual, por lo que no es necesario volver a compilarlo para todos los teléfonos disponibles y es fácil de proteger

  4. gran número de herramientas de desarrollo para Java (ver punto 1)

  5. varios teléfonos móviles ya usaban Java ME, por lo que Java era conocido en la industria

  6. la diferencia de velocidad no es un problema para la mayoría de las aplicaciones; si lo fuera, deberías codificar en lenguaje de bajo nivel

josefx
fuente
5
Ejecutar en una máquina virtual (por lo tanto, no volver a compilar) es una gran ventaja. Además, separa fácilmente los procesos entre sí, evitando que una aplicación maliciosa destruya su teléfono o interfiera con otras aplicaciones
Falmarri
1
Sobre el asunto de las aplicaciones deshonestas, esto suena interesante. Corríjame si me equivoco, pero las CPU x86 tienen protección por medio de los modos de paginación y anillo, por lo tanto, la aplicación no puede cambiar su página en la memoria, por lo tanto, no puede interferir con otra aplicación que no sea el uso de la API del sistema operativo. Pero, ¿esta función tiene CPU ARM? De hecho, no tengo ni idea. Si no, esto sería genial + para Java en esta plataforma.
B.Gen.Jack.O.Neill
La CPU no tiene nada que ver con una aplicación maliciosa que hace cosas nefastas
Falmarri
4
La protección de la memoria es parte de algunas arquitecturas de CPU. Evita que una aplicación malintencionada acceda a la memoria asignada a una aplicación diferente. en.wikipedia.org/wiki/Memory_protection
josefx
1
@Falmarri: Sí, lo hace. Básicamente es muy simple. Su aplicación ha asignado su propio espacio de dirección. Todas las direcciones a las que desea acceder están traducidas por MMU. Quiere acceder a la dirección 0x0000 y MMU la traduce, por ejemplo, a 0x0E21. Y para evitar que cambie la dirección base, su instrucción privilegiada y su programa cuando lo inicia el sistema operativo tiene asignado el nivel de privilegio más bajo. De lo contrario, una sola instrucción CLI (deshabilitar interrupciones) bloquearía el sistema ....
B.Gen.Jack.O.Neill
39

En el nivel de código de bytes, Android no usa Java. La fuente es Java, pero no usa una JVM.

David Thornley
fuente
7
si. Java es la fuente, pero no está compilado en un código de bytes compatible con la máquina virtual Java. Es por eso que probablemente disputarán la mayor parte / toda la patente con sun / oracle. Solo usan la sintaxis del idioma.
John Gardner
1
Todavía tiene que admitir la mayoría de las funciones de java vm. Entonces no pueden optimizarlos.
josefx
1
Entonces, ¿por qué es necesario instalar el JDK al desarrollar en Android? ¿Es solo para el emulador?
jiggunjer
@jiggunjer Android Studio está desarrollado en Java, de hecho. Y también el emulador.
Rudra B. Saraswat
20

La mejora de la estabilidad del sistema es muy importante en un dispositivo como un teléfono celular.

La seguridad es aún más importante. El entorno de Android permite a los usuarios ejecutar aplicaciones de confianza parcial que podrían explotar el teléfono de formas realmente desagradables sin una excelente seguridad. Al ejecutar todas las aplicaciones en una máquina virtual, garantiza que ninguna aplicación pueda explotar el kernel del sistema operativo a menos que haya una falla en la implementación de la VM. La implementación de VM, a su vez, es presumiblemente pequeña y tiene una superficie de seguridad pequeña y bien definida.

Quizás lo más importante es que cuando los programas se compilan para codificar una máquina virtual, no es necesario volver a compilarlos para hardware nuevo. El mercado de chips para teléfonos es diverso y cambia rápidamente, por lo que es un gran problema.

Además, el uso de Java hace que sea menos probable que las aplicaciones que escriben las personas sean explotadas. Sin saturaciones de búfer, errores con punteros, etc.

PeterAllenWebb
fuente
Otra respuesta de David dice que Android no usa
JVM
13

El código nativo no es necesariamente más rápido que el código Java. ¿Dónde muestran los datos de su perfil que el código nativo podría ejecutarse más rápido?

¿Por qué Java?

  • Android se ejecuta en muchas plataformas de hardware diferentes. Debería compilar y optimizar su código nativo para cada una de estas diferentes plataformas para ver los beneficios reales.

  • Hay una gran cantidad de desarrolladores que ya dominan Java.

  • Java tiene un gran soporte de código abierto, con muchas bibliotecas y herramientas disponibles para facilitar la vida de los desarrolladores.

  • Java lo protege de muchos de los problemas inherentes al código nativo, como pérdidas de memoria, mal uso del puntero, etc.

  • Java les permite crear aplicaciones sandbox y crear un mejor modelo de seguridad para que una aplicación incorrecta no pueda acabar con todo su sistema operativo.

Cheryl Simon
fuente
7

En primer lugar, según Google, Android no usa Java. Es por eso que Oracle está demandando a Google. Oracle afirma que Android infringe alguna tecnología Java, pero Google dice que es Dalvik.

En segundo lugar, no he visto un intérprete de código de bytes de Java desde 1995.

¿Puede respaldar su conjetura de desempeño con algunos puntos de referencia reales? El alcance de sus presunciones no parece justificado dada la información de antecedentes inexacta que proporciona.

erickson
fuente
4

Java tiene un argumento bastante convincente para que Google lo use en Android: tiene una gran base de desarrolladores. Todos estos desarrolladores están (en cierto modo) listos para desarrollar para su plataforma móvil.

Tenga en cuenta que, técnicamente hablando, Android no usa Java puro .

Pablo Santa Cruz
fuente
2
Creo que todas las personas interesadas en el desarrollo móvil también están interesadas en lenguajes "más geniales" que Java.
Earlz
4

Como se mencionó en otra parte, el problema principal es que Android está diseñado como un sistema operativo portátil para ejecutarse en una amplia variedad de hardware. También se basa en un marco y un lenguaje familiares para muchos desarrolladores móviles existentes.

Finalmente, diría que es una apuesta contra el futuro: cualquier problema de rendimiento que exista se volverá irrelevante a medida que el hardware mejore, igualmente al hacer que los desarrolladores codifiquen contra una abstracción, Google puede arrancar y cambiar el sistema operativo subyacente mucho más fácilmente, que si los desarrolladores estaban codificando para las API POSIX / Unix.

Para la mayoría de las aplicaciones, la sobrecarga de usar un lenguaje basado en VM sobre el nativo no es significativa (el cuello de botella para las aplicaciones que consumen servicios web, como Twitter, es principalmente de redes). Palm WebOS también lo demuestra, y utiliza JavaScript en lugar de Java como lenguaje principal.

Dado que casi todas las máquinas virtuales JIT se compilan en código nativo, la velocidad del código sin procesar suele ser comparable con la velocidad nativa. Una gran cantidad de retrasos atribuidos a lenguajes de nivel superior tienen menos que ver con la sobrecarga de la VM que con otros factores (un tiempo de ejecución de objeto complejo, comprobación de 'seguridad' del acceso a la memoria mediante comprobación de límites, etc.).

También recuerde que, independientemente del lenguaje utilizado para escribir una aplicación, gran parte del trabajo real se realiza en API de nivel inferior. El lenguaje de nivel superior a menudo es simplemente encadenar llamadas a la API.

Existen, por supuesto, muchas excepciones a esta regla: juegos, aplicaciones de audio y gráficos que superan los límites del hardware del teléfono. Incluso en iOS, los desarrolladores a menudo recurren a C / C ++ para obtener velocidad en estas áreas.

JulesLt
fuente
1

El nuevo JIT ejecuta las aplicaciones de 2 a 5 veces más rápido que el antiguo dalvikVM (ambos JAVA). Entonces, la comparación no es C sobre JAVA, sino JIT sobre dalvikVM.

surfista
fuente
1

En primer lugar, se trata de lo mismo que Windows Mobile o iPhone, el framework .net necesita su propia máquina virtual y cocoa.

E incluso si el rendimiento no es el mejor, debido a que es una interpretación del código de bytes, Android trae a toda la comunidad Java como desarrolladores potenciales. Más aplicaciones, más clientes, etc.

Para terminar, ningún rendimiento no es tan malo, es por eso que java se usa incluso en dispositivos más pequeños (ver JavaMe).

Colin Hebert
fuente
Cocoa no está basado en VM, es todo código nativo compilado, pero a diferencia de C / C ++ puro, tiene un tiempo de ejecución dinámico (similar a Smalltalk / Ruby / Python), que tiene sus propios problemas de rendimiento y optimizaciones. Es notable que la mayoría de los juegos de iPhone son en gran parte C ++ en lugar de Obj-C.
JulesLt