java - quién - tabla de codigo bytecode
¿Cuál es el propósito de bytecode en Java? (1)
Estás pensando solo dentro de tu pequeño mundo . Hay algunas razones convincentes para compilar la fuente y entregar bytecode en su lugar:
- Tiempo de descarga (se suponía que los applets se convertirían en una tecnología web ampliamente aceptada): el usuario no tiene necesidad de la fuente, entonces, ¿por qué conservar la fuente? Reducir la cantidad de información transmitida significa descargas más rápidas.
- Reduce el tiempo de inicio. Compilar en cada ejecución lleva más tiempo. Si puede compilar 300 clases por segundo, eso significaría un tiempo adicional de arranque de 5-10 segundos solo en el JRE hoy en día. Y las máquinas fueron un poco más lentas en 1995, ¿sabes?
- Java está dirigido a una multitud de plataformas. Algunas plataformas no son tan poderosas como tu PC. Piensa en dispositivos incrustados y móviles. Es posible que no tengan el almacenamiento ni la potencia para compilar el código.
- Bytecode permite compilar cualquier idioma en bytecode, no solo en Java. Hay muchos otros lenguajes que pueden compilarse a bytecode. ¿Prefiere instalar un nuevo compilador para cada uno de ellos?
- Las empresas a menudo son reacias a dar "la fuente" fuera de sus manos. Java tendría más problemas de aceptación si los programas fueran entregados "en origen".
- Bytecode es una forma de código de máquina lo suficientemente simple como para ejecutarse directamente en el hardware (hay algunos diseños integrados que tienen soporte de bytecode nativo parcial).
Estoy seguro de que aún hay más pros para bytecode que yo.
Dado que puedo compilar 300 clases en segundos, una implementación de Java podría simplemente recibir archivos fuente Java en lugar de bytecode como entrada, luego compilar y almacenar en caché el código fuente de entrada, y nunca volver a compilarlo (por ejemplo, python hace esto, y muchos de las implementaciones de idioma hacen lo mismo, excepto que ni siquiera se molestan en la caché):
- Esta experiencia de compilación inicial sería equivalente al proceso de instalación que los usuarios ya están acostumbrados a
- Esto eliminaría la necesidad de implementar la tarea no trivial de verificación en el intérprete de códigos de bytes (que en realidad solo está reimplementando partes de las comprobaciones del tiempo de compilación), lo que reduce la complejidad de la implementación.
- Como es actualmente, Java verifica el bytecode de entrada cada vez que se inicia, incluso si ya lo ha verificado antes. El punto 2, por supuesto, reduciría los tiempos de inicio porque elimina este paso (aunque la plataforma Java actual también podría almacenar en caché el estado "comprobado" en algún lugar para reducir los tiempos de inicio, no estoy seguro si lo hace)
- Esto permitiría que las implementaciones compilen como quieran (o no lo hagan), por ejemplo, para el rendimiento. Android ni siquiera usa bytecode de Java, usa dalvik bytecode, porque dicen que es más adecuado para sus necesidades (por ejemplo, más rendimiento en su hardware). Si bytecode no existiera, esta decisión de diseño hecha por Google habría sido completamente transparente.
- Esto promovería la fuente abierta
Esto responde por qué distribuyo bytecode en lugar de código nativo, pero para ser claro, me pregunto por qué incluso tengo un formato compilado para la distribución. Suponiendo que la compilación es importante, ¿por qué no simplemente tener el origen de compilación en tiempo de ejecución y almacenarlo en caché?
El único razonamiento que me queda es la ofuscación, pero ...
- de la forma en que compilan los compiladores actuales, el código puede descompilarse mecánicamente con bastante precisión
- el código fuente también puede ofuscarse
... así que este punto se reduce a esa intuición diría que Bytecode es más complicado que el código fuente, por lo que tener un formato de distribución de código de bytes permite engañar a los empresarios para que piensen que su IP está protegida (es decir, bytecode sería "agregar valor", pero no hay una razón técnica para ello).
¿Por qué la plataforma Java está diseñada para distribuir bytecode al usuario, en lugar de distribuir el código fuente al usuario? No pude encontrar una explicación de esto en ninguna parte de Internet. ¿Hay alguna razón importante por la que me pierdo aquí?
Si da una razón, probablemente deba indicar si es una razón que los diseñadores del idioma tuvieron inicialmente, o una razón que todavía es válida hoy.