H2JVM es una biblioteca en Haskell, aún en fases muy iniciales, que permite generar bytecode de la máquina virtual de Java (JVM) desde código funcional con un enfoque de alto nivel. Su objetivo es que los desarrolladores de compiladores hacia la JVM no tengan que lidiar con los detalles de bajo nivel del formato de clase, como el análisis de StackMapTable, la resolución de etiquetas y desplazamientos o el cálculo de max stack y max locals.
El proyecto se articula en torno a un constructor de clases, ClassBuilder, que permite definir el nombre de la clase, la versión de Java objetivo (por ejemplo, Java 8) y los indicadores de acceso, y añadir métodos con su descriptor, indicadores y cuerpo. Dentro del cuerpo, las instrucciones se emiten con funciones como emit, y elementos como ILoad, IAdd o IReturn, además de saltos condicionales (IfICmp con sus variantes IfGt, IfEq, etc.) y etiquetas (Label). El uso de mónadas permite encadenar la generación de instrucciones de forma legible, mientras que la biblioteca se encarga internamente de calcular tamaños de pila, locales y mapas de pila.
El autor incluye dos ejemplos: uno mínimo que genera un método estático add(int, int) que suma dos enteros y serializa el resultado a un archivo .class, y otro más realista que implementa el operador mayor que (>) en un lenguaje propio. En este segundo caso se muestra cómo las etiquetas declaradas con newLabel se resuelven automáticamente a los desplazamientos correctos dentro del flujo de bytecode, generando comparaciones como if_icmpgt con saltos a offsets concretos.
El estado actual del proyecto es temprano: solo se ha implementado un subconjunto reducido de instrucciones y atributos de la especificación del formato de clase. El autor solicita comentarios sobre el diseño de la API antes de ampliar la cobertura. El repositorio está disponible en GitHub bajo la organización ElaraLang.
