JIT ve AOT (Ahead-Of-Time) Derleyiciler: Derinlemesine Bir İnceleme

Umut Akbulut
BilgeAdam Teknoloji
4 min readJul 12, 2024

Modern yazılım geliştirme süreçlerinde, performans kritik bir faktördür. Yazılımların verimli çalışması için kullanılan derleyiciler arasında iki önemli teknik bulunmaktadır: Just-In-Time (JIT) ve Ahead-Of-Time (AOT) derleyiciler. Bu yazıda, JIT ve AOT derleyicilerin nasıl çalıştığını, avantajlarını, dezavantajlarını ve Java ile detaylı bir örnekle kullanım senaryolarını inceleyeceğiz.

Just-In-Time (JIT) Derleyiciler

JIT derleyici nedir? Just-In-Time (JIT) derleyiciler, programların çalışma zamanında derlenmesini sağlayan bir derleme tekniğidir. Bu derleyiciler, kodu çalıştırmadan hemen önce derler ve bu sayede programın performansını optimize edebilir.

Nasıl Çalışır?

  1. Başlangıç: Program, ilk başta bytecode veya bir ara kod olarak başlar. Bytecode, platformdan bağımsız bir formatta yazılmıştır ve JVM (Java Virtual Machine) tarafından çalıştırılır.
  2. Çalışma Zamanı: Program çalıştırıldığında, JIT derleyici, çalıştırılacak olan bytecode’u makine koduna dönüştürür. Bu işlem, programın çalışma süresi boyunca sürekli olarak yapılır.
  3. Optimizasyon: JIT derleyici, çalışma zamanında programın davranışını analiz eder ve optimize eder. Bu, en sık kullanılan kod parçalarının daha hızlı çalışmasını sağlar. Örneğin, döngülerde tekrarlanan kodlar daha hızlı çalışacak şekilde optimize edilebilir.

Avantajları:

  • Dinamik Optimizasyon: JIT derleyiciler, çalışma zamanı bilgilerini kullanarak kodu optimize edebilir. Bu, programın performansını önemli ölçüde artırabilir.
  • Taşınabilirlik: Bytecode, herhangi bir platformda çalışabilir ve JIT derleyici, o platforma uygun makine kodu üretir. Bu, yazılımların farklı platformlarda çalışmasını kolaylaştırır.
  • Hızlı Başlama: Programlar, JIT derleyicilerle hızlı bir şekilde başlar çünkü başlangıçta sadece gerekli olan kodlar derlenir.

Dezavantajları:

  • Başlangıç Yavaşlığı: İlk çalıştırma sırasında gecikmeler olabilir çünkü JIT derleyici, bytecode’u makine koduna dönüştürmek için zaman harcar.
  • Bellek Kullanımı: Dinamik derleme ve optimizasyon süreçleri, ekstra bellek kullanımına neden olabilir. Bu, özellikle sınırlı bellek kaynaklarına sahip sistemlerde bir sorun olabilir.

Ahead-Of-Time (AOT) Derleyiciler

AOT derleyici nedir? Ahead-Of-Time (AOT) derleyiciler, programın tamamını çalışma zamanından önce derleyen bir derleme tekniğidir. AOT derleme, kodun daha önceden makine koduna dönüştürülmesini sağlar.

Nasıl Çalışır?

  1. Önceden Derleme: Programın kaynak kodu, derleme sürecinde doğrudan makine koduna dönüştürülür. Bu işlem, programın dağıtımından önce yapılır.
  2. Dağıtım: Derlenmiş makine kodu, hedef platforma dağıtılır ve doğrudan çalıştırılır. Bu, programın hızlı bir şekilde başlamasını sağlar.

Avantajları:

  • Hızlı Çalıştırma: Çalışma zamanı derleme olmadığı için programlar hızlı bir şekilde başlar. Bu, kullanıcı deneyimini iyileştirir.
  • Düşük Bellek Kullanımı: Dinamik derleme yapılmadığından bellek kullanımı daha düşüktür. Bu, özellikle bellek kısıtlamaları olan sistemlerde avantaj sağlar.
  • Kararlılık: Derlenmiş kod, hedef platformda daha kararlı bir şekilde çalışır. Bu, uygulamaların daha güvenilir olmasını sağlar.

Dezavantajları:

  • Esneklik Eksikliği: Dinamik optimizasyon yapılamaz, bu nedenle çalışma zamanı optimizasyonlarından yararlanılamaz. Bu, performansın bazı durumlarda JIT derleyiciler kadar iyi olmamasına neden olabilir.
  • Platform Bağımlılığı: Derlenen kod, belirli bir platforma bağımlıdır ve başka bir platformda çalıştırmak için yeniden derlenmesi gerekebilir.
  • Uzun Derleme Süresi: Derleme süreci uzun olabilir, bu da geliştirme döngüsünü yavaşlatabilir. Özellikle büyük projelerde bu, geliştirme sürecini olumsuz etkileyebilir.

Java ile İnceleme

Java programlama dilinde, JIT ve AOT derleyicilerin nasıl çalıştığını ve performans farklarını daha iyi anlamak için örnek bir uygulama geliştirelim.

Örnek Uygulama: Fibonacci Sayılarını Hesaplama

Bu örnekte, Fibonacci sayılarını hesaplayan basit bir Java programı yazacağız ve hem JIT hem de AOT derleyicilerle nasıl çalıştığını inceleyeceğiz.

public class Fibonacci {
// Recursive method to calculate Fibonacci numbers
public static long fibonacciRecursive(int n) {
if (n <= 1) {
return n;
}
return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}

// Iterative method to calculate Fibonacci numbers
public static long fibonacciIterative(int n) {
if (n <= 1) {
return n;
}
long prev1 = 0, prev2 = 1;
for (int i = 2; i <= n; i++) {
long sum = prev1 + prev2;
prev1 = prev2;
prev2 = sum;
}
return prev2;
}

public static void main(String[] args) {
int n = 40; // Fibonacci number to calculate

// Measure time for recursive method
long startRecursive = System.nanoTime();
long resultRecursive = fibonacciRecursive(n);
long endRecursive = System.nanoTime();
System.out.println("Recursive Result: " + resultRecursive);
System.out.println("Recursive Time: " + (endRecursive - startRecursive) + " ns");

// Measure time for iterative method
long startIterative = System.nanoTime();
long resultIterative = fibonacciIterative(n);
long endIterative = System.nanoTime();
System.out.println("Iterative Result: " + resultIterative);
System.out.println("Iterative Time: " + (endIterative - startIterative) + " ns");
}
}

Adım Adım Açıklama:

  1. Fibonacci Hesaplama: Fibonacci sayılarını hesaplamak için hem recursive (özyinelemeli) hem de iterative (yinelemeli) iki yöntem tanımladık.
  2. Performans Ölçümü: Her iki yöntemin de performansını ölçmek için System.nanoTime() kullanarak başlangıç ve bitiş zamanlarını kaydediyoruz.
  3. Sonuçların Yazdırılması: Sonuçları ve hesaplama sürelerini konsola yazdırıyoruz.

JIT Derleyici ile Çalıştırma:

  • Program, JVM (Java Virtual Machine) üzerinde çalıştırıldığında, JIT derleyici devreye girer.
  • JVM, bytecode’u makine koduna dönüştürürken programın performansını optimize eder.

AOT Derleyici ile Çalıştırma:

  • AOT derleyici kullanarak programı çalıştırmak için GraalVM gibi bir araç kullanabiliriz.
  • GraalVM, Java uygulamalarını AOT derleme ile yerel makine koduna dönüştürür. Bu, çalışma zamanında derleme ihtiyacını ortadan kaldırır ve hızlı başlama süreleri sağlar.

AOT Derleme Adımları:

  1. GraalVM Kurulumu: GraalVM’yi indirip kurmamız gerekiyor.
  2. Native Image Oluşturma: native-image komutunu kullanarak Java uygulamasını yerel makine koduna dönüştürüyoruz.
native-image -cp . Fibonacci

Performans Karşılaştırması:

  • JIT Derleyici: Uygulama, JIT derleyici ile çalıştırıldığında, programın ilk çalıştırma süresi biraz daha uzun olabilir. Ancak, JIT derleyici, çalışma zamanında optimizasyon yaparak programın performansını artırır.
  • AOT Derleyici: Uygulama, AOT derleyici ile çalıştırıldığında, başlama süresi çok daha hızlıdır çünkü tüm kod önceden derlenmiştir. Ancak, dinamik optimizasyon yapılamaz, bu nedenle bazı durumlarda JIT kadar etkili olmayabilir.

Sonuç

JIT ve AOT derleyiciler, yazılım geliştirme ve performans optimizasyonu açısından kritik öneme sahiptir. JIT derleyiciler, dinamik optimizasyon yetenekleriyle öne çıkarken, AOT derleyiciler hızlı başlama süreleri ve düşük bellek kullanımı ile dikkat çeker. Hangi derleme tekniğinin kullanılacağı, uygulamanın gereksinimlerine ve hedef platforma bağlıdır. Java ile geliştirdiğimiz örnek, her iki derleyici tekniğinin de nasıl çalıştığını ve performans farklarını anlamamıza yardımcı oldu. Özellikle büyük ölçekli ve performans kritik uygulamalarda, her iki tekniğin avantajlarını ve dezavantajlarını dikkate alarak en uygun yaklaşımı seçmek önemlidir.

--

--

Umut Akbulut
BilgeAdam Teknoloji

"Tech leader & Software Architect. Passionate about digital transformation, microservices, and innovation in the finance and tech sectors."