- 13KiB आकार की एकल फ़ाइल में चलने वाला Snake गेम, जो Windows, Linux और ब्राउज़र—तीनों पर एक ही source से सपोर्ट करता है
- साँप को नियंत्रित करके खाना खाना और दीवार से टकराने से बचना—यह क्लासिक Snake नियमों का पालन करता है, और इसमें स्कोर, लेवल और maze संरचना शामिल है
- हर प्लेटफ़ॉर्म के लिए इसे C(WinAPI/X11) और JavaScript(HTML5 Canvas) में लागू किया गया है, और प्रत्येक को 3~5KiB स्तर तक compress और merge किया गया है
- Windows में असामान्य PE header और apphelp mechanism, Linux में lzma compression और shell dropper, और ब्राउज़र में HTML/CSS tricks का उपयोग करके इसे चलाया जाता है
- तीनों implementations को मिलाकर 13,312 bytes की एक single executable फ़ाइल बनाई गई, जो multi-platform executable संरचना की प्रायोगिक संभावना दिखाती है
Cosmopolitan libc से प्रेरित multi-platform प्रयास
- Cosmopolitan libc एक toolkit है जो C source code को कई operating systems पर चलने वाले single binary में compile कर सकती है
- Windows, Linux, BSD जैसे विभिन्न OS पर native execution को सपोर्ट करती है
- GUI सपोर्ट न होने और binary size के बड़े होने की सीमा के कारण, लेखक ने 16KiB से छोटे video game को खुद बनाने की चुनौती चुनी
- लक्ष्य था Windows, Linux और ब्राउज़र—तीनों पर चलने वाला single-source आधारित गेम बनाना
गेम की संरचना और नियम
- गेम एक standard Snake game है, जिसे arrow keys या WASD से नियंत्रित किया जाता है
ESCसे exit,Rसे reset,Pसे pause, और spacebar से start
- हर बार खाना खाने पर स्कोर बढ़ता है; सामान्य खाना 10 points देता है, जबकि पीला खाना (15% संभावना) 20 points देता है
- खाना कुछ समय बाद गायब हो जाता है, और गायब होने का समय साँप की speed (लंबाई के अनुपात में) पर निर्भर करता है
- 10 खाने खाने पर अगला level आता है, और दीवारों की व्यवस्था random रूप से बदल जाती है
- maze इस तरह बनाई जाती है कि खाने तक पहुँचने का रास्ता हमेशा मौजूद रहे
- साँप की शुरुआती position भी random होती है, लेकिन उसे ऐसी दिशा में रखा जाता है जहाँ कम से कम 5 cells की खाली जगह हो
- पूर्ण गेम फ़ाइल का आकार 13,772 bytes है
तीनों प्लेटफ़ॉर्म पर implementation का तरीका
- Windows version WinAPI-आधारित C code में लिखी गई है, जिसमें compression script और decompressor stub शामिल हैं
- PE header के
MZsignature के बाद मनचाहे control वाले bytes का उपयोग करके shell script embed की जाती है - इससे यह फ़ाइल Windows executable होने के साथ-साथ Linux shell script के रूप में भी valid रहती है
- पहली बार चलाने पर “The application was unable to start correctly (0xc0000005)” त्रुटि आ सकती है, लेकिन दोबारा चलाने पर यह सामान्य रूप से काम करती है
- PE header के
- Linux version में
lzmacompression का उपयोग होता है, और छोटा shell dropper compressed ELF64 binary को extract और execute करता है- इसे फ़ाइल के आगे और पीछे के कुछ हिस्सों को छोड़कर चलने के लिए बनाया गया है
- HTML version ब्राउज़र के उस व्यवहार का उपयोग करती है जिसमें वह फ़ाइल के अनावश्यक शुरुआती हिस्से को अनदेखा कर HTML को process करता है
- CSS के ज़रिए अनावश्यक data को स्क्रीन पर दिखाई देने से रोका जाता है
single file संयोजन और संरचना
- तीनों प्लेटफ़ॉर्म की फ़ाइलों को एक निश्चित क्रम में concatenate किया गया, ताकि हर environment सिर्फ अपने हिस्से को execute करे
- Windows PE section, Linux ELF section, और ब्राउज़र HTML section को पहचानता है
- अंतिम फ़ाइल का आकार 13,312 bytes है, और इस तरह तीनों environments में चलने वाला polyglot binary तैयार हुआ
- फ़ाइल के भीतर Windows PE header, Linux के लिए LZMA compressed code, और HTML/CSS/JavaScript code क्रम से शामिल हैं
- उदाहरण code block में
MZsignature,ksmarker,<html>tag,<script>block आदि क्रम से मौजूद हैं
- उदाहरण code block में
तकनीकी महत्व
- एक ही फ़ाइल में Windows, Linux और ब्राउज़र—तीनों को सपोर्ट करने वाली execution संरचना को लागू किया गया
- PE, ELF और HTML formats के nested उपयोग से प्लेटफ़ॉर्म-विशिष्ट execution path को branch किया गया
- 13KiB जैसे बेहद छोटे आकार में compression, format hacking और multi-platform execution को जोड़ने वाली यह एक प्रायोगिक उपलब्धि है
1 टिप्पणियां
Hacker News टिप्पणियाँ
मैंने Linux executable निकाला, लेकिन readelf और objdump उसे ठीक से पढ़ नहीं पाए, यह देखकर हैरानी हुई
जाँच करने पर पता चला कि जगह बचाने के लिए PT_DYNAMIC हेडर के अप्रयुक्त फ़ील्ड में dynamic linker का नाम जबरन डाला गया था
लेकिन format को जानबूझकर इस तरह तोड़ना मुझे बेकार की बचत लगता है
यह antivirus या DEP जैसी security features से टकरा भी सकता है, इसलिए ऐसे executable को छेड़ना नहीं चाहूँगा
यह देखकर हैरानी हुई कि मूल Zelda गेम का file size कितना छोटा था
इतने कम code और data से कितनी बड़ी भावनात्मक गहराई और immersion पैदा की गई, यह अद्भुत है
The Legend of Zelda (Wikipedia)
40 साल बाद map निकाला गया, और सिर्फ PNG ही 800KB से ज़्यादा निकला
गेम मैप देखें
designers ने space constraints के भीतर उन्हें puzzle की तरह व्यवस्थित किया था
Zelda map संरचना संदर्भ
मेरे test results
.htmlकर दें तो चल जाता हैlzmacommand न होने की error आई,xzpackage install करने पर काम करने लगा.comया.exeसे चलाने पर error (0xc0000005) आई, लेकिन DEP setting बंद करने पर चल गयाchmod +x snake.comकरके चलाने पर Mono उसे चलाने की कोशिश करता है और fail हो जाता हैलेकिन
bash snake.comसे चलाने पर ठीक चलता है। यह Debian 13 पर थादिलचस्प बात यह है कि यह file दरअसल तीन executable को एक में जोड़े गए रूप में है
इसलिए हर platform पर इसमें पूरी तरह अलग program भी रखा जा सकता है
इससे kkrieger नाम का 96KB का FPS गेम याद आ गया
उस समय उसके graphics level ने चौंका दिया था
kkrieger (archive)
Mac पर browser के अलावा इसे चलाने का कोई तरीका है क्या, यह जानना चाहता हूँ
cannot execute binary fileerror आ रही हैसोच रहा हूँ कि इस mechanism को आगे बढ़ाकर सचमुच का universal binary बनाया जा सकता है या नहीं
उदाहरण के लिए Haxe में code लिखकर उसे C++ में compile करें तो Win32 और Linux builds मिल जाएँगे,
फिर JavaScript में बदलकर HTML में भी चलने लायक बनाया जाए,
और उसके बाद इन तीनों outputs को एक file में जोड़ दिया जाए — कुछ ऐसा किया जा सकता है
एक ही file में हर जगह चल सकने वाले single executable app का विचार मुझे पसंद है
मैं भी serverless platform बनाते हुए इसी दिशा में काम कर रहा हूँ
एक अकेली
.htmlfile से data-driven app बनाना, और web-components को remote से लोड करना — यही structure हैfile://protocol से HTML को सीधे खोलने की क्षमता बहुत शक्तिशाली है, लेकिन अक्सर नज़रअंदाज़ कर दी जाती हैयानी उन्होंने सिर्फ browser instance launch नहीं किया, बल्कि दो पूरी native apps बनाई थीं
यह अजीब लगता है कि Polyglot file जैसी चीज़ इतनी देर से सामने आई
तकनीकी रूप से यह शायद 10~20 साल पहले भी संभव रही होगी
EICAR.COM text और executable दोनों होने वाले शुरुआती examples में से एक के रूप में याद आता है
js13kGames जैसी ultra-small webgame competitions याद आ गईं