Faz 4 — Optimizasyon Altyapısı ve Kaynak Optimizasyonları (Optimization) #73

Closed
opened 2026-06-14 21:58:15 +03:00 by saqut · 1 comment
Owner

Giriş (Nedir, Neden Yapıyoruz?)

Bu iş paketinde derleyicinin ürettiği kodu daha verimli hale getiren Optimizasyon (Eniyileme) altyapısını ve ilk optimizasyon adımlarını (pass'leri) yazacağız.
Optimizasyon, yazılan kodun anlamını değiştirmeden daha hızlı çalışacak veya daha az yer kaplayacak şekilde dönüştürülmesidir.
saQut'un "alet çantası" felsefesi gereği, optimizasyon orijinal kaynak kod görüntüsünü bozmamalıdır. Bu nedenle optimizasyonlar AST'nin bir kopyası (klon) üzerinde gerçekleştirilir.


Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?)

Aşağıdaki adımları sırasıyla gerçekleştir:

  1. Optimizasyon Yöneticisi: src/opt/ dizinini oluştur. Soyut OptimizationPass sınıfını tanımla. OptimizationManager sınıfını yaz; bu sınıf CompilerConfig üzerinden aktif edilen pass'leri sırayla çalıştırsın.
  2. Fixpoint Döngüsü: Pass'lerin birbirini tetiklemesi için (örn. folding sonrası ölü kod oluşması) optimizasyonları bir fixpoint döngüsünde (hiçbir pass değişiklik yapmayana kadar) çalıştır. Monoton olmayan pass'lerin sonsuz döngüye girmemesi için sert bir tur sınırı (maxFixpointRounds) ekle.
  3. Ağaç Klonlama ve Remap: ASTNode::clone() metodunu tüm AST düğümleri için yaz. Kopyalanan düğümlerin parent pointer'larını yeni ağaca göre bağla. Klonlanan ağaçtaki Identifier (isim referansı) düğümlerinin sembol tablosu bağlarını, klonlanmış yeni bir sembol tablosuna yönlendir (Remapping).
  4. Constant Folding Pass: src/opt/constant_folding.hpp dosyasını oluştur. İki sabit terimin işlemini derleme zamanında hesapla (Örn: 1 + 23). Sıfıra bölme varsa katlama yapma, W002 uyarısı ver.
  5. Dead Code Elimination (DCE) Pass: src/opt/dead_code_elim.hpp dosyasını oluştur. Erişilemez deyimleri (örn. return sonrası kodlar, if(false) gövdeleri) ve hiç kullanılmayan lokal değişkenleri (W001) sil.

Geliştirme Dalı (Branch): feature/faz4-optimization


Sonuç ve Başarı Kriterleri

Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız:

  1. saqut ast examples/fibonacci.sqt --optimized komutu çalıştırıldığında sabit ifadelerin katlandığı ve varsa ölü kodların silindiği doğrulanmalıdır.
  2. --optimized bayrağı verilmeden çağrıldığında orijinal (optimize edilmemiş) AST çıktısı elde edilmelidir (Öncesi/Sonrası karşılaştırması).
  3. Folding ve DCE işlemlerinin ardışık olarak birbirini beslediği (folding sonucu oluşan ölü kodun DCE tarafından temizlendiği) zincirleme senaryolar tek bir komutla doğrulanmalıdır.

Mühendis Olmayanlar İçin Analiz: Yazdığınız programın gereksiz kısımlarını temizleyen akıllı temizlikçi aşamasıdır. Kodun boyutunu küçültür. Karmaşıklığı Yüksek, yapım süresi yaklaşık 4-5 gündür.
İmza/Yorum: ASTNode::clone() implementasyonu bu fazın en kritik ve hata yapmaya açık kısmıdır, parent pointer bağlarına azami dikkat gösterilmelidir.

### Giriş (Nedir, Neden Yapıyoruz?) Bu iş paketinde derleyicinin ürettiği kodu daha verimli hale getiren Optimizasyon (Eniyileme) altyapısını ve ilk optimizasyon adımlarını (pass'leri) yazacağız. Optimizasyon, yazılan kodun anlamını değiştirmeden daha hızlı çalışacak veya daha az yer kaplayacak şekilde dönüştürülmesidir. saQut'un "alet çantası" felsefesi gereği, optimizasyon orijinal kaynak kod görüntüsünü bozmamalıdır. Bu nedenle optimizasyonlar AST'nin bir kopyası (klon) üzerinde gerçekleştirilir. --- ### Gelişme (Neyi, Nerede ve Nasıl Yapacaksın?) Aşağıdaki adımları sırasıyla gerçekleştir: 1. **Optimizasyon Yöneticisi:** `src/opt/` dizinini oluştur. Soyut `OptimizationPass` sınıfını tanımla. `OptimizationManager` sınıfını yaz; bu sınıf `CompilerConfig` üzerinden aktif edilen pass'leri sırayla çalıştırsın. 2. **Fixpoint Döngüsü:** Pass'lerin birbirini tetiklemesi için (örn. folding sonrası ölü kod oluşması) optimizasyonları bir fixpoint döngüsünde (hiçbir pass değişiklik yapmayana kadar) çalıştır. Monoton olmayan pass'lerin sonsuz döngüye girmemesi için sert bir tur sınırı (`maxFixpointRounds`) ekle. 3. **Ağaç Klonlama ve Remap:** `ASTNode::clone()` metodunu tüm AST düğümleri için yaz. Kopyalanan düğümlerin `parent` pointer'larını yeni ağaca göre bağla. Klonlanan ağaçtaki Identifier (isim referansı) düğümlerinin sembol tablosu bağlarını, klonlanmış yeni bir sembol tablosuna yönlendir (Remapping). 4. **Constant Folding Pass:** `src/opt/constant_folding.hpp` dosyasını oluştur. İki sabit terimin işlemini derleme zamanında hesapla (Örn: `1 + 2` → `3`). Sıfıra bölme varsa katlama yapma, `W002` uyarısı ver. 5. **Dead Code Elimination (DCE) Pass:** `src/opt/dead_code_elim.hpp` dosyasını oluştur. Erişilemez deyimleri (örn. `return` sonrası kodlar, `if(false)` gövdeleri) ve hiç kullanılmayan lokal değişkenleri (`W001`) sil. *Geliştirme Dalı (Branch):* `feature/faz4-optimization` --- ### Sonuç ve Başarı Kriterleri Bu işin bittiğini ve başarılı olduğunu şu kriterlerle doğrulayacağız: 1. `saqut ast examples/fibonacci.sqt --optimized` komutu çalıştırıldığında sabit ifadelerin katlandığı ve varsa ölü kodların silindiği doğrulanmalıdır. 2. `--optimized` bayrağı verilmeden çağrıldığında orijinal (optimize edilmemiş) AST çıktısı elde edilmelidir (Öncesi/Sonrası karşılaştırması). 3. Folding ve DCE işlemlerinin ardışık olarak birbirini beslediği (folding sonucu oluşan ölü kodun DCE tarafından temizlendiği) zincirleme senaryolar tek bir komutla doğrulanmalıdır. *Mühendis Olmayanlar İçin Analiz:* Yazdığınız programın gereksiz kısımlarını temizleyen akıllı temizlikçi aşamasıdır. Kodun boyutunu küçültür. Karmaşıklığı **Yüksek**, yapım süresi yaklaşık **4-5 gün**dür. *İmza/Yorum:* `ASTNode::clone()` implementasyonu bu fazın en kritik ve hata yapmaya açık kısmıdır, parent pointer bağlarına azami dikkat gösterilmelidir.
saqut added the
faz-plani
label 2026-06-14 22:08:33 +03:00
saqut added the
felsefe-gozden-gecir
label 2026-06-16 00:21:23 +03:00
Author
Owner

🧭 Felsefe gözden geçirme — sıralama (içerik değil).

Bu issue'nun içeriği felsefeyle uyumlu: optimizasyon bir klon üzerinde çalışıp orijinali korur ve öncesi/sonrası karşılaştırması "cam" ilkesine birebir oturur. Sorun sıralama.

Bu, dolu bir çerçeve (OptimizationManager, fixpoint, config, clone+remap). Mevcut yol haritasında çalıştırma (IR güçlendirme + bytecode VM) Faz 4'ten sonra geliyor — yani bu çerçeve, hiçbir şey daha çalışmadan inşa edilmiş oluyor.

Kristalleşen felsefe (readme.md → "Tasarım felsefesi"):

  • Önce dikey dilim: önce uçtan uca çalışan en küçük dilim (kaynak → IR → çalıştır → tek print), ağır çerçeveler sonra.
  • Amiral gemisi = record-replay (#94): bu da çalışan + deterministik bir VM gerektirir.

Öneri: Faz 4'ü, minimal bir çalıştırma dilimi (VM ile fibonacci'yi gerçekten koşturmak) çalıştıktan sonraya ertele. O zaman optimizasyon hem daha anlamlı olur hem de öncesi/sonrası farkı çalıştırılarak doğrulanabilir.

Karar tamamen senin — bu yalnızca felsefeye göre bir işaret, "yanlış issue" demek değil.

🧭 **Felsefe gözden geçirme — sıralama (içerik değil).** Bu issue'nun *içeriği* felsefeyle uyumlu: optimizasyon bir **klon** üzerinde çalışıp orijinali korur ve öncesi/sonrası karşılaştırması "cam" ilkesine birebir oturur. Sorun **sıralama**. Bu, dolu bir **çerçeve** (OptimizationManager, fixpoint, config, clone+remap). Mevcut yol haritasında çalıştırma (IR güçlendirme + bytecode VM) Faz 4'ten **sonra** geliyor — yani bu çerçeve, **hiçbir şey daha çalışmadan** inşa edilmiş oluyor. Kristalleşen felsefe (`readme.md` → "Tasarım felsefesi"): - **Önce dikey dilim:** önce uçtan uca *çalışan* en küçük dilim (kaynak → IR → çalıştır → tek `print`), ağır çerçeveler sonra. - **Amiral gemisi = record-replay (#94):** bu da çalışan + deterministik bir VM gerektirir. **Öneri:** Faz 4'ü, minimal bir **çalıştırma dilimi** (VM ile fibonacci'yi gerçekten koşturmak) çalıştıktan *sonra*ya ertele. O zaman optimizasyon hem daha anlamlı olur hem de öncesi/sonrası farkı **çalıştırılarak** doğrulanabilir. Karar tamamen senin — bu yalnızca felsefeye göre bir işaret, "yanlış issue" demek değil.
saqut closed this issue 2026-06-18 21:21:34 +03:00
Sign in to join this conversation.
No description provided.