2 puan yazan GN⁺ 2025-01-01 | 1 yorum | WhatsApp'ta paylaş

Neden Zig ile Game Boy Advance oyunu yazıldı?

  • Game Boy Advance'in çekiciliği
    Game Boy Advance modern bir CPU'ya (32 bit ARM, çok sayıda register) sahip olsa da eski tarz karo tabanlı bir renderer kullanır. Bu, NES'in 80'lerde kullandığı yönteme benzer. Nintendo'nun karo tabanlı son sistemlerinden biri olarak afin dönüşüm, saydamlık, sprite efektleri gibi çeşitli özellikler sunar.

  • Neden Zig dili seçildi?
    Başlangıçta Game Boy Advance projesi C++ ile başlatılmış olsa da ilk tam oyun Zig ile yazıldı. Zig hâlâ beta sürümünde olmasına ve Game Boy Advance'in çıkışından 15 yıl sonra ortaya çıkmış bir dil olmasına rağmen, gömülü programlama için uygun özellikler sunuyor.

Toolchain

  • Linux ve devKitPro
    Linux kullanırken paket yönetimiyle ilgili zorluklar yaşandı ve Nintendo DS için 3D sahneler oluştururken devKitPro kullanmak gerekti. Bu araç; GCC toolchain'i, kütüphaneler ve geliştirme araçlarını içeriyor. ArchLinux paket yöneticisi üzerinden kurulmasının yarattığı ek uğraş da var.

  • Zig'in avantajları
    Zig, cross-compilation işini kolaylaştırır ve karmaşık bir paket yöneticisi kurmayı gerektirmez. Zig'in build sistemi, build.zig dosyasındaki build fonksiyonunu çalıştırarak derlemeyi yürütür. Bu da build sürecini sadeleştirir ve hataları azaltır.

Packed Structs

  • Packed Structs'un önemi
    Game Boy Advance, üst düzey API çağrıları olmadan register'lar üzerinden donanımı kontrol eder. Zig'in packed struct özelliği, bellek yerleşimini optimize ederek donanım kontrolünü kolaylaştırır. Bu, Game Boy Advance programlaması için son derece faydalı bir özelliktir.

Comptime

  • Compile time kod çalıştırma
    Zig, kodu compile time aşamasında çalıştırabilme özelliği sunar. Bu sayede veriler runtime'da sıkıştırılmak yerine compile time sırasında sıkıştırılabilir. Zig'in bu özelliği, verilerin kolayca sıkıştırılmasını sağlar.

Standart kütüphane

  • Zig'in esnek standart kütüphanesi
    Zig'in standart kütüphanesi generics desteği sunar ve bellek ayırma fonksiyonları, parametre olarak bir allocator alabilir. Bu da özel bellek ayırma yöntemlerinin kullanılmasına imkân tanır. Zig'in standart kütüphanesi, donanım kısıtlarının olduğu ortamlarda da esnek biçimde kullanılabilir.

Sorunlar

  • Inline assembly
    Zig inline assembly'yi destekler, ancak yalnızca tek bir çıktı mümkündür. Bu, GBA'nin BIOS fonksiyonlarında birden fazla değerin çıktı olarak alınması gerektiğinde sorun yaratır.

  • Thumb kodu / ARM kodu
    Game Boy Advance'in CPU'su ARM modu ve Thumb modunu destekler. Zig içinde ARM ve Thumb modları açıkça belirtilemez.

  • Tuhaf bellek
    Game Boy Advance'in video belleğine 8 bit birimlerle yazılamaz; bu da grafiklerin bozulmasına yol açar. Zig, bellek kopyalama sırasında memcpy kullanarak optimizasyon yapar, ancak bu durum GBA'nin "tuhaf belleği" ile çakışabilir.

1 yorum

 
GN⁺ 2025-01-01
Hacker News yorumları
  • Belirli adres aralıkları için bellek erişim davranışını tanımlamanın bir yolu gerekli. Zig belgelerindeki volatile kullanımı da sorunu çözmüyorsa, derleyiciye hata bildirimi yapılması öneriliyor
  • 5 yıl önce Linux kullanmaya başlamasının nedeni, Windows'ta Python'un nasıl kurulacağını bilmemesiydi. 1997-2015 arasında Windows baskın işletim sistemiydi ve bu durum gençler arasındaki bilgi eksikliğini derinleştirdi. İlk zamanlarda internet erişimi yaygın değildi ve programlama ortamı sunmayan bir işletim sistemi, programlama fırsatlarının kaçırılmasına yol açıyordu
  • Game Boy Advance'te video belleğine 8 bitlik birimlerle yazılamaz; böyle yapılırsa grafikler bozulur. Emülatörde çalışmıştı ama gerçek donanımda sorun fark edilip düzeltilmek zorunda kalındı. Nim dili için bir GBA toolchain'i geliştirildi
  • Derleyici bazen bellek kopyalama işlevini memcpy ile değiştiren bir optimizasyon yapabiliyor. Bunun yalnızca kullanıcı alanında gerçekleşeceği düşünülmüştü ve -nostdlib seçeneğinin bunu otomatik olarak ele alması bekleniyordu
  • C'de packed struct kullanımı için bitfield öneriliyor. Geçerli bir C kodu örneği sunuluyor
  • Game Boy Advance'in bellek sorunlarını çözmek için bir yönteme ihtiyaç var. LLVM'in bunu destekleyip desteklemediği merak ediliyor ve Zig'e entegre etmenin zor olmayacağı düşünülüyor