Learn · concepts

ASM (Java Bytecode) Nedir? Kütüphane Açıklaması

ASM, çalışma zamanında JVM bytecode'unu okuma ve yazma için bir Java kütüphanesidir. İşte ne yaptığı, nasıl çalıştığı ve neden Minecraft modlarının buna güvendiği.

TRtrolPublished 3 min read

Minecraft modlamada ASM nedir?

ASM, JVM bytecode'unu okuma, değiştirme ve yazma için bir Java kütüphanesidir. Kaynak kod yerine derlenmiş .class dosyaları üzerinde çalışır, böylece bir sınıfı yeniden derlemeden inceleyebilir veya yeniden yazabilir. Minecraft modları, oyunun yüklenme zamanında yamalanmasına olanak tanıdığı için ASM'ye güvenir, oyun zaten derlenmiş olsa bile.

Bytecode yamalamanın var olma nedeni

Minecraft oyunu kaynak kod olarak değil, derlenmiş bytecode olarak gelir. Bu, bir mod yazarının kaynağı değiştirep tüm oyunu yeniden derleyemeyeceği anlamına gelir: kaynak mevcut değildir. Sahip olmadığınız kodu yamalmanın tek yolu, Java Sanal Makinesi'nin aslında çalıştırdığı komut seti olan bytecode düzeyinde müdahale etmektir. ASM, bu iş için pratik bir araçtır.

ASM nasıl çalışır

ASM, derlenmiş bir sınıfı bir programın düzenleyebileceği bir şeye dönüştürür. Bir .class dosyası sadece bytecode'dur, Java Sanal Makinesi'nin çalıştırdığı komutlardır. ASM bu bytecode'u ayrıştırır, size yöntemleri ve alanları sunar ve komutları eklemenize, silmenize veya değiştirmenize olanak tanır. Ardından yeni, geçerli bir sınıfı tekrar yazar.

Düz Java tek başına bunu yapamaz. Derleyici, kaynak kodunuzu bir kez bytecode'a dönüştürür ve bundan sonra bytecode sabittir. ASM, normalde yazdığınız kaynağın altındaki katman olan bytecode düzeyinde müdahale eder.

Ziyaretçi deseni ve ağaç API'si

ASM bir ClassReader ile bir sınıf okur ve bir ClassWriter ile yazar. İki aralıkta, kodunuz sınıfın bölümlerini ziyaret eder ve neyi değiştireceğine karar verir. İki yaklaşım vardır:

Ziyaretçi yaklaşımı, sınıfın elemanlarını tek tek işler. Bütün sınıfı aynı anda tutmadığı için hızlıdır ve az bellek kullanır. Ağaç yaklaşımı ise sınıfı, serbestçe gezinebileceğiniz ve düzenleyebileceğiniz nesnelere yükler; bu, daha büyük değişiklikler için akıl yürütmek daha kolay olsa da daha fazla bellek kullanır.

YaklaşımNasıl çalışırEn iyi olduğu durumlar
Ziyaretçi APISınıf olaylarını okuma sırasında akış olarak iletirDüşük bellekli, küçük ve hızlı düzenlemeler
Ağaç APISınıfın düzenlenebilir bir nesne modelini oluştururDaha büyük veya daha karmaşık yeniden yazmalar

Neden Minecraft modları ASM kullanır

Modlar, yazmadıkları ve yeniden derleyemedikleri oyun kodunu değiştirmeleri gerekir. Oyun, derlenmiş sınıflar olarak gelir, bu nedenle tek yol bytecode düzeyindedir ve ASM bunu sağlar. Bir mod, bir oyun yöntemine bir bağlantı ekleyebilir, bir çağrıyı yönlendirebilir veya başlatmada bir alan ekleyebilir.

Çoğu mod geliştiricisi ASM'yi doğrudan çağırmaz. ASM'nin üzerine oturup basit notları alttaki bytecode düzenlemelerine dönüştüren daha üst düzey bir çerçeve olan Mixin'i kullanırlar. Değişikliği açıklayan küçük bir Java sınıfı yazarsınız ve çerçeve ASM ile düşük seviyeli işleri sizin için yapar. Özellikle Fabric modları bu zincire güvenir.

ASM'yi doğrudan değiştireceğiniz zamanlar

Mod yazarısınız olarak ham ASM kodlaması nadiren yazarsınız. Bu durum, bir yükleyici, karıştırıcı veya sınıfları tamamen yeniden yazan bir yamacı gibi, bir notasyonun ifade edemeyeceği daha fazla kontrole ihtiyaç duyan bir araç ortaya çıktığında görülür. Günlük modlar için, üzerindeki notasyon katmanı yeterlidir ve çok daha az hataya açık olur.

Sıkça Sorulan Sorular