Julia Gelişim Yolu: Yüksek Performanslı Bilimsel Programlama

2 Temel Programlama Yapıları

📊 2. Temel Programlama Yapıları: Sayısal Doğruluk ve Kontrol Akışı

Bu bölüm, Julia'da performansı ve bilimsel doğruluğu garanti altına alan temel yapıları inceler. Julia'nın tip sistemi ve operatörleri, C düzeyinde hız elde etmek için optimize edilmiştir.

2.1. Sayısal Tipler ve Hassasiyet (Precision)

Julia'da sayısal tiplerin hassasiyeti, hesaplama bilimlerinde kritik öneme sahiptir. Varsayılan tipler sistem mimarisine göre optimize edilmiştir.

  1. Tamsayılar (Integers):
    • İşaretli: Int8, Int16, Int32, Int64, Int128. (Varsayılan: Int64 veya Int32, mimariye göre).
    • İşaretsiz: UInt8, UInt16, UInt32, UInt64, UInt128. (Düşük seviyeli byte işlemleri için).
    • Taşma Kontrolü: Julia, tamsayı taşmasını (overflow) kontrol etmez (hız için). Güvenli matematik için checked_add gibi fonksiyonlar kullanılır.
  2. Kayan Noktalı Sayılar (Floats):
    • Hassasiyetler: Float64 (Varsayılan, çift hassasiyet) ve Float32 (Tek hassasiyet).
    • Özel Değerler: Inf (Sonsuz), -Inf ve NaN (Not a Number). Bu değerler IEEE 754 standardına uygundur.
    • Makinelik epsilon: eps() veya eps(Float64) ile kullanılan sayısal hassasiyetin alt sınırı belirlenir. Float karşılaştırmaları bu değer üzerinden yapılmalıdır.
  3. Karmaşık Sayılar ve Rasyoneller:
    • Complex{T} (Örn: 3.0 + 4.0im) ve Rational{T} (Örn: 3//4) ile kesin (exact) rasyonel hesaplamalar.

2.2. Aritmetik ve Mantıksal Operatörler

  • Temel Aritmetik: +, -, *, /, ^.
    Öncelik sırası diğer dillerle benzerdir. Güçlü tip sisteminden dolayı, farklı tipteki sayıları toplamak genellikle otomatik olarak daha geniş tipe yükseltilir.
  • Bitwise Operatörler: & (VE), | (VEYRA), xor (ÖZEL VEYRA), ~ (DEĞİL), >> (Sağa Kaydırma), << (Sola Kaydırma).
    Bu operatörler, düşük seviyeli kodlarda hız için yaygın olarak kullanılır.
  • Mantıksal Operatörler:
    • Kısa Devre: && (VE) ve || (VEYA). Sol ifade sonucu belirliyorsa sağ ifade hesaplanmaz (performans kazancı).
    • Uzun Form: & (Bitwise VE) ve | (Bitwise VEYRA) Boolean değerler için de kullanılabilir, ancak her iki tarafı da daima değerlendirirler.

2.3. Tip Dönüşümleri ve Parse İşlemleri

Julia'nın tip dönüşümü katı ancak esnek kurallara sahiptir. Açık dönüşüm gereksinimi, tip kararlılığını korumaya yardımcı olur.

  • Açık Dönüşüm (Explicit Conversion): convert(TargetType, value). Örn: convert(Int32, 5.8) (Ondalık kısmını atar).
  • Tipten Yükseltme (Promotion): Farklı sayı tipleri arasında işlem yapıldığında (Örn: 5 + 10.0), Julia otomatik olarak sonucu en geniş ve hassas tipte (Float64) tutar.
  • String'ten Sayıya: parse(TargetType, string) (Örn: parse(Float64, "1.23e5")). String'i sayısal tipe dönüştürür. Hata oluşursa ArgumentError fırlatır.

Örnek Kod: Tip Dönüşümü ve Hassasiyet

f32 = Float32(1.0) / Float32(3.0) f64 = 1.0 / 3.0 # Tip dönüşümünde veri kaybı a = convert(Int64, 5.9) # 5 (Kesme/Truncation) # parse() ile string'i tamsayıya çevirme sayi = parse(Int, "42") # Sayısal Hassasiyet Kontrolü x = 0.1 + 0.2 println(x == 0.3) # Genellikle false (Floating Point Hataları) println(abs(x - 0.3) < eps(Float64)) # Doğru karşılaştırma yöntemi

2.4. Kontrol Akışı Yapıları (Control Flow)

Programın yürütülme yolunu belirleyen koşullu ve döngüsel yapıları içerir.

  • Koşullu İfadeler (If/Else):
    Standart if-elseif-else yapısı. Koşul ifadesi daima bir Bool sonucu vermelidir.
  • Ternary (Üçlü) Operatör: koşul ? değer_doğru : değer_yanlış. Tek satırda koşullu atama.
  • Döngüler (Loops):
    • For Döngüsü: Koleksiyonlar ve aralıklar üzerinde iterasyon için en çok kullanılan ve performanslı döngü tipi. (Örn: for i in 1:10).
    • While Döngüsü: Belirli bir koşul doğru olduğu sürece çalışır. Koşulun dışarıdan değiştiği durumlarda tercih edilir.
  • Döngü Kontrolü:
    • break: İçinde bulunduğu döngüyü hemen sonlandırır.
    • continue: Döngüdeki mevcut iterasyonu atlar ve bir sonraki iterasyona geçer.

2.5. Hata Yönetimi ve İstisnalar

  • Hata Yakalama (Try/Catch): try...catch e...finally bloğu ile olası hataları (istisnaları) yönetme.
    finally bloğu, hata oluşsa da oluşmasa da çalıştırılacak temizleme kodları için kullanılır.
  • Hata Fırlatma: error("Hata mesajı") ile program akışını kesen bir istisna (exception) fırlatma.
  • Özel Hata Tipleri: Julia'da DomainError, ArgumentError, DivideError gibi tiplerle spesifik hatalar yakalanabilir.
  • Hata Tekrar Fırlatma: rethrow(e) ile yakalanan hatayı işledikten sonra tekrar fırlatma.

Örnek Kod: Döngü ve Hata Yönetimi

# Ternary Operatör x = 12 durum = x > 10 ? "Büyük" : "Küçük" # for döngüsü toplam = 0 for i in 1:100 if i % 5 == 0 continue # 5'in katlarını atla end toplam += i end println("Toplam: ", toplam) # Try/Catch ile spesifik hata yakalama function karekok_al(x) try x < 0 && throw(DomainError(x, "Sadece pozitif sayılar kabul edilir.")) return sqrt(x) catch e if isa(e, DomainError) println("Uyarı: Geçersiz giriş. 0 döndürülüyor.") return 0.0 else rethrow(e) # Diğer hataları bırak end end end println(karekok_al(-4))