Java sanal makinesi

Java Sanal Makinesi (JSM), Java platformunun nesne modülü (İng. object module) formatı olan class uzantılı sınıf dosyalarının belleğe yüklenip çalıştırılması için gereken hizmetleri sunan bir sistem programıdır ve temel görevinin sınıf dosyalarını yorumlamak olduğu söylenebilir. Ancak, JSM'ni salt bir yorumlayıcı olarak görmek büyük haksızlık olur. Zira, yorumlama ile birlikte JSM'nin şu görevleri de vardır.

Yukarıdaki maddelerin ayrıntısına girmeden önce sınıf dosyalarının bazı özelliklerine değinmekte yarar olacaktır. Java platformunun standardize edilmiş nesne modülü formatı olan bu dosya çeşidinin DLL, EXE ve a.out formatlarındaki nesne modülü dosyalarına benzer işlev gördüğü söylenebilir. Nasıl ki, DLL, EXE ve a.out dosyaları üstbilgilerin yanı sıra programın çalıştırılacağı bilgisayarın makine kodu komutlarından oluşur, sınıf dosyaları da tanımlanan türün üstbilgilerine ek olarak Java platformunun makine kodu olarak düşünülebilecek Bytecode komutlarını içerir. Her iki durumda da, nesne modülünün oluşturulmasında kullanılan kaynak dosyanın hangi programlama dilinde yazıldığı bilinmez.

Örneğin, Pascal ile yazılmış bir dosyanın derlenmesi ile oluşturulmuş bir nesne modülü, daha sonra C ile yazılmış bir programın derlenmesiyle oluşturulan bir diğer nesne modülüyle bağlanarak kullanılabilir. Java platformu için geçerli olan benzer bir senaryo soldaki şekilde verilmiştir. Bu şekle göre, A şirketi tarafından Groovy kullanılarak yazılmış olan a.groovy dosyasının derlenmesi ile oluşturulan a.class ve B şirketi tarafından Jython kullanılarak üretilen b.py dosyasının derlenmesi ile oluşturulan b.class dosyaları, her iki şirketin de ortak müşterisi olan bir geliştiricinin yazdığı Prog.java içinden kullanılıyor. Dikkat edilecek olursa, şeklin müşteri tarafında bulunan sınıf dosyaları ilişkin kaynak dosyasının hangi dilde yazıldığını ele vermiyor.

Bütün bu koşutluklara karşın, sınıf dosyası formatı diğer nesne modülü formatlarından önemli farklılıklar gösterir. Öncelikle, herhangi bir mimariye ait makineler için işletim dizgesine bağlı olarak genelde birbirlerinden bağımsız geliştirilmiş ve birbirleriyle uyumsuz olan çeşit çeşit nesne modülü formatı bulunabilir. Bu, bir platform için oluşturulmuş nesne modülünün bir diğer platformda işe yaramayacağı anlamına gelir. Örneğin, IA32 mimarisinden işlemciye sahip bir bilgisayarda Linux altında oluşturulmuş a.out formatındaki bir nesne modülü, Windows XP altında doğrudan kullanılamayacaktır. Buna karşılık, formatı Java platformu ile birlikte standardize edilen sınıf dosyaları, Java Çalıştırma Ortamı'nın bulunduğu bütün platformlarda çalıştırılabilecektir.

Bir diğer farklılık, JSM'nin ve sınıf dosyası formatının baştan itibaren güvenlik düşünülerek tasarlanmış olmasından kaynaklanır.[1] Dosyanın üstbilgisi ve içeriği arasındaki tutarlılığın denetimi ile başlayan denetimleri kod bölümlerindeki Bytecode komutlarının geçerliliği ve doğruluğu denetlenerek yapılan denetimler izler. Örneğin, sınıf dosyasının ilk dört sekizlisinde sınıf dosyası formatınca öngörülen 0xCAFEBABE değerinin olup olmadığı, altalan ve metotlara dair üstbilgilerin dosya içeriğindeki durumla uyuşup uyuşmadığı kontrol edilir; sıçrama komutlarının içinde bulunulan metodun sınırları dışına çıkmadığı veya tanımlayıcılara tür uyumlu değerler sağlandığı garanti edilir.

Sınıf dosyalarının kod içeriğini oluşturan Bytecode'un yüksek düzey kavramlara yönelik özellikler taşıyan bir ara dil olması, bu dili bildik makine kodu dillerinden farklı kılar. Örneğin, Bytecode dilinde nesne yaratmak amacıyla kullanılabilecek komutların yanı sıra çokbiçimliliğin gerçekleştiriminin temelindeki dinamik iletimi olanaklı kılan komutlar da vardır; ayrıca, yazılım güvenilirliğini sağlamakta yararlanılabilecek ayrıksı durum kotarımı ile ilgili komutlar da JSM için derleyici yazmak isteyen programcıların işini kolaylaştırır. Makine dillerince doğrudan desteklenmeyen bu tür komutların varlığı, diğer türden nesne modülleri fiziksel olarak var olan bir makine üzerinde yorumlanarak çalıştırılırken, sınıf dosyalarının Bytecode dilinden haberdar olan bir soyut makine üzerinde yorumlanarak çalıştırılması gerekliliğini doğurur.[2] Bunun beklenen bir sonucu olarak, yüksek düzey bir dilin doğrudan yorumlanmasına oranla daha hızlı olmasına karşın, sınıf dosyalarının çalışma hızı diğer nesne modüllerinden daha yavaş olacaktır. İşte tam bu noktada, JSM gerçekleştirimleri çalıştırılmakta olan kodun anında derlenmesini yaparak çalışma hızını yükseltmeye çalışırlar.

JSM'nin değineceğimiz son özelliği, programcıların daha hızlı kod geliştirmelerine olanak tanıyan çöp toplama birimidir. JSM'nin bir parçası olarak gerçekleştirilen çöp toplayıcı, yığın bellekte kullanılmaz hale gelen bölgelerin geriye döndürülmesini sağlar. Böylece, yığın belleğin yönetiminden azat edilmiş olan programcılar, zamanlarını çözmek istedikleri soruna harcayacak ve daha kısa sürede daha sağlıklı bir kodun gerçekleştirilmesi mümkün olacaktır.