- ymawky केवल ARM64 असेंबली में लिखा गया एक static file web server है, जो libc के बिना सिर्फ syscall का उपयोग करता है और हर connection पर fork करने वाली संरचना में काम करता है
- इसका development target MacOS है और यह केवल Apple silicon arm64 पर चल सकता है, जबकि build के लिए Xcode Command Line Tools और
make की आवश्यकता होती है
- डिफ़ॉल्ट रूप से यह
127.0.0.1:8080 पर शुरू होता है; port निर्दिष्ट किया जा सकता है, लेकिन अभी custom address समर्थित नहीं है और यह केवल 127.0.0.1 पर काम करता है
- document root डिफ़ॉल्ट रूप से
www/ है, और GET / पर www/index.html खोजा जाता है; error page को err/(code).html से देने के लिए कॉन्फ़िगर किया गया है
- समर्थित HTTP methods हैं GET, PUT, DELETE, OPTIONS, HEAD; server-side code execution या
/search?query=term जैसी advanced URL parsing समर्थित नहीं है
PUT डिफ़ॉल्ट रूप से अधिकतम 1GiB upload का समर्थन करता है, और partial upload से मौजूदा फ़ाइल overwrite न हो इसके लिए पहले temporary file www/.ymawky_tmp_<pid> में लिखकर फिर rename किया जाता है
GET Range: bytes= request को support करता है और bytes=X-N, bytes=-N, bytes=X- फ़ॉर्मेट संभालता है; बताया गया है कि यह video seeking को भी अच्छी तरह support करता है
- file extension के आधार पर MIME type का पता लगाकर
Content-Type response header भेजा जाता है, और web files, images, fonts, documents, videos, audio, तथा compressed file extensions की बड़ी संख्या को पहचाना जाता है
- path safety के लिए
PATH_MAX से लंबे path अस्वीकार किए जाते हैं, .. आधारित path escape रोका जाता है, सभी request path पर www/ prefix लगाया जाता है, और O_NOFOLLOW_ANY से symlink शामिल path को अस्वीकार किया जाता है
- slowloris जैसी DoS शमन के लिए यदि reads के बीच 10 सेकंड से ज़्यादा हो जाए या पूरा header प्राप्त करने में 10 सेकंड से अधिक लगें, तो connection बंद कर
408 Request Timeout लौटाया जाता है
- HTTP/1.1 request में
Host: header आवश्यक है; Host मान का वास्तव में उपयोग नहीं किया जाता, लेकिन RFC 9112 Section 3.2 के अनुसार header की उपस्थिति आवश्यक रखी गई है
config.S में document root, error page directory, default file, receive timeout, PUT speed और size limits, अधिकतम concurrent process count आदि समायोजित किए जा सकते हैं
- इसे Linux या अन्य Unix पर port करने के लिए syscall call registers और
svc, error return method, fork(), SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np(), struct layout, Mach-O relocation syntax, signal handling आदि में बदलाव करने होंगे
1 टिप्पणियां
Hacker News की राय
अगर आप वास्तव में assembly, खासकर macro assembler में बड़े प्रोग्राम लिखें, तो जल्दी समझ आ जाता है कि यह बस ज़्यादा verbose है, ऊँचे स्तर की programming से बुनियादी रूप से अलग नहीं
आखिरकार procedures और macros के ज़रिए abstraction बनाना सीख लेना काफी होता है, और assembly को प्रभावी ढंग से पढ़ना अक्सर उसे लिखने से कहीं ज़्यादा कठिन होता है
strlenचाहे C में हो, Rust में, Assembly में या किसी और भाषा में, आखिरकार string को traverse करके NULL byte ढूंढता है। क्योंकि इसमें ठीक-ठीक लिखा होता है कि CPU को क्या और किस क्रम में करना है, इसलिए कभी-कभी यह दूसरी भाषाओं से भी ज़्यादा intuitive लगता हैयह सचमुच एक खूबसूरत और अच्छी तरह बनाया गया project है। बाकी comments की बात आगे बढ़ाऊँ तो, मेरे लिए ऐसे projects Minecraft map जैसे हैं
कुछ maps विशाल और चौंका देने वाले होते हैं, कुछ छोटे survival maps, कुछ सिर्फ दोस्तों और अपने लिए local में खोले गए maps, और कुछ commercial scale का लक्ष्य रखने वाले servers होते हैं। AI की वजह से server पर घर बनाना या नई सड़कें design करना बहुत आसान हो गया है, लेकिन उस दुनिया में बनने वाली value इस बात पर निर्भर करती है कि server का मूल उद्देश्य क्या है और घरों व सड़कों को और बढ़ाना वास्तव में मायने रखता है या नहीं
commercial servers का तेज़ी से बढ़ना और ज़्यादा घर व सड़कें होना शानदार है, लेकिन art project से पैदा होने वाला लगाव उसकी तुलना में नहीं आता
यह जानकर अच्छा और गर्मजोशी भरा लगा कि आज भी कोई ऐसी चीज़ हाथ से खुद करने की कोशिश करता है। मैं अकेला नहीं था
अगर ऐसे मिलते-जुलते projects हों तो मैं उन्हें देखना चाहूँगा, और यह जानकर अच्छा लगा कि मैं अकेला नहीं हूँ। मुझे लगता है कि ज़्यादातर programmers अगर कुछ हफ्ते या कुछ महीने assembly सीखें, तो CPU और compiled languages के काम करने के तरीके को लेकर बहुत-सा रहस्य दूर हो जाएगा
मज़ेदार project है। मैंने x86 Linux के लिए इसका कहीं ज़्यादा minimal version बना रखा है, अगर देखना चाहें कि वह कैसा दिखता है, तो यह रहा: https://github.com/jcalvinowens/asmhttpd
मैं सोच रहा था कि क्या अपने README में आपके repository का link जोड़ना ठीक रहेगा
वह नकली O'Reilly book cover सच में कमाल का है
तुलना शायद बहुत मायने न रखे, लेकिन यह जानने की जिज्ञासा है कि पूरी सुविधाओं वाले web servers के मुकाबले इसकी performance कैसी है। मैं requests per second जैसे metrics देखना चाहूँगा
ymawky हर connection पर
forkकरता है, इसलिए यह बुनियादी रूप से उन production servers से धीमा है जैसे nginx या Apache। nginx event-driven I/O जैसेkqueue/epollका इस्तेमाल करता है, जिससे वह हर request पर process fork करने के overhead के बिना हज़ारों concurrent connections संभाल सकता है। Apache thread pool का इस्तेमाल करता है, ताकि हर request के लिए नया thread बनाने के बजाय कई connections संभाले जा सकेंदूसरे web servers से सीधी तुलना करने पर असल में ज़्यादातर per-connection fork बनाम event loop/thread pool का फ़र्क ही मापा जाएगा, assembly का नहीं
अगर इसकी तुलना किसी ऐसे server से करें जो C में लिखा गया हो और वही per-connection fork model अपनाता हो, तो throughput लगभग समान होगा। इस model की bottleneck असली code नहीं, बल्कि
fork()itself है। requests per second से ज़्यादा असर शायद binary size और startup time पर दिखे। फिर भी सच में benchmark करना मज़ेदार होगाबढ़िया बनाया है। मैं भी RISC-V पर इससे मिलता-जुलता लेकिन छोटा project कर रहा हूँ, और यह शानदार है
इस vibe coding वाली दुनिया जिस दिशा में जा रही है, उसके उलट थोड़ा जाना चाहता हूँ और फिर से चुनौती महसूस करना चाहता हूँ, इसलिए मैं WebAssembly software renderer लिखने की कोशिश कर रहा हूँ
पता नहीं इसे पूरा कर पाऊँगा या नहीं, यह पागलपन है, और इसे उपयोगी भी नहीं कह सकते। फिर भी यह बहुत अच्छा महसूस होता है
मूल लेखक की उपलब्धि पर बधाई
इसे पूरा करने के बाद मैं उसी से एक game बना रहा हूँ, लेकिन अब चुनौती वाली खुशी खत्म हो चुकी है, इसलिए उस तरफ़ ज़्यादा प्रगति नहीं हो रही। फिर भी कोई बात नहीं, क्योंकि मज़ा आया। अगर मैंने इसे vibe coding से किया होता, तो यह मज़ा या संतोष नहीं मिलता
मैं देखना चाहता था कि LLM शुद्ध 8088 assembler में CGA के लिए renderer कितना अच्छा लिख सकता है, इसलिए मैंने उसे यह काम दिया, और उसने एक ही बार में काफ़ी अच्छा demo बना दिया। Prompt में मैंने Elite spaceship के vectors दिए थे
https://imgur.com/a/Dy5rUku
मेरे शुरुआती assembly projects में से एक 100% x86 assembly में लिखा गया CGI script था
पूरा web server निश्चित रूप से ज़्यादा प्रभावशाली है। फिर भी अगर कोई beginner हो, तो मैं पहले Apache के CGI और
mod_cgiको देखने की सलाह दूँगाCGI support के बारे में मैं कुछ हफ्तों से सोच रहा था, लेकिन अभी तक ठीक से गहराई में नहीं गया। अगर यह कहीं hosted है तो मैं देखना चाहूँगा, बाद में काम करते समय यह अच्छा reference बन सकता है
हम AI की तरफ़ बढ़ते हुए code लिखना और सिर खपाना बंद कर रहे हैं, और यहाँ कोई assembly में web server लिख रहा है
विनम्र बना देता है