H2JVM: biblioteca en Haskell para generar bytecode de la JVM

Fuentes: H2JVM: a Haskell library for writing JVM bytecode in a high-level format
Imagen generada por IA con el prompt: Editor view showing Haskell code on a monitor with JVM bytecode assembly on a second screen, warm desk lamp, dark background, clean technical aesthetic
Imagen generada con IA

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.