- ymawky adalah server web file statis yang ditulis hanya dengan assembly ARM64, bekerja tanpa libc dan hanya menggunakan syscall, dengan arsitektur yang melakukan
fork untuk setiap koneksi
- Target pengembangannya adalah MacOS dan hanya dapat dijalankan di Apple silicon arm64; untuk build dibutuhkan Xcode Command Line Tools dan
make
- Eksekusi default dimulai di
127.0.0.1:8080; port bisa ditentukan, tetapi saat ini alamat kustom belum didukung dan hanya berjalan di 127.0.0.1
- Document root secara default adalah
www/, dan GET / akan mencari www/index.html; halaman error dikonfigurasi agar disajikan dari err/(code).html
- Metode HTTP yang didukung adalah GET, PUT, DELETE, OPTIONS, HEAD; eksekusi kode sisi server atau parsing URL lanjutan seperti
/search?query=term tidak didukung
PUT secara default mendukung upload hingga 1GiB, menulis lebih dulu ke file sementara www/.ymawky_tmp_<pid> lalu melakukan rename agar upload parsial tidak menimpa file yang sudah ada
GET mendukung permintaan Range: bytes= dan menangani format bytes=X-N, bytes=-N, bytes=X-; disebutkan juga mendukung pencarian posisi video dengan baik
- Berdasarkan ekstensi file, server mendeteksi tipe MIME dan mengirim header respons
Content-Type; server mengenali banyak ekstensi file web, gambar, font, dokumen, video, audio, dan arsip terkompresi
- Sebagai pengaman jalur, server menolak path dengan panjang
PATH_MAX atau lebih, memblokir pelarian path berbasis .., menambahkan prefiks www/ ke semua path permintaan, dan menolak path yang mencakup symlink dengan O_NOFOLLOW_ANY
- Untuk mitigasi DoS tipe slowloris, jika jeda antar-pembacaan melebihi 10 detik atau penerimaan seluruh header melebihi 10 detik, koneksi ditutup dan
408 Request Timeout dikembalikan
- Permintaan HTTP/1.1 memerlukan header
Host:; meski nilai Host tidak benar-benar digunakan, keberadaan header tetap diwajibkan sesuai RFC 9112 Section 3.2
- Di
config.S, Anda dapat menyesuaikan document root, direktori halaman error, file default, timeout penerimaan, batas kecepatan dan ukuran PUT, jumlah maksimum proses simultan, dan lainnya
- Untuk mem-porting ke Linux atau Unix lain, perlu penyesuaian pada register pemanggilan syscall dan
svc, cara pengembalian error, fork(), SO_NOSIGPIPE, O_NOFOLLOW_ANY, renameatx_np(), layout struct, sintaks relokasi Mach-O, penanganan sinyal, dan lainnya
1 komentar
Pendapat Hacker News
Kalau benar-benar menulis program besar dengan assembly, terutama macro assembler, kita cepat sadar bahwa itu pada dasarnya tidak terlalu berbeda dari pemrograman tingkat tinggi, hanya lebih bertele-tele
Pada akhirnya, yang penting adalah membiasakan diri membangun abstraksi dengan prosedur dan makro, dan sering kali membaca assembly secara efektif jauh lebih sulit daripada menulisnya
strlen, baik di C, Rust, Assembly, atau bahasa lain, pada akhirnya tetap menelusuri string untuk mencari byte NULL. Karena kita menuliskan secara gamblang persis apa yang harus dilakukan CPU dan dalam urutan seperti apa, kadang justru terasa lebih intuitif daripada bahasa lainIni proyek yang sangat indah dan dibuat dengan sangat baik. Menyambung komentar lain, proyek seperti ini bagi saya lebih mirip map Minecraft
Ada map yang besar dan menakjubkan, ada map survival kecil, ada map yang dibuka lokal hanya untuk saya dan teman-teman, dan ada server yang menargetkan skala besar secara komersial. Berkat AI, membangun rumah di server atau merancang jalan baru jadi sangat mudah, tetapi nilai yang tercipta di dunia itu bergantung pada tujuan awal server tersebut dan apakah menambah rumah serta jalan benar-benar bermakna
Server komersial yang bisa tumbuh lebih cepat dan punya lebih banyak rumah serta jalan tentu hebat, tetapi rasa sayang yang dihasilkan proyek seni tidak ada bandingannya
Rasanya hangat mengetahui masih ada orang yang mau melakukan hal seperti ini dengan tangan sendiri. Ternyata bukan cuma saya
Kalau ada proyek serupa saya ingin melihatnya, dan senang ternyata bukan cuma saya. Saya rasa kalau kebanyakan programmer belajar assembly selama beberapa minggu atau bulan, banyak rasa misteri tentang bagaimana CPU dan bahasa terkompilasi bekerja akan hilang
Proyek yang menarik. Saya punya versi yang jauh lebih minimal untuk x86 Linux, kalau ingin melihat seperti apa, ada di sini: https://github.com/jcalvinowens/asmhttpd
Saya penasaran apakah Anda keberatan kalau saya menambahkan tautan repositori Anda ke README saya
Sampul buku O'Reilly palsu itu benar-benar luar biasa
Meski perbandingannya agak kurang bermakna, saya penasaran bagaimana performanya dibanding web server yang fiturnya lengkap. Ingin melihat metrik seperti jumlah request maksimum per detik
ymawky memakai model
forkuntuk setiap koneksi, jadi secara mendasar lebih lambat daripada pendekatan yang dipakai server produksi seperti nginx atau Apache. nginx menggunakan I/O berbasis event dengankqueue/epoll, sehingga bisa menangani ribuan koneksi serentak tanpa overhead mem-fork proses untuk tiap request. Apache memakai thread pool untuk menangani banyak koneksi tanpa membuat yang baru setiap kali ada requestKalau dibandingkan langsung dengan web server lain, yang kebanyakan diukur sebenarnya hanyalah perbedaan antara fork per koneksi versus event loop/thread pool, dan itu tidak terlalu ada hubungannya dengan assembly
Kalau dibandingkan dengan server yang juga mem-fork per koneksi tetapi ditulis dalam C, throughput-nya kemungkinan hampir sama. Bottleneck model ini bukan pada kode aslinya, melainkan pada
fork()itu sendiri. Dampaknya mungkin lebih terasa pada ukuran biner dan waktu startup daripada request per detik. Meski begitu, tetap akan menarik untuk benar-benar mengukurnyaBagus sekali. Saya juga sedang mengerjakan proyek serupa tetapi lebih kecil dengan RISC-V, dan ini luar biasa
Saya sedang mencoba menulis software renderer WebAssembly karena ingin sengaja melawan arah dunia vibe coding ini, dan ingin kembali merasakan tantangan
Saya tidak tahu apakah saya akan menyelesaikannya, dan ini memang gila serta mungkin tidak berguna. Tapi rasanya sangat menyenangkan
Selamat atas pencapaian penulis aslinya
Setelah selesai, saya membuat game dengan itu, dan sekarang progres di bagian itu lambat karena keseruan tantangannya sudah hilang. Tapi tidak apa-apa, karena itu menyenangkan. Kalau dilakukan dengan vibe coding, saya tidak akan mendapatkan kesenangan atau kepuasan seperti itu
Saya ingin melihat seberapa baik LLM menulis renderer untuk CGA dalam assembly 8088 murni, jadi saya coba minta, dan ternyata langsung menghasilkan demo yang lumayan bagus dalam sekali jalan. Di prompt saya masukkan vektor kapal dari Elite
https://imgur.com/a/Dy5rUku
Salah satu proyek assembly pertama saya adalah skrip CGI yang ditulis 100% dalam assembly x86
Web server penuh jelas lebih mengesankan. Tapi untuk pemula, saya tetap ingin menyarankan agar mulai dengan melihat CGI Apache dan
mod_cgiDukungan CGI sudah saya pikirkan sejak beberapa minggu lalu, tetapi belum benar-benar saya dalami. Kalau ada yang di-host di suatu tempat, saya ingin melihatnya, sepertinya bisa jadi referensi yang bagus saat nanti saya mengerjakannya
Kita sedang beralih ke AI dan berhenti menulis kode serta memutar otak, sementara di sini ada yang menulis web server dalam assembly
Membuat rendah hati