ymawky - ARM64 assembly ile doğrudan yazılmış bir web sunucusu
(github.com/imtomt)- ymawky, yalnızca ARM64 assembly ile yazılmış statik dosya web sunucusudur;
libcolmadan sadece syscall kullanır ve her bağlantı içinforkeden bir yapıyla çalışır - Geliştirme hedefi MacOS'tur ve çalışma yalnızca Apple silicon arm64 üzerinde mümkündür; derleme için Xcode Command Line Tools ve
makegerekir - Varsayılan çalıştırma
127.0.0.1:8080üzerinde başlar ve port belirtilebilir, ancak şu anda özel adres desteği yoktur; yalnızca127.0.0.1üzerinde çalışır - Belge kökü varsayılan olarak
www/dizinidir;GET /,www/index.htmldosyasını arar ve hata sayfalarıerr/(code).htmlüzerinden sunulacak şekilde yapılandırılmıştır - Desteklenen HTTP metodları GET, PUT, DELETE, OPTIONS, HEAD'dir; sunucu tarafı kod çalıştırma veya
/search?query=termgibi gelişmiş URL ayrıştırma desteklenmez PUT, varsayılan olarak en fazla 1GiB yüklemeyi destekler ve kısmi yüklemelerin mevcut dosyanın üzerine yazmaması için önce geçiciwww/.ymawky_tmp_<pid>dosyasına yazıp ardından rename ederGET,Range: bytes=isteklerini destekler;bytes=X-N,bytes=-N,bytes=X-biçimlerini işler ve video içinde ileri-geri sarmayı da iyi desteklediği belirtilir- Dosya uzantısına göre MIME tipi algılayarak
Content-Typeyanıt başlığını gönderir; web dosyaları, görseller, fontlar, belgeler, videolar, ses dosyaları ve sıkıştırılmış dosya uzantılarının çoğunu tanır - Yol güvenlik önlemleri olarak
PATH_MAXüzerindeki yolları reddeder,..tabanlı dizin kaçışını engeller, tüm istek yollarınawww/öneki ekler veO_NOFOLLOW_ANYile symlink içeren yolları reddeder - slowloris türü DoS hafifletmesi için okuma aralığı 10 saniyeyi aşarsa veya tüm başlıkların alınması 10 saniyeyi geçerse bağlantıyı kapatır ve
408 Request Timeoutdöndürür - HTTP/1.1 isteklerinde
Host:başlığı gereklidir;Hostdeğerini fiilen kullanmasa da RFC 9112 Bölüm 3.2 uyarınca başlığın varlığını zorunlu kılar config.Siçinde belge kökü, hata sayfası dizini, varsayılan dosya, alım zaman aşımı,PUThız ve boyut sınırları, maksimum eşzamanlı süreç sayısı gibi ayarlar değiştirilebilir- Linux veya diğer Unix sistemlerine taşımak için syscall çağrı register'ları ve
svc, hata dönüş yöntemi,fork(),SO_NOSIGPIPE,O_NOFOLLOW_ANY,renameatx_np(), struct yerleşimleri, Mach-O relocation sözdizimi, signal handling gibi bölümlerin değiştirilmesi gerekir
1 yorum
Hacker News yorumları
Gerçekte assembly, özellikle de makro assembler ile büyük programlar yazmayı denediğinizde, bunun sadece daha ayrıntılı olduğunu ve yüksek seviyeli programlamadan temelde çok da farklı olmadığını çabucak fark ediyorsunuz.
Sonuçta prosedürler ve makrolarla soyutlama kurmaya alışmak yeterli oluyor; ayrıca assembly’yi etkili biçimde okumak çoğu zaman yazmaktan çok daha zor olabiliyor.
strlen, ister C’de ister Rust’ta ister Assembly’de ya da başka bir dilde olsun, sonuçta dizgeyi dolaşıp NULL baytını bulur. CPU’nun tam olarak neyi hangi sırayla yapması gerektiğini doğrudan açıp yazdığınız için, bazen diğer dillere göre daha sezgisel bile gelebiliyor.Gerçekten çok güzel ve iyi yapılmış bir proje. Diğer yorumların devamı olarak bakarsak, bu tür projeler bana daha çok Minecraft haritası gibi geliyor.
Devasa ve hayranlık uyandıran haritalar da var, küçük hayatta kalma haritaları da, sadece arkadaşlarla ve kendin için yerelde açtığın haritalar da, ticari olarak büyük ölçeği hedefleyen sunucular da. AI sayesinde sunucuda ev yapmak ya da yeni yollar tasarlamak artık çok kolaylaştı ama o dünyada üretilen değer, sunucunun asıl amacına ve daha fazla evle yol yapmanın gerçekten anlamlı olup olmadığına bağlı.
Ticari sunucuların daha hızlı büyüyüp daha fazla ev ve yola sahip olabilmesi harika ama sanat projelerinin ürettiği sevgi ile kıyaslanamaz.
Birilerinin hâlâ böyle şeyleri eliyle doğrudan yapmaya giriştiğini görmek içimi ısıttı. Bunu yapan tek kişi ben değilmişim.
Benzer projeler varsa görmek isterim; bunu yapan tek kişi olmadığımı bilmek güzel. Çoğu programcının birkaç hafta ya da birkaç ay assembly öğrenmesi, CPU ve derlenen dillerin nasıl çalıştığına dair gizemin büyük kısmını ortadan kaldırır diye düşünüyorum.
Eğlenceli bir proje. x86 Linux için çok daha minimal bir sürüm yapmıştım; nasıl göründüğüne bakmak isterseniz burada: https://github.com/jcalvinowens/asmhttpd
README’me deponuzun bağlantısını eklememde sakınca olur mu diye merak ediyorum.
O sahte O'Reilly kitap kapağı gerçekten müthiş.
Pek anlamlı bir karşılaştırma olmasa da, tam özellikli web sunucularıyla kıyaslandığında performansın ne durumda olduğunu merak ediyorum. Saniye başına en yüksek istek sayısı gibi metrikleri görmek isterdim.
ymawky bağlantı başına
forkeden bir yapıda; bu da nginx ya da Apache gibi üretim ortamı sunucularının kullandığı yaklaşımdan temelde daha yavaş. nginx, olay tabanlı G/Ç içinkqueue/epollkullanıyor; böylece her istek için süreç çatallamanın ek yükü olmadan binlerce eşzamanlı bağlantıyı işleyebiliyor. Apache ise her istek için yenisini oluşturmak yerine birden fazla bağlantıyı işlemek üzere thread pool kullanıyor.Diğer web sunucularıyla doğrudan karşılaştırma yaparsanız çoğunlukla bağlantı başına fork ile event loop/thread pool arasındaki farkı ölçmüş olursunuz; bunun assembly ile pek ilgisi yok.
Aynı şekilde bağlantı başına çatallayan bir sunucunun C ile yazılmış sürümüyle kıyaslansa, aktarım hızının neredeyse aynı olacağını tahmin ediyorum. Çünkü bu modelde darboğaz gerçek kod değil,
fork()çağrısının kendisi. Saniye başına istek sayısından çok ikili dosya boyutu ve başlangıç süresine etki etmesi daha muhtemel. Yine de gerçekten benchmark yapmak eğlenceli olurdu.Güzel iş. Ben de RISC-V ile benzer ama daha küçük bir proje üzerinde çalışıyorum; bu gerçekten harika.
Bu vibe coding dünyasının gittiği yöne bilerek ters gitmek ve yeniden meydan okunuyormuş gibi hissetmek istediğim için bir WebAssembly yazılım rasterizer’ı yazmayı deniyorum.
Bitirebilir miyim bilmiyorum, çılgınca ve pek de faydalı denemez. Ama gerçekten iyi hissettiriyor.
Asıl yazarı başarısından dolayı tebrik ederim.
Bitirdikten sonra onunla bir oyun yapıyorum ama artık meydan okuma hissi kalmadığı için o tarafta pek ilerleyemiyorum. Yine de sorun değil, eğlenceliydi. Vibe coding ile yapsaydım o eğlenceyi ya da tatmini alamazdım.
LLM’in saf 8088 assembler ile CGA için bir rasterizer’ı ne kadar iyi yazabildiğini görmek istedim ve denettim; tek seferde gayet iyi bir demo üretti. Prompt’a Elite gemisinin vektörlerini vermiştim.
https://imgur.com/a/Dy5rUku
İlk assembly projelerimden biri, %100 x86 assembly ile yazılmış bir CGI betiği idi.
Elbette tam bir web sunucusu çok daha etkileyici. Yine de yeni başlayanlara önce Apache’nin CGI ve
mod_cgitarafına bakmalarını öneririm.CGI desteği birkaç haftadır aklımda ama henüz ciddi biçimde içine dalmadım. Herhangi bir yerde barındırılmış örneği varsa görmek isterim; ileride bunun üzerinde çalışırken iyi bir referans olabilir.
Biz AI’a geçerken kod yazmayı ve kafa patlatmayı bırakıyoruz, burada ise biri assembly ile web sunucusu yazıyor.
İnsanı alçakgönüllü yapıyor.