¿Por qué Google no compila el código fuente directamente de Java a Dalvik bytecode?

Básicamente, eso es lo que Google está haciendo ahora con la cadena de herramientas Jack y Jill que están creando para reemplazar la cadena de herramientas Javac que es la predeterminada al convertir el código fuente de Java al código de bytes Dalvik.

Jack es una abreviatura de Java Android Compiler Kit. Jack es un compilador que toma el código fuente de Java y lo compila directamente en el formato de archivo Dex para Android. Mirando el código fuente, en realidad compila el código fuente de Java directamente a lo que se llama “Jack IR”, que luego se alimenta a través de una representación AST (Árbol de sintaxis abstracta) del Jack IR y luego genera una forma de código de bytes Dalvik.

Tiene razón sobre el proceso actual del compilador JAVAC que al tener dos pasos en el proceso de convertir la fuente Java, se pierde MUCHA información sobre el programa. Lo que eso significa es que las optimizaciones progresivas para el IR no son tan eficientes porque en Javac va desde:

Código fuente Java ——> Java Bytecode ——-> (Herramienta Dex) —— Dalvik Bytecode.

Al eliminar por completo el paso Java Bytecode y la herramienta Dex utilizada para convertir el bytecode de Java a dalvik bytecode, tiene un lenguaje fuente completamente representado (en este caso, Java) dentro del “Jack IR” que luego puede optimizarse progresivamente mediante la aplicación (Tres transformaciones de código de dirección), y tal. En términos simples, el código de bytes de Dalvik que es generado por Jack es mucho más eficiente y rápido que lo que actualmente hace el compilador estándar de Oraclec Javac.

Entonces viene Jill! Jill representa el enlazador de biblioteca intermedio Jack. Básicamente, Jill tiene dos cosas MUY importantes que tiene. Primero, compila los archivos de recursos utilizados en su código fuente en su propio archivo de biblioteca .jack.

Jayce es un HIR que significa un código de representación intermedia alta. Es la parte de alto nivel del “Jack IR”. Una vez que los archivos de clase de bytecode de Java se convierten de archivos JAR, se transforman en formato JAYCE que luego se alimenta al compilador Jack y luego se reduce a tres códigos de dirección, luego a dalvik bytecode.

PD: Tuve que volver a editar mi publicación de hace un año porque contenía más especulaciones que hechos en el momento actual. La información anterior ahora se basa en lo que hace actualmente Jack.

Además, al contrario de lo que la mayoría de la gente dice actualmente, Jack hace optimizaciones, pero lo hace en la representación del código de tres direcciones del Jack IR y NO usa proguard para las optimizaciones. Solo usa proguard para reducir y ofuscar una aplicación.

Las optimizaciones que realiza Jack se enmarcan en lo que se llama “optimizaciones de mirilla”, que son básicamente optimizaciones que reemplazan pequeños fragmentos de código Java por otros más eficientes durante el tiempo de compilación. Vea a continuación las optimizaciones que hace Jack.

Actualmente, Jack produce código que es entre un 8 y un 9% más rápido que lo que el compilador Javac produce a partir de diciembre de 2015. También tenga en cuenta que las cifras se tomaron de la combinación de Jack con el compilador optimizador ART, cuyo rendimiento es acumulativo. Probablemente sea más bajo para el compilador rápido de androides en versiones anteriores de ART y dalvik.

Aquí están mis referencias:

Nueva cadena de herramientas Android experimental – Jack and Jill – Sitio de proyecto de herramientas de Android

Optimizaciones que Jack realiza en Jack IR … https: //android.googlesource.com….

Instantánea de rendimiento de Jack a diciembre de 2015
https://www.slideshare.net/mobil…

No he usado Dalvik, pero he escrito varios compiladores y ensambladores (incluido un compilador y ensamblador incremental de Java). Aquí hay algunos pensamientos sobre los aspectos técnicos de la pregunta:

  1. No hay “paso adicional”, per se. Los compiladores y ensambladores usan formas intermedias todo el tiempo, por lo que no es inusual usar código de bytes Java como forma intermedia.
  2. La idea de que sería “más lenta” es bastante tonta. La conversión de un conjunto de instrucciones a otro (en este caso, un conjunto de instrucciones que fue diseñado para admitir las características del primer conjunto de instrucciones) debe ser casi instantánea.
  3. Primero, ¿por qué crees que sería “más difícil optimizar el bytecode de salida”? Esa parece ser una afirmación sin fundamento. En segundo lugar, hay muy pocas optimizaciones que uno puede hacer a nivel de bytecode; Es el compilador nativo (por ejemplo, JIT) que realiza las optimizaciones “reales”.
  4. Al usar bytecode como entrada, significa que no se requiere código fuente; Si se puede convertir el código de bytes de Java a la plataforma de destino (en este caso, Dalvik), es posible tomar bibliotecas y aplicaciones que no están disponibles en forma de origen y ejecutarlas.
  5. También es un compilador menos que necesita ser escrito.
  6. Al trabajar desde bytecode, también permitiría el uso de código no Java (por ejemplo, Scala).

Desde un punto de vista técnico, esta es la razón por la cual la compatibilidad es importante, y por eso creo que es importante invertir en la compatibilidad con Java en toda la amplia y diversa industria de Java (consulte el Programa Java Community Process (SM), por ejemplo). Al tener el lenguaje y las API y el código de bytes bien especificados, y al tener una gran cantidad de trabajo (marcos, herramientas, aplicaciones, etc.) que se adhieren a esas especificaciones, es posible lograr algunas hazañas técnicas increíbles.

(Según la política de la empresa, no puedo comentar sobre los aspectos legales).

En aras de la divulgación completa, trabajo en Oracle. Las opiniones y opiniones expresadas en esta publicación son mías y no reflejan necesariamente las opiniones u opiniones de mi empleador.

Porque el lenguaje Java introduce nuevos JDK (ahora JDK 8) con frecuencia. Entonces, la JVM también debe optimizar de acuerdo con la versión JDK para agregar al dispositivo móvil. Por lo tanto, es difícil hacer eso cada vez. Pero el código de bytes de Java estaba más o menos escrito en piedra. Entonces decidieron compilar el código de bytes de Java en el código Dex (Dalvik compiler-JIT).

más información:
Diferencia de DVM y JVM en el mundo de Android

Me gustaría explicar el punto 4 de la excelente respuesta de Cameron Purdy, ya que creo que es la razón principal:

Diría que el proceso es más complejo en el sentido de que hay más capas involucradas (`Java -> bytecode -> dex` en lugar de` Java -> dex`) pero aquí falta una pieza: la capa intermedia (bytecode) funciona como una capa de abstracción, lo que significa que oculta los pasos anteriores de los anteriores. Básicamente, puede usar cualquier cosa que desee para llegar al código de bytes y (en teoría) no importa qué idioma o cadena de herramientas haya utilizado. Esto es algo muy bueno y vale la pena todo el problema (que por cierto no es mucho).

¿Por qué entonces bytecode? ¿Por qué no aceptar como entrada otro formato? bueno, creo que ya sabes la respuesta a eso 😉

La traducción del código bye les permite utilizar las herramientas existentes, como los compiladores.

More Interesting

Soy un novato en programación y quiero hacer una calculadora para Android. Sé algunos conceptos básicos de Java y XML. ¿Debo construirlo desde cero o ver una muestra?

Cómo aprender a desarrollar aplicaciones de Android de manera rápida y efectiva

¿Cuáles son los consejos para los desarrolladores nativos de iOS que desean aprender el desarrollo nativo de Android?

Cómo hacer que la gente descargue mi aplicación en Android

¿Cómo aprender el desarrollo de aplicaciones de Android por mi cuenta? Aprendí Java en NetBeans con MySQL en mi escuela. ¿Puedo aprenderlo a través de internet?

¿Cuál debería ser el enfoque de un principiante mientras aprende RecyclerView y el diseño de materiales en Android?

¿Es posible desarrollar una sola aplicación de Android con Google Firebase que se ocupe tanto de médicos como de pacientes?

¿Por qué Java no utiliza GC de conteo de referencias?

¿Es posible desarrollar una aplicación de Android sin software o aplicaciones de terceros?

¿Cuál es el beneficio de usar Xamarin para el desarrollo de aplicaciones sobre Java nativo y Swift?

¿Qué busca Achievers en una aplicación de cartera de desarrolladores de Android junior cuando contrata?

Cómo aprender a codificar aplicaciones simples de Android si ya conozco la programación básica

¿Cuáles son algunas aplicaciones que cambian la vida de Android?

¿Cuáles son las principales empresas de desarrollo de aplicaciones móviles en todo el mundo para los servicios de desarrollo de aplicaciones de Android y iPhone?

¿Hay alguna manera de verificar que haya tenido una 'conversación secreta' en la aplicación de mensajería en Android?