JVM Bytecode'u Nedir? Java Sınıf Dosyaları Açıklaması

JVM bytecode'u, Java Sanal Makinesi'nin çalıştırdığı kompakt komut kümesidir. .class dosyalarının nasıl çalıştığını, modların bytecode'u neden yeniden yazdığını ve ASM'nin burada nasıl devreye girdiğini öğrenin.

Conceptsby trqUpdated June 4, 2026
Key takeaways
  • JVM bytecode, Java Sanal Makinesi tarafından yürütülen kompakt komut kümesidir.
  • Java derleyicisi, yerel makine kodu yerine .class dosyalarında bytecode üretir.
  • Aynı .class dosyası, bir Java çalışma zamanına sahip herhangi bir platformda çalışır; bu da formatın amacıdır.
  • Modlar, kaynağını asla değiştirmeden derlenmiş oyunu değiştirmek için bytecode'u yeniden yazar.

JVM bytecode'u, Java Sanal Makinesi'nin (JVM) çalıştırdığı komut kümesidir. Java kaynak kodunu derlediğinizde, derleyici CPU'nuz için makine kodu üretmez. Bunun yerine, .class dosyalarında saklanan kompakt ve taşınabilir bir biçim olan bytecode üretir. JVM, bu komutları çalışma zamanında okur ve bunları çalışırken yerel koda dönüştürür.

Opal Nerede Çalışır

Opal, bir Fabric modudur ve üzerine inşa ettiği modlama araçları sizin için bytecode işlerini yapar, bu yüzden elle opcode'lara dokunmanıza gerek kalmaz. Düz JavaScript ile davranış eklemek istiyorsanız, scripting tanıtımını inceleyin.

Kaynak nasıl bytecode'a dönüşür

Bir .java dosyası, bir kişinin yazdığı bir metindir. Bir .class dosyası ise, JVM'nin çalıştırdığı derlenmiş çıktıdır. Derleyici, kaynak kodunuzu okur, kontrol eder ve her sınıf için bir .class dosyası yazar; her dosya, bytecode talimatları, sabit havuz, yöntem tabloları ve diğer meta verileri içerir.

Bytecode herhangi bir işlemciye bağlı değildir. Aynı .class dosyası, Windows, macOS, Linux veya bir Java çalışma zamanına sahip herhangi bir şeyde çalışır, çünkü JVM, yerel makinede talimatları yürütmeyi bilen katmandır. Bu taşınabilirlik, formatın tamamı işte budur.

Talimatlar nasıl görünür

Bytecode, yığın tabanlı bir talimat kümesidir. Çoğu işlem, değerleri bir operand yığına iterek, onlardan çıkararak ve bir sonuç iterek çalışır. Düşünülmesi gereken kayıt ayırma yoktur; model, JVM'nin bunu hızlı bir şekilde doğrulayabilmesi ve çalıştırabilmesi için kasıtlı olarak basittir.

Birkaç örnek opcode, genel bir fikir verir:

OpcodeNe yapar
iloadBir int yerel değişkeni yığına iter
iaddİki int'i yığından çıkarır, toplamlarını iter
invokevirtualBir örnek yöntemi çağırır
getfieldBir örnek alanı okur
returnBir yöntemden döner

Bunları nadiren elle okur veya yazarız. Araçlar bunları oluşturur ve tüketir; bu da ASM gibi bir kütüphanenin devreye girdiği yerdir.

Modlar için bytecode neden önemlidir

Bytecode önemlidir çünkü orijinal kaynağı olmadan davranışı değiştirmenizi sağlar. Bir Minecraft modunun neredeyse hiç oyunun kaynak kodunu yoktur. Sahip olduğu şey, diskteki derlenmiş oyundur. Bir özelliği eklemek veya değiştirmek için bir mod, mevcut bytecode'u okur, yeniden yazar ve sonucu sınıflar yüklendiğinde JVM'ye geri gönderir.

İşte yamalama çerçevelerinin, sahip olmadıkları yöntemlere nasıl yerleştirme (hook) yaptığı. Doğru yeri derlenmiş bir yöntemde bulurlar ve modun koduna bir çağrı eklerler. Bytecode düzeyinde çalışmak, bir modun orijinal Java'nın bir satırını bile görmeden bile oyuna bağlanmasını sağlar.

ASM'nin Yeri

ASM, bytecode'u okuma, yazma ve dönüştürme için bir Java kütüphanesidir. Bir .class dosyasını olaylara veya bir ağaca ayrıştırır, kodun talimatları değiştirmesine izin verir ve geçerli bir .class dosyasını geri verir. Küçük, hızlıdır ve ham formata yakın çalışır, bu nedenle daha üst düzey modlama araçları, sınıf dosyalarını kendileri ayrıştırmak yerine bunun üzerine inşa eder.

Çoğu mod yapımcısı ASM'yi doğrudan çağırmaz. Opcodları gizleyen ve "bu yöntemin başında benim kodumu çalıştır" demek için daha kullanıcı dostu bir yol sunan daha üst düzey bir katmanı kullanır. Altında, o katman bytecode düzenler, genellikle ASM aracılığıyla.

SSS