Learn · concepts

Cosa è ASM (bytecode Java)? Spiegazione della libreria

ASM è una libreria Java per la lettura e la scrittura del bytecode JVM a runtime. Ecco cosa fa, come funziona e perché i mod di Minecraft ne dipendono.

TRtrolPublished 4 min read

Cos'è ASM nella modding di Minecraft?

ASM è una libreria Java per la lettura, la modifica e la scrittura del bytecode JVM. Funziona sui file .class compilati invece del codice sorgente, quindi può ispezionare o riscrivere una classe senza ricompilarla. Le mod di Minecraft si basano su di essa perché permette loro di patchare il gioco al momento del caricamento, dopo che il gioco è già stato compilato.

Perché esiste il bytecode patching

Il gioco Minecraft viene distribuito come bytecode compilato, non come codice sorgente. Ciò significa che un autore di mod non può modificare il codice sorgente e ricompilare l'intero gioco: il codice sorgente non esiste. L'unico modo per patchare il codice che non si possiede è intervenire a livello di bytecode, l'insieme di istruzioni che la Java Virtual Machine esegue effettivamente. ASM è lo strumento pratico per questo compito.

Come funziona ASM

ASM trasforma una classe compilata in qualcosa che un programma può modificare. Un file .class è semplicemente bytecode, le istruzioni che la Java Virtual Machine esegue. ASM analizza quel bytecode, ti fornisce i metodi e i campi, e ti permette di aggiungere, rimuovere o modificare le istruzioni. Quindi scrive una nuova classe valida.

Il semplice Java non può farlo da solo. Il compilatore trasforma il tuo codice sorgente in bytecode una volta, e dopo di che il bytecode è fisso. ASM interviene a livello di bytecode, che è lo strato sottostante al codice sorgente che normalmente scrivi.

Il pattern visitor e l'API tree

ASM legge una classe con un ClassReader e ne scrive una con un ClassWriter. Tra i due, il tuo codice visita le parti della classe e decide cosa modificare. Esistono due approcci:

L'approccio visitor scorre la classe elemento per elemento. È veloce e utilizza poca memoria perché non mantiene mai l'intera classe in memoria. L'approccio ad albero carica la classe in oggetti che puoi percorrere e modificare liberamente, il che è più facile da comprendere per modifiche più ampie ma utilizza più memoria.

ApproccioCome funzionaIdeale per
API VisitorTrasmette gli eventi della classe durante la letturaModifiche piccole e veloci con poca memoria
API ad alberoCostruisce un modello di oggetto modificabile della classeRiscritte più grandi o complesse

Perché i mod di Minecraft usano ASM

I mod devono modificare il codice di gioco che non hanno scritto e non possono ricompilare. Il gioco viene distribuito come classi compilate, quindi l'unico modo per accedervi è a livello di bytecode, ed è quello che fornisce ASM. Un mod può iniettare un hook in un metodo di gioco, reindirizzare una chiamata o aggiungere un campo, il tutto all'avvio.

La maggior parte degli sviluppatori di mod non chiama ASM direttamente. Usano Mixin, un framework di livello superiore che si basa su ASM e trasforma semplici annotazioni nelle modifiche al bytecode sottostanti. Scrivi una piccola classe Java che descrive la modifica e il framework esegue il lavoro di basso livello con ASM per te. I mod Fabric in particolare si basano su questa catena.

Quando dovresti toccare direttamente l'ASM

Raramente scrivi ASM direttamente come autore di mod. Questo si presenta quando uno strumento necessita di un controllo maggiore di quanto possa esprimere un'annotazione, come un loader, un offuscator o un patcher che riscrive interamente le classi. Per le mod di tutti i giorni, lo strato di annotazioni sopra è sufficiente ed è molto meno soggetto a errori.

DOMANDE FREQUENTI