ymawky - เว็บเซิร์ฟเวอร์ที่สร้างขึ้นเองด้วย ARM64 แอสเซมบลีล้วน
(github.com/imtomt)- ymawky เป็นเว็บเซิร์ฟเวอร์สำหรับไฟล์แบบสแตติกที่เขียนด้วย ARM64 แอสเซมบลีล้วน ใช้เพียง syscall โดยไม่มี libc และทำงานด้วยโครงสร้างที่
forkแยกต่อหนึ่งการเชื่อมต่อ - เป้าหมายการพัฒนาคือ MacOS และสามารถรันได้เฉพาะบน Apple silicon arm64 เท่านั้น โดยการบิลด์ต้องใช้ Xcode Command Line Tools และ
make - การรันค่าเริ่มต้นเริ่มที่
127.0.0.1:8080และสามารถระบุพอร์ตได้ แต่ขณะนี้ยังไม่รองรับการกำหนดที่อยู่เองและทำงานได้เฉพาะบน127.0.0.1 - document root คือ
www/ตามค่าเริ่มต้น โดยGET /จะค้นหาwww/index.htmlและหน้าข้อผิดพลาดถูกตั้งค่าให้ให้บริการจากerr/(code).html - HTTP methods ที่รองรับคือ GET, PUT, DELETE, OPTIONS, HEAD และไม่รองรับการรันโค้ดฝั่งเซิร์ฟเวอร์หรือการพาร์เซ URL ขั้นสูงอย่าง
/search?query=term PUTรองรับการอัปโหลดสูงสุด 1GiB ตามค่าเริ่มต้น โดยจะเขียนลงไฟล์ชั่วคราวwww/.ymawky_tmp_<pid>ก่อนแล้วค่อย rename เพื่อไม่ให้การอัปโหลดที่ไม่สมบูรณ์ไปทับไฟล์เดิมGETรองรับคำขอRange: bytes=และจัดการรูปแบบbytes=X-N,bytes=-N,bytes=X-ได้ โดยระบุว่ารองรับการ seek วิดีโอได้ดีด้วย- ตรวจจับ MIME type ตามนามสกุลไฟล์และส่ง response header
Content-Typeโดยรู้จักนามสกุลของไฟล์เว็บ, รูปภาพ, ฟอนต์, เอกสาร, วิดีโอ, เสียง และไฟล์บีบอัดจำนวนมาก - มีกลไกป้องกันเส้นทางด้วยการปฏิเสธ path ที่ยาวเกิน
PATH_MAX, บล็อกการหลุดออกนอกเส้นทางด้วย.., เติมคำนำหน้าwww/ให้ทุก request path และใช้O_NOFOLLOW_ANYเพื่อปฏิเสธ path ที่มี symlink รวมอยู่ด้วย - เพื่อบรรเทา DoS แบบ slowloris หากช่วงห่างระหว่างการอ่านเกิน 10 วินาที หรือใช้เวลารับ header ทั้งหมดเกิน 10 วินาที จะปิดการเชื่อมต่อและส่งกลับ
408 Request Timeout - คำขอ HTTP/1.1 ต้องมี header
Host:แม้จะไม่ได้ใช้งานค่าHostจริง แต่บังคับให้มี header นี้ตาม RFC 9112 Section 3.2 - สามารถปรับ document root, ไดเรกทอรีหน้าข้อผิดพลาด, ไฟล์ค่าเริ่มต้น, timeout การรับข้อมูล, ขีดจำกัดความเร็วและขนาดของ
PUT, จำนวนโปรเซสพร้อมกันสูงสุด ฯลฯ ได้ในconfig.S - หากต้องการพอร์ตไปยัง Linux หรือ Unix อื่น ๆ ต้องแก้ไขรีจิสเตอร์ที่ใช้เรียก syscall และ
svc, วิธีคืนค่าข้อผิดพลาด,fork(),SO_NOSIGPIPE,O_NOFOLLOW_ANY,renameatx_np(), เลย์เอาต์ของสตรักต์, ไวยากรณ์การรีโลเคตของ Mach-O, signal handling เป็นต้น
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้าได้ลองเขียนโปรแกรมขนาดใหญ่ด้วย แอสเซมบลี จริง ๆ โดยเฉพาะ macro assembler จะพบอย่างรวดเร็วว่ามันแค่ยืดยาวกว่า แต่โดยพื้นฐานแล้วไม่ได้ต่างจากการเขียนโปรแกรมระดับสูงนัก
สุดท้ายก็แค่ต้องคุ้นเคยกับการสร้าง abstraction ด้วย procedure และ macro และบ่อยครั้งการอ่านแอสเซมบลีให้มีประสิทธิภาพกลับยากกว่าการเขียนเสียอีก
strlenไม่ว่าจะใน C, Rust, Assembly หรือภาษาอื่น ๆ สุดท้ายก็แค่วนดูสตริงเพื่อหา NULL byte เท่านั้นเอง เพราะมันเป็นการคลี่ออกมาตรง ๆ ว่า CPU ต้องทำอะไรและทำตามลำดับไหน จึงมีบางครั้งที่รู้สึกว่ามันเข้าใจง่ายกว่าภาษาอื่นด้วยซ้ำเป็นโปรเจ็กต์ที่สวยมากและทำออกมาได้ดีมาก ถ้าจะต่อจากความเห็นอื่น ๆ สำหรับผมโปรเจ็กต์แบบนี้ใกล้เคียงกับ แผนที่ Minecraft
มีทั้งแผนที่ขนาดมหึมาที่น่าทึ่ง มีทั้งแผนที่ survival เล็ก ๆ มีทั้งแผนที่ที่เปิดเล่นกันในเครื่องกับเพื่อน ๆ และมีทั้งเซิร์ฟเวอร์ที่หวังขยายเชิงพาณิชย์ในระดับใหญ่ AI ทำให้การสร้างบ้านบนเซิร์ฟเวอร์หรือออกแบบถนนใหม่เป็นเรื่องง่ายมากแล้ว แต่คุณค่าที่เกิดขึ้นในโลกนั้นขึ้นอยู่กับจุดประสงค์ดั้งเดิมของเซิร์ฟเวอร์ และการสร้างบ้านกับถนนเพิ่มนั้นมีความหมายจริงหรือไม่
เซิร์ฟเวอร์เชิงพาณิชย์จะเติบโตได้เร็วขึ้นและมีบ้านกับถนนมากขึ้นก็ยอดเยี่ยมอยู่แล้ว แต่ ความรักที่งานศิลปะสร้างขึ้น เทียบกันไม่ได้เลย
ยังให้ความรู้สึกอบอุ่นที่ได้รู้ว่ายังมีคนอยากทำอะไรแบบนี้ ด้วยมือตัวเอง อยู่ ผมไม่ได้เป็นคนเดียว
ถ้ามีโปรเจ็กต์คล้าย ๆ กันก็อยากเห็นนะ และดีใจที่ไม่ได้มีแค่ผมคนเดียว ผมคิดว่าถ้าโปรแกรมเมอร์ส่วนใหญ่ลองเรียนแอสเซมบลีสักไม่กี่สัปดาห์หรือไม่กี่เดือน ความรู้สึกลึกลับเกี่ยวกับการทำงานของ CPU และภาษาที่ถูกคอมไพล์ จะหายไปมากทีเดียว
โปรเจ็กต์น่าสนุกดี ผมมี เวอร์ชันที่มินิมอลกว่ามาก สำหรับ x86 Linux อยู่ตัวหนึ่ง ถ้าอยากดูว่าเป็นยังไง ดูได้ที่นี่: https://github.com/jcalvinowens/asmhttpd
อยากถามว่าผมขอเพิ่มลิงก์ไปยังรีโปของคุณใน README ของผมได้ไหม
ปกหนังสือ O'Reilly ปลอม อันนั้นยอดเยี่ยมจริง ๆ
แม้จะเป็นการเปรียบเทียบที่อาจไม่ค่อยมีความหมาย แต่ก็สงสัยว่าเมื่อเทียบกับเว็บเซิร์ฟเวอร์ที่ฟีเจอร์ครบแล้ว ประสิทธิภาพ อยู่ประมาณไหน อยากเห็นตัวชี้วัดอย่างจำนวนคำขอต่อวินาทีสูงสุด
ymawky ใช้โครงสร้างที่
forkต่อหนึ่งการเชื่อมต่อ ดังนั้นจึงช้ากว่าโดยพื้นฐานเมื่อเทียบกับเซิร์ฟเวอร์สำหรับ production อย่าง nginx หรือ Apache nginx ใช้ I/O แบบ event-driven ด้วยkqueue/epollจึงรับการเชื่อมต่อพร้อมกันได้หลายพันรายการโดยไม่มี overhead จากการ fork process ต่อหนึ่งคำขอ ส่วน Apache ใช้ thread pool เพื่อรองรับหลายการเชื่อมต่อโดยไม่ต้องสร้างใหม่ทุกครั้งถ้าเอาไปเทียบตรง ๆ กับเว็บเซิร์ฟเวอร์อื่น สิ่งที่วัดได้ส่วนใหญ่ก็คงเป็นความต่างระหว่าง fork ต่อการเชื่อมต่อ กับ event loop/thread pool มากกว่าจะเกี่ยวกับแอสเซมบลีเอง
ถ้าเทียบกับเซิร์ฟเวอร์ที่ fork ต่อการเชื่อมต่อเหมือนกันแต่เขียนด้วย C ผมคิดว่า throughput คงแทบไม่ต่างกัน เพราะคอขวดของโมเดลนี้ไม่ใช่โค้ดจริง ๆ แต่เป็น
fork()เอง น่าจะส่งผลกับขนาดไบนารีและเวลาเริ่มต้นมากกว่าจำนวนคำขอต่อวินาที ถึงอย่างนั้นลอง benchmark จริงก็คงน่าสนุกดีทำได้ดีมาก ผมเองก็กำลังทำโปรเจ็กต์คล้าย ๆ กันแต่เล็กกว่านี้ด้วย RISC-V อันนี้ยอดเยี่ยมเลย
ผมอยากสวนทางกับทิศที่โลกของ vibe coding กำลังไป และอยากได้ความรู้สึกว่าตัวเองถูกท้าทายอีกครั้ง เลยกำลังจะลองเขียน WebAssembly software renderer
ไม่รู้ว่าจะทำจนจบได้ไหม มันอาจจะบ้าดีเดือดและอาจเรียกว่ามีประโยชน์ไม่ได้เลย แต่รู้สึกดีมากจริง ๆ
ขอแสดงความยินดีกับความสำเร็จของผู้เขียนต้นฉบับ
หลังจากทำเสร็จแล้วผมก็กำลังทำเกมด้วยมันอยู่ แต่ตอนนี้แรงสนุกจากความท้าทายหายไปแล้ว ฝั่งนั้นเลยคืบหน้าน้อย ไม่เป็นไรอยู่ดี เพราะมันสนุกไปแล้ว ถ้าทำด้วย vibe coding ก็คงไม่ได้ความสนุกหรือความพึงพอใจแบบนั้น
ผมอยากรู้ว่า LLM จะเขียนเรนเดอเรอร์สำหรับ CGA ด้วย 8088 แอสเซมบลี ล้วนได้ดีแค่ไหน เลยลองให้มันทำดู แล้วมันก็สร้างเดโมที่ใช้ได้ค่อนข้างดีตั้งแต่ครั้งแรกเลย ในพรอมต์ผมใส่เวกเตอร์ของยานจาก Elite ไปด้วย
https://imgur.com/a/Dy5rUku
หนึ่งในโปรเจ็กต์แอสเซมบลีชิ้นแรก ๆ ของผมคือ CGI script ที่เขียนด้วย x86 แอสเซมบลี 100%
แน่นอนว่าเว็บเซิร์ฟเวอร์เต็มรูปแบบนั้นน่าประทับใจกว่าอยู่แล้ว แต่ถ้าเป็นมือใหม่ ผมอยากแนะนำให้ไปดู CGI ของ Apache กับ
mod_cgiก่อนผมคิดเรื่องรองรับ CGI มาตั้งแต่หลายสัปดาห์ก่อนแล้ว แต่ยังไม่ได้ลงลึกจริงจัง ถ้ามีที่โฮสต์ไว้ที่ไหนก็อยากดู และน่าจะเป็นข้อมูลอ้างอิงที่ดีตอนผมมาทำต่อทีหลัง
เรากำลังย้ายไปหา AI จนเลิกเขียนโค้ดเองและเลิกปวดหัวกันไปแล้ว แต่ที่นี่กลับมีคนเขียน เว็บเซิร์ฟเวอร์ด้วยแอสเซมบลี อยู่
ทำให้รู้สึกถ่อมตัวเลย