- Ghostty ekibi GTK uygulamasını tamamen baştan yazdı ve GObject tür sistemini yoğun biçimde kullanmaya başladı
- Bu süreçte Zig dili ile entegrasyon ve Valgrind ile bellek sorunlarının doğrulanması önemli rol oynadı
- GObject sisteminin benimsenmesiyle önceye kıyasla bellek yönetimi ve özel widget geliştirme basitleşti
- Valgrind kullanımının sonucunda Ghostty'nin bellek güvenliğinin büyük ölçüde iyileştiği görüldü
- Yeni Ghostty GTK, kaynak koddan derlemelerde varsayılan hale geldi ve 1.2 sürümünde yer alacak
Giriş
- Ghostty, macOS, Linux, FreeBSD destekleyen çapraz platform bir terminal emülatörüdür
- Her platformda yerel GUI framework'lerini kullanarak farklılaşır
- macOS: Swift ve Xcode tabanlı büyük ölçekli uygulama
- Linux ve BSD: GTK tabanlı uygulama, X11/Wayland gibi sistemlerle doğrudan entegrasyon
- Ortak çekirdek Zig ile yazılmıştır ve C ABI uyumlu API sunar
- Mevcut yapıda GTK uygulamasının neden yeniden yazıldığına dair ayrıntılar için özgün PR'a bakılabilir
- Bu yazı özellikle GObject tür sistemiyle entegrasyon ve Valgrind ile doğrulanan bellek sorunları üzerine odaklanır
GObject tür sistemi ve Zig
- GTK kullanıldığında yapı gereği GObject tür sistemiyle arayüz kurmak gerekir
- Geçmişte GObject sisteminden kaçınılarak referans sayımı olmayan Zig nesneleri ile GObject nesnelerinin yaşam döngüsü elle eşleştirilmeye çalışıldı, ancak bellek serbest bırakmanın düzgün çalışmaması sorunu tekrar tekrar ortaya çıktı
- Örneğin Zig tarafındaki bellek serbest bırakılmışken GTK tarafındaki bellek yaşamaya devam ediyor ya da bunun tersi oluyordu
- Bu yaklaşım yalnızca doğruluk sorunları yaratmakla kalmadı, aynı zamanda GTK'ye özgü özelliklerin (event signals, property binding, actions) kullanımını da zorlaştırdı
- Somut bir örnek olarak, ayar (
config) yapısı yeniden yüklendiğinde bağlı tüm GUI öğelerinin tutarlı şekilde güncellenmesi gerekiyordu; bu süreç karmaşık ve hataya açıktı
- Artık Zig
Config yapısı, onu saran referans sayımlı GhosttyConfig GObject ile yönetiliyor ve özellik değişikliği bildirimleri sayesinde değişiklikler uygulamanın geneline doğal biçimde yayılıyor
- Özel GObject widget'ları oluşturmak da kolaylaştı; böylece Blueprint gibi modern GTK UI teknolojilerini kullanmak mümkün oldu
- Son dönemde Blueprint'in devreye alınmasıyla GTK titlebar sekmeleri, animasyonlu zil çerçevesi gibi yeni özellikleri eklemek kolaylaştı
Valgrind, GTK ve Zig
- Tüm geliştirme süreci boyunca Valgrind, bellek sızıntıları ve tanımsız bellek erişimleri gibi sorunları sistematik olarak doğrulamak için kullanıldı
- GTK uygulamalarında Valgrind kullanmak zordur ve büyük boyutlu suppression dosyaları gerekir (yaklaşık %80'i GTK'nin kendisi, kalanı 3rd party kütüphaneler ve GPU sürücüleri içindir)
- Tekrarlanan kontroller sayesinde yalnızca bazı durumlarda ortaya çıkan karmaşık bellek hataları önceden tespit edilebildi
- Örneğin GObject
WeakRef doğru başlatılmazsa hedef nesne daha sonra serbest bırakıldığında tanımsız bellek erişimi oluşur; bu durum Valgrind ile önceden yakalandı
- Fiili deneyime göre, Zig kod tabanının içindeki sorunlar toplam yalnızca 2 adetti (1 sızıntı, 1 tanımsız erişim) ve bunlar da 3rd party C API entegrasyonu sırasında ortaya çıktı
- Zig'in hata ayıklama amaçlı allocator'ü ve Valgrind entegrasyonu da işe yaradığını kanıtladı
- Bulunan diğer bellek sorunlarının çoğu C API sınırlarında ve GObject sisteminin karmaşık yaşam döngüsü yönetiminden kaynaklandı
- Sonuç olarak, karmaşık kütüphanelerin C API'lerini güvenli kullanmak için Valgrind benzeri araçlar gereklidir
- Zig'in bellek güvenliğini destekleyen özelliklerinin etkisi yalnızca teorik tartışmalarla değil, somut proje deneyimiyle de doğrulandı
Sonuç
- Bu, Ghostty'nin GUI bölümünü beşinci kez sıfırdan yeniden yapma deneyimi oldu
- GLFW, macOS SwiftUI, macOS AppKit+SwiftUI, Linux GTK (prosedürel), Linux GTK+GObject tür sistemi sırasıyla
- Tekrarlanan yeniden yazım sürecinde her seferinde yeni dersler ve teknik gelişim kazanıldı
- Bu deneyimin bir kısmının macOS projesine de uygulanması planlanıyor
- Ghostty GTK sisteminin bakım ekibinin aktif iş birliği de özellikle vurgulanıyor
- Baştan yazılan yeni Ghostty GTK uygulaması artık kaynak koddan derlemelerin varsayılanı oldu ve 1.2 kararlı sürümünde yer alacak
Henüz yorum yok.