- Kişisel projelerindeki tüm oyunları "saf C" ile geliştiriyor; bu da bugünlerde nadir bir tercih
- Dil seçimindeki temel ölçütler güvenilirlik, taşınabilirlik ve uzun vadeli sürdürülebilirlik; belirli bir OS veya platforma bağımlı değil
- Basitlik ve hızlı derleme hızı ile sıkı tip denetimi ve güçlü uyarı sistemine önem veriyor
- C++·C#·Java·Go·Haxe gibi alternatif dilleri değerlendirmiş, ancak karmaşıklık, GC, OOP dayatması gibi nedenlerle uygun bulmamış
- C, tehlikeli ama basit ve hızlı; geniş platform desteği ve sağlam kütüphane ekosistemi sayesinde hâlâ en iyi seçenek
Dil seçimindeki ölçütler
- Temel şart güvenilirlik ve istikrar; amaç, kendisinin yaratmadığı hatalara zaman harcamamak
- Geçmişte Flash tabanlı oyunlar geliştirmiş, ancak Flash'ın gerilemesi nedeniyle yeni platformlara port etmek yerine yeni oyun yapımına odaklanmak istiyor
- Belirli bir OS'e bağlı kalmamak ve konsol geliştirme olasılığını açık tutmak için taşınabilirlik ve genel amaçlı kütüphane desteğini önemsiyor
- Arzu edilen koşullar arasında basit sözdizimi ve hatırlaması kolay bir yapı var
- Karmaşık API'leri veya dil özelliklerini sürekli araştırma ihtiyacından kaçınmak istiyor
- Sıkı tip denetimi, güçlü uyarılar ve statik analiz ile hataları azaltmak; iyi bir debugger ve dinamik analiz araçlarıyla sorunları kolayca bulmak istiyor
- Derleme hızını çok önemli görüyor
- Uzun bekleme süreleri odağı bozuyor ve üretkenliği düşürüyor
- Nesne yönelimli programlamaya (OOP) şüpheyle yaklaşıyor; veriyi ve kodu ayırıp duruma göre ele alan bir yaklaşımı tercih ediyor
Başlıca alternatif dillerin değerlendirilmesi
- C++
- Oyun geliştirmede hâlâ standart olsa da, karmaşıklığı ve yavaş derleme hızı nedeniyle tatmin edici değil
- Yüksek performans ve çeşitli özellikler sunuyor, ancak istemediği çok fazla özellik var ve karmaşıklık maliyeti yüksek
- C# ve Java
- Ayrıntıcı ve karmaşık; güçlü OOP merkezli yapıları nedeniyle esneklikleri düşük
- Yüksek seviyeli dil özellikleri karmaşıklığı gizliyor, ancak temel sorunları ortadan kaldırmıyor
- Go
- C'nin modern bir yeniden yorumu olarak olumlu değerlendiriyor, ancak stop-the-world garbage collection oyun geliştirme için uygun değil
- Oyun odaklı kütüphanelerin azlığı ve uzun vadeli sürdürülebilirlik konusunda endişeleri var
- JavaScript
- Web geliştirme ortamının hızlı değişimi ve Flash'ın sona erişi nedeniyle istikrarsız hissettiriyor
- Gevşek sözdizimi nedeniyle büyük ölçekli yazılım yazmaya uygun olmadığını düşünüyor
- Haxe
- Web geliştirme için umut verici buluyor, ancak görece yeni bir dil olması nedeniyle sürdürülebilirliğinden endişe ediyor
- Kendi dilini geliştirmek
- Cazip bir fikir, ancak mevcut kütüphanelerden vazgeçme ve uyumluluğu sürdürme yükü nedeniyle gerçekçi bulmuyor
Neden C'yi seçiyor
- Tehlikeli ama güvenilir bir dil; basit yapısı sayesinde dikkatli kullanıldığında istikrarlı
- Bunu “keskin bir bıçak”a benzetiyor; kullanması zor ama ustalaşınca güçlü bir araç olduğunu vurguluyor
- Derleme hızı çok yüksek ve neredeyse tüm platformlarda çalışabiliyor
- Port etme süreci de görece basit ve uzun vadede sürdürülebilirliği yüksek
- Kütüphane ve tooling desteği güçlü ve istikrarlı biçimde sürdürülüyor
- Kişisel olarak zaten çok sayıda "saf C" kodu deneyimine sahip olduğu için dile alışkın
- Başkalarına C kullanmalarını önermiyor; bunun kişisel zevkine ve çalışma biçimine optimize edilmiş bir tercih olduğunu söylüyor
1 yorum
Hacker News görüşleri
Genelde C tarzında kod yazarım ama yalnızca gerektiğinde C++ özelliklerini kullanırım
Bu yüzden ilk bakışta Rust kodu gibi görünebilir
Oyunu C ile yazdığını söyleyenler, C++ özelliklerinden hoşlanmadıkları halde sonunda sanal arayüzleri kendileri uyguluyor ya da devasa
switchblokları kurup benzer işi yapıyorDildeki özellikleri kullanmamak mümkün; bence asıl anlamsız olan, o özelliklerin varlığından şikayet etmek
C++, şablonlar aşırı kullanılmadıkça yavaş derlenmez
Zamanla ekip üyeleri ve liderler değiştikçe, kullanılan özelliklerin kümesi giderek büyür
Bir kez büyüyen bu özellik setini yeniden küçültmek çok zordur
Ayrıca istemediğiniz özellikleri kullanan kütüphaneleri kullanmak zorunda da kalabilirsiniz
Örneğin ben örtük çağrılardan (destructor, operator overloading vb.) hoşlanmıyorum ama kütüphane bunları kullanıyorsa sonunda siz de uymak zorunda kalıyorsunuz
switchblokları okunabilirC++'ın en kötü yanlarından biri, otomatik üretilen gizli kodun çok fazla olması
Kodun büyük kısmı somut tiplerle (
Goose,Duckvb.) çalışsa bile, tüm nesneler yanında bir vtable işaretçisi taşırBuna karşılık Rust, vtable'ı yalnızca gereken yerde kullanarak bellek tasarrufu sağlar
C programcıları ise yalnızca ihtiyaç duydukları özellikleri kendileri uygular; bu yüzden dilin dayattığı yapılara daha az bağlı kalırlar
Yalnızca
<vector>ekleseniz bile on binlerce satır kod içeri alınırBu yüzden standart kütüphaneyi kullanmazsanız “neden tekerleği yeniden icat ediyorsun?” tartışması çıkar
Bu tartışma tekrar tekrar yaşanınca insan için C'ye geri dönmek çok daha rahat oluyor
Ben de 2017 civarında C'ye geçtim ve bugün bile C++ kütüphaneleri kullandığımda yoruluyorum
İstisna olarak Dear ImGui fena değil ama onda bile C binding'lerini tercih ediyorum
Uzantıyı
.cyapınca derleme süresi yarıya indiC'nin sert ve sade yapısını seviyorum ama preprocessor'dan hoşlanmıyorum
Bu yüzden Zig adeta bir lütuf gibi geliyor — C'den daha sade ama daha tutarlı bir dil tasarımına sahip
Örneğin Zig, tekil pointer ile dizi pointer'ını ayırıyor
C kütüphanelerini içe aktarıp kullanımı daha rahat hale getirebiliyorsunuz; bu da oyun geliştirmede çok faydalı
C++ kütüphanelerinin çoğu da yanında C header'ları veriyor
zig-gamedev içinde bu tür Zig'e uyarlanmış C kütüphaneleri çok fazla
Preprocessor yerine Zig'in comptime özelliği çok daha iyi ve aslında sadece “derleme zamanında çalışan Zig kodu”
Ben de yazarın görüşüne katılıyorum
Bir dili sevmemin en büyük nedeni sadelik
Bu yüzden C, Go, Odin, Zig gibi dilleri tercih ediyorum
Ama gerekli karmaşıklığı zarif biçimde ele alan diller de önemli
Bellek güvenliği, eşzamanlılık ve fonksiyonel kalıplar gereken ağ kodunda Rust doğal geliyor
Buna karşılık indie oyunlar gibi basit ve hızlı kod gereken yerlerde C ya da Odin çok uygun
Odin, Go'nun sadeliğiyle C'nin performansını birleştiriyormuş gibi hissettiriyor; tavsiye ederim
Raylib ile oyun yapmak da kolay
Odin'in Zig'den daha çok o konuma uyduğunu düşünüp düşünmediğini merak ediyorum
Orijinal yazıda Go'nun oyun kütüphanesi desteğinin zayıf olduğu söylenmiş ama bu 2015 civarında yazılmış bir metin gibi görünüyor
Bugün durum değişmiş olabilir
O dönemde yaptığı oyunların ekran görüntülerini de görebilirsiniz
Örneğin Knossu kendine özgü bir 3D stile sahip
2026'da C ile oyun yapmak biraz çılgınlık sayılabilir ama ben de öyle yapıyorum
Mesela Chrysalis'i C ile geliştirdim (GLFW3, FMOD kullanarak)
idTech3 tabanlı ve dövüş sistemi o kadar hassas ki küçük bir değişiklik bile tüm dengeyi bozuyor
Hatta
i++eklemek bile zamanlamayı değiştiriyorBu yüzden 22 yıllık derleyiciyi aynen kullanıyoruz
Modernleştirilmiş fork'lar var ama orijinal hissi kaybetmişler
idTech3 gerçekten C'nin özünü gösteren bir motor
Binlerce oyun C ile yazıldı ve OpenGL, Vulkan, DX gibi grafik API'leri de tamamen C tabanlı
O yüzden bunda hiç garip bir şey yok
Oyun motorlarının çoğu da C/C++ ile yazılıyor
Konsollar ise nesilden nesile değişir
Linux programlamanın aksine, oyun geliştirme 30 yılı aşkın süredir C++ merkezli ilerledi
Ben temelde C'yi seven biriyim
Onu onlarca yıldır iyi kullandım ama ekip halinde C kodu yönetince acı büyüyor
Ayrıca modern dillere kıyasla geliştirme hızı daha düşük
Yine de sadeliğinin çekiciliği sürüyor
Benim deneyimimde C, C++'tan daha az acı vericiydi
Bu gerçek, C'nin işbirliği sınırları iddiasını zayıflatıyor
“Kimse C ile oyun yapmıyor” sözü abartılı
Bugün ana akım olmasa da hâlâ C ile oyun yapan çok insan var
Siz sadece istisnasınız; yine de o ifade istatistiksel olarak doğru kalır
C'yi seviyorum
Bellek yönetimi üzerinde tam denetim kurabiliyor ve öngörülebilir davranış elde edebiliyorsunuz
MISRA kuralları gibi önceden tahsis gerektiren ortamlarda özellikle kullanışlı
Donanım düzeyindeki istisna ve hataları doğrudan ele almak için de iyi
Birim test yazmak da kolay
C'nin giriş engeli düşük ama bellek yönetimi bilgisi şart
Java geliştiricisi olarak, elimde sadece
.hve.sovarken hızlıca bir bağlayıcı yazmam gerektiğinde C++ yerine C'yi seçtimC keskin bir bıçaksa, C++ dönen bıçaklardan oluşan bir sütun gibi — dalgın davranırsanız canınızı yakar
Ama string işleme C'de fazla acı verici; bu yüzden C++'ın string sistemini ödünç almak istiyorum