2 poin oleh GN⁺ 4 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 4 jam lalu
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

    • Saat mengerjakan ini, saya juga menyadari hal yang sama. Memang harus ditulis jauh lebih eksplisit, tetapi cara kerja tiap fungsi secara individual pada dasarnya tidak berbeda
      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 lain
  • Ini 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

    • Saya sempat terobsesi dengan ide ini cukup lama, lalu akhirnya mulai, dan benar-benar tenggelam di dalamnya selama beberapa minggu
      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

    • Wah, proyek itu sebenarnya memberi saya banyak inspirasi. Dulu saya sempat membacanya dan sangat terkesan
      Saya penasaran apakah Anda keberatan kalau saya menambahkan tautan repositori Anda ke README saya
  • Sampul buku O'Reilly palsu itu benar-benar luar biasa

    • Buku itu justru menjadi pemicu persis kenapa ini dibuat sejak awal. Subjudul buku itu menghasilkan singkatan untuk nama proyek ini
  • Meski perbandingannya agak kurang bermakna, saya penasaran bagaimana performanya dibanding web server yang fiturnya lengkap. Ingin melihat metrik seperti jumlah request maksimum per detik

    • Sejujurnya saya belum melakukan benchmark, tetapi saya menduga ymawky cukup jauh lebih lambat daripada kebanyakan web server yang fiturnya lengkap
      ymawky memakai model fork untuk setiap koneksi, jadi secara mendasar lebih lambat daripada pendekatan yang dipakai server produksi seperti nginx atau Apache. nginx menggunakan I/O berbasis event dengan kqueue/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 request
      Kalau 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 mengukurnya
  • Bagus sekali. Saya juga sedang mengerjakan proyek serupa tetapi lebih kecil dengan RISC-V, dan ini luar biasa

    • Keren sekali. Kalau ada tempat Anda mempublikasikannya, saya benar-benar ingin melihatnya
  • 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

    • Saya juga pernah melakukan hal yang persis sama dan itu sangat menyenangkan. Bukan untuk merilis sesuatu yang baru ke dunia, cuma tantangan yang menyenangkan untuk diri saya sendiri
      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
    • Maksudnya software renderer 3D? Di masa remaja dan awal karier saya banyak belajar dengan membuat hal seperti itu memakai x86 dan C
      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_cgi

    • Wah, sejujurnya menulis skrip CGI dalam assembly terdengar lebih menakutkan daripada menulis server dalam assembly
      Dukungan 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

    • Memang membuat rendah hati. Jelas jalan mana yang lebih saya sukai
    • Siapa “kita” di sini? Saya tidak sampai kehilangan harga diri sampai menyerahkan kode hasil mesin yang asal-asalan alih-alih mengerjakan pekerjaan saya dengan benar