Acercarse a las partes internas de Java / JVM [cerrado]

15

He programado en Java durante aproximadamente 8 años y conozco el lenguaje bastante bien como desarrollador, pero mi objetivo es profundizar mi conocimiento de los aspectos internos. He tomado cursos de pregrado en diseño de PL, pero fueron descripciones académicas muy amplias (en Scheme, IIRC).

¿Alguien puede sugerir una ruta para comenzar a profundizar en los detalles? Específicamente, ¿hay temas particulares (por ejemplo, recolección de basura) que podrían ser más accesibles o ser un buen punto de partida? ¿Existe un libro decente de alto nivel sobre los aspectos internos de la JVM y el diseño del lenguaje de programación Java? Mi enfoque actual será comenzar con la especificación JVM y la investigación según sea necesario.

plato giratorio
fuente
2
Mi enfoque personal sería (y es) encontrar la verdadera razón de todos esos pequeños casos de "por qué funciona exactamente así" en Java. Cómo se define el auto-boxing, cómo funcionan los tipos genéricos. ¿Qué pasa con var-args? ¿Qué hace SUPERrealmente la bandera en los archivos de clase? La mayor parte de eso se describe en la especificación JVM, pero requiere un poco de trabajo para sacarlo de allí y meterlo en su cerebro ;-)
Joachim Sauer

Respuestas:

13

Hice un poco de esto cuando comencé con Java, hace años. Mi enfoque era leer las especificaciones de la máquina virtual y observar la salida de javap -c, que muestra el código de bytes desmontado de una clase. También intenté crear clases java con bytecode particular, usando un ensamblador de bytecode java. Hay un ensamblador llamado jasmin , si quieres probar eso.

También puede consultar el documento de traducción de expresiones Lambda que Brian Goetz de Oracle ha publicado, que cubre la estrategia que se utilizará para traducir las lambdas (cierres, esencialmente) que se agregan en Java 8.

También puede obtener el código fuente de la máquina virtual Hotspot de OpenJDK , y la versión de acceso temprano del compilador javac con soporte lambda (repositorio hg) para JDK 8, si realmente desea sumergirse en el extremo profundo de la piscina.

Examinar la recolección de basura es probablemente una buena idea. Una búsqueda rápida apareció en este artículo del Dr. Dobbs sobre el primer GC de basura de Java. No sé si es una buena introducción. Supongo que ya sabe acerca de los recolectores de basura de marca y barrido y generacionales; si no, querrás leer sobre esos primero.

David Conrad
fuente
3

Algunas ideas adicionales:

  • Participe en el proyecto OpenJDK . ¡No hay nada mejor que comprender el funcionamiento interno de algún software pirateándolo!
  • Observe cómo otros lenguajes JVM (por ejemplo, Clojure o Scala) generan código para JVM
  • Haga un mini proyecto que le interese y requiera el uso de componentes internos de JVM. Tal vez usando algo como ASM para manipular bytecode.
mikera
fuente
2

Si aún no está familiarizado con el formato de código de bytes de Java, considere escribir un pequeño compilador que cree un código de bytes de Java válido (o ensamblador Jasmin) y haga que se ejecute correctamente.

Ver "Hello World" o "4" (dado 2 + 2) generado por su código es muy satisfactorio.


fuente