2 पॉइंट द्वारा GN⁺ 2025-01-01 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Zig में Game Boy Advance गेम क्यों लिखा गया

  • Game Boy Advance का आकर्षण
    Game Boy Advance में एक आधुनिक CPU (32-bit ARM, बहुत सारे registers) है, लेकिन यह एक पुराने tile-based renderer का उपयोग करता है। यह NES द्वारा 80 के दशक में इस्तेमाल किए गए तरीके जैसा है। Nintendo के आखिरी tile-based systems में से एक होने के नाते, यह affine transforms, transparency, sprite effects जैसी कई सुविधाएँ देता है.

  • Zig भाषा चुनने की वजह
    शुरुआत में Game Boy Advance प्रोजेक्ट C++ में शुरू किया गया था, लेकिन पहला पूरा गेम Zig में लिखा गया। Zig अभी भी beta version में है, और Game Boy Advance के रिलीज़ होने के 15 साल बाद बनी भाषा होने के बावजूद, यह embedded programming के लिए उपयुक्त features देती है.

Toolchain

  • Linux और devKitPro
    Linux का उपयोग करते हुए package management की कठिनाइयों का सामना करना पड़ा, और Nintendo DS के लिए 3D scene बनाते समय devKitPro का उपयोग करना पड़ा। इसमें GCC toolchain, libraries, और development tools शामिल हैं। इसे ArchLinux package manager के जरिए install करना पड़ता है, जो थोड़ा झंझट वाला है.

  • Zig के फायदे
    Zig cross-compilation को आसान बनाता है, और किसी जटिल package manager को सेट up करने की ज़रूरत नहीं होती। Zig का build system build.zig फ़ाइल में build function को चलाकर build करता है। इससे build process सरल हो जाता है और errors कम होते हैं.

Packed Structs

  • Packed Structs का महत्व
    Game Boy Advance किसी high-level API call के बिना registers के जरिए hardware को control करता है। Zig के packed struct memory layout को optimize करते हैं, जिससे hardware control आसान हो जाता है। यह Game Boy Advance programming के लिए बहुत उपयोगी feature है.

Comptime

  • Compile time पर code execution
    Zig compile time पर code चलाने की सुविधा देता है। इससे data को runtime पर compress करने के बजाय compile time पर compress किया जा सकता है। Zig का यह feature data compression को आसान बनाता है.

Standard Library

  • Zig की flexible standard library
    Zig की standard library generics को support करती है, और memory allocation functions में allocator को argument के रूप में लिया जा सकता है। इससे custom memory allocation methods का उपयोग किया जा सकता है। Zig की standard library hardware constraints वाले environments में भी लचीले ढंग से इस्तेमाल की जा सकती है.

समस्याएँ

  • Inline assembly
    Zig inline assembly को support करता है, लेकिन केवल एक output संभव है। यह तब समस्या बनता है जब GBA के BIOS functions में कई values output करनी हों.

  • Thumb code / ARM code
    Game Boy Advance का CPU ARM mode और Thumb mode दोनों को support करता है। Zig में ARM और Thumb modes को स्पष्ट रूप से निर्दिष्ट नहीं किया जा सकता.

  • अजीब memory
    Game Boy Advance की video memory में 8-bit units में write नहीं किया जा सकता, जिससे graphics बिगड़ सकते हैं। Zig memory copy के समय optimization के लिए memcpy का उपयोग करता है, लेकिन यह GBA की "अजीब memory" के साथ टकरा सकता है.

1 टिप्पणियां

 
GN⁺ 2025-01-01
Hacker News टिप्पणियाँ
  • किसी खास address range के लिए memory access का तरीका तय करने की सुविधा चाहिए। अगर Zig documentation में volatile इस्तेमाल करने पर भी समस्या हल नहीं होती, तो compiler bug report करने की सलाह दी गई है
  • 5 साल पहले Linux इस्तेमाल करना इसलिए शुरू किया क्योंकि Windows पर Python सेटअप करना नहीं आता था। 1997-2015 के दौरान Windows प्रमुख operating system था, और इससे युवा पीढ़ी में knowledge gap और बढ़ गया। शुरुआती दौर में internet access आम नहीं था, और जिस operating system में programming environment न हो, उसमें programming के मौके छूट जाते थे
  • Game Boy Advance में video memory को 8-bit unit में नहीं लिखा जा सकता, और ऐसा करने पर graphics बिगड़ जाते हैं। Emulator में यह काम कर रहा था, लेकिन असली hardware पर समस्या मिली और उसे ठीक करना पड़ा। Nim भाषा के लिए GBA toolchain भी विकसित किया गया था
  • कभी-कभी compiler optimization के दौरान memory copy function को memcpy से बदल देता है। उम्मीद थी कि यह optimization सिर्फ user space में होगी, और -nostdlib option से इसे अपने-आप संभाला जा सकेगा
  • C में packed structs इस्तेमाल करने के तरीके के रूप में bitfields का सुझाव दिया गया। वैध C code का एक उदाहरण भी दिया गया
  • Game Boy Advance की memory समस्या हल करने के लिए किसी तरीके की ज़रूरत है। यह जानने की जिज्ञासा है कि LLVM इस feature को support करता है या नहीं, और माना गया कि इसे Zig में integrate करना बहुत मुश्किल नहीं होगा