O que tem em um .class do Java? A developer explains the binary structure of Java .class files, including the CAFEBABE magic number, version info, and constant pool, as part of a series on compiling Brainfuck to JVM bytecode. The post demonstrates reading a compiled Hello.class with xxd and outlines the big-endian byte ordering required when generating class files in Node.js. Na parte 1 https://codesilva.com/programacao/2026/03/16/compilando-brainfuck-pra-jvm-parte-1-o-interpretador a gente construiu um interpretador de Brainfuck com tokenizer, parser e uma Representação Intermediária. Agora a gente precisa entender o formato que a JVM espera receber pra poder gerar nosso próprio bytecode. Quando você roda javac Hello.java , o compilador gera um Hello.class . Esse arquivo é binário - não é texto, não é JSON, não é XML. São bytes crus numa estrutura muito específica definida na especificação da JVM https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-4.html . Nesse post, a gente vai abrir um .class com xxd , entender cada byte, e construir um gerador que monta essa estrutura do zero em Node.js. A JVM usa big endian pra representar números de múltiplos bytes. Isso é importante porque o processador do seu computador x86/ARM provavelmente usa little endian, que é a ordem inversa. Qual a diferença? Imagina o número 30.000 em hex: 0x7530 . Ele ocupa 2 bytes: | Formato | Byte 1 | Byte 2 | |---|---|---| | Big endian | 0x75 | 0x30 | | Little endian | 0x30 | 0x75 | Big endian coloca o byte mais significativo primeiro. Little endian coloca o menos significativo primeiro. No nosso gerador, toda vez que a gente escrever um número de 2 ou 4 bytes, precisa respeitar essa ordem. A função pra converter um número de 16 bits 2 bytes pra big endian: function intTo2Bytes num { return num 8 & 0xFF, num & 0xFF ; } O 8 desloca 8 bits pra direita, pegando o byte alto. O & 0xFF mascara o byte baixo. Pra 4 bytes, a lógica é a mesma mas com mais shifts. Se você errar a ordem dos bytes, a JVM vai ler valores completamente errados. Um 0x7530 30.000 vira 0x3075 12.405 se os bytes ficarem invertidos. Então se o seu .class gerado dá erros estranhos no constant pool , confere se você tá escrevendo big endian. Vamos criar o programa Java mais simples possível: public class Hello { public static void main String args { return; } } Compila com javac Hello.java e abre o binário com xxd Hello.class : 00000000: cafe babe 0000 0034 000d 0a00 0200 0307 .......4........ 00000010: 0004 0c00 0500 0601 0010 6a61 7661 2f6c ..........java/l 00000020: 616e 672f 4f62 6a65 6374 0100 063c 696e ang/Object...