2010-08-24 28 views
106

Bien, esto realmente debería pedírselo a alguien de Google, pero solo quiero otras opiniones.¿Por qué Android usa Java?

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 2-5 veces más rápidas. Esto significa que el uso de Java sobre el 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 ningún motivo para usarlo eso.

+11

El código de Java no se interpreta, al menos no en Android: se compila y se ejecuta en una máquina virtual. –

+3

Pensé que Sun demostró que Java puede ser (en algunas áreas, pero a menudo casi) tan rápido como el código nativo. Además, los chicos de Google son un paquete inteligente: confío en que el JIT que introdujeron recientemente tarde o temprano producirá un código muy bueno. – delnan

+0

Acerca del problema de rendimiento, ¿no es el código nativo siempre más rápido que bytecode? ¿Dado que la CPU puede ejecutarlo directamente sin una máquina virtual? No estoy familiarizado con la forma en que funcionan Dalvik y otras máquinas virtuales, pero primero se debe traducir bytecode a código de máquina, y eso debe consumir mucho rendimiento con solo copiar a la memoria RAM y ejecutar código nativo ... –

Respuesta

88

Algunos puntos:

  1. Java es un lenguaje conocido, los desarrolladores lo saben y no tienen que aprender

  2. que es más difícil para disparar a sí mismo con Java que con el código C/C++ desde que no tiene la aritmética de punteros

  3. que se ejecuta en una máquina virtual, por lo que no hay necesidad de volver a compilar para cada teléfono por ahí y fácil de asegurar

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

  5. varios teléfonos móviles que ya se utiliza Java ME, por lo que Java se conoce en la industria

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

+5

Correr en una VM (por lo tanto, no recompilar) es una gran ventaja. Además, separa fácilmente los procesos entre sí, evitando que una aplicación deshonesta destruya su teléfono o interfiera con otras aplicaciones – Falmarri

+1

Acerca de la aplicación deshonesta, esto suena interesante. Corrígeme si estoy equivocado, pero las CPU x86 tienen protección biult a través de los modos de paginación y timbre, 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 la del OS API. ¿Pero esta característica tiene CPU ARM? De hecho, no tengo idea. Si no, esto sería genial + para Java en esta plataforma. –

+0

La CPU no tiene nada que ver con una aplicación maliciosa que hace cosas nefastas – Falmarri

1

En primer lugar, es casi lo mismo Windows Mobile o el iPhone, el .NET Framework necesita su propia máquina virtual, así como el cacao.

E incluso si el rendimiento no es el mejor, porque es una interpretación del código de bytes, Android ofrece a toda la comunidad java como posibles desarrolladores. Más aplicaciones, más clientes, etc.

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

+0

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

1

El nuevo JIT ejecuta las aplicaciones 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.

37

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

+7

sí. Java es la fuente, pero no está compilada para el código de bytes compatible con la máquina virtual java. Esta es la razón por la que probablemente todos/la mayor parte de la disputa de patentes con Sun/Oracle. Solo están usando la sintaxis del lenguaje. –

+1

Aún debe admitir la mayoría de las funciones de java vm. Entonces no pueden optimizarlos. – josefx

+1

Entonces, ¿por qué la necesidad de instalar el JDK cuando se desarrolla en Android? ¿Es solo para el emulador? – jiggunjer

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 (algo así como) listos para desarrollar su plataforma móvil.

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

+1

Creo que todas las personas interesadas en el desarrollo móvil también están interesadas en lenguajes "más fríos" que Java. – Earlz

17

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 Android permite a los usuarios ejecutar aplicaciones semi-confiables que podrían explotar el teléfono de maneras realmente desagradables sin una seguridad excelente. Al ejecutar todas las aplicaciones en una máquina virtual, usted garantiza que ninguna aplicación puede explotar el núcleo del sistema operativo a menos que haya un defecto en la implementación de la máquina virtual. 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 se compilan programas para codificar una máquina virtual, no es necesario recompilarlos para hardware nuevo. El mercado de los chips telefónicos es diverso y cambia rápidamente, así que eso es un gran problema.

Además, el uso de Java hace que sea menos probable que las aplicaciones que las personas escriben sean explotables. Sin exceso de memoria, errores con punteros, etc.

4

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

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

¿Puede copia de seguridad de tu conjetura rendimiento con algunos puntos de referencia reales?El alcance de sus presunciones no parece justificado dada la información de antecedentes inexacta que proporciona.

11

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

¿Por qué Java?

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

  • Hay un gran número de desarrolladores que ya son competentes en Java.

  • Java tiene un gran soporte de código abierto, con muchas bibliotecas y herramientas disponibles para que los desarrolladores sean más fáciles.

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

  • Java que permite crear aplicaciones de recinto de seguridad, y crear un mejor modelo de seguridad de modo que uno mala aplicación no puede derribar todo su sistema operativo.

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 familiar para muchos desarrolladores móviles existentes. Por último, diría que es una apuesta contra el futuro: independientemente de los problemas de rendimiento que existan, ya que el hardware mejora. Igualmente, al hacer que los desarrolladores codifiquen contra una abstracción, Google puede arrancar y cambiar el sistema operativo subyacente. fácilmente, que si los desarrolladores estuvieran codificando las API de POSIX/Unix.

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

Dado que casi todas las máquinas virtuales JIT compilan hasta el código nativo, la velocidad del código sin formato a menudo es comparable con la velocidad nativa. Una gran cantidad de retrasos atribuidos a los lenguajes de alto nivel tienen menos que ver con la sobrecarga de la VM que otros factores (un tiempo de ejecución de objetos complejo, acceso a la memoria de 'seguridad' al verificar los límites, etc.).

Recuerde también que, independientemente del idioma 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 solo encadena las llamadas API juntas.

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