ymawky – direkt in ARM64-Assembler gebauter Webserver
(github.com/imtomt)- ymawky ist ein statischer Datei-Webserver, der ausschließlich in ARM64-Assembler geschrieben ist, ohne libc auskommt, nur Syscalls verwendet und mit einer Architektur arbeitet, die pro Verbindung
forkausführt - Das Entwicklungsziel ist MacOS; lauffähig ist er nur auf Apple silicon arm64. Für den Build werden die Xcode Command Line Tools und
makebenötigt - Standardmäßig startet er auf
127.0.0.1:8080. Ein Port kann angegeben werden, benutzerdefinierte Adressen werden derzeit jedoch nicht unterstützt, sodass er nur auf127.0.0.1läuft - Das Document Root ist standardmäßig
www/;GET /sucht nachwww/index.html, und Fehlerseiten sind so konfiguriert, dass sie auserr/(code).htmlbereitgestellt werden - Unterstützte HTTP-Methoden sind GET, PUT, DELETE, OPTIONS, HEAD; serverseitige Codeausführung oder erweitertes URL-Parsing wie
/search?query=termwerden nicht unterstützt PUTunterstützt standardmäßig Uploads bis 1GiB und schreibt zunächst in die temporäre Dateiwww/.ymawky_tmp_<pid>, die anschließend per Rename umbenannt wird, damit partielle Uploads keine vorhandenen Dateien überschreibenGETunterstützt Anfragen mitRange: bytes=und verarbeitet die Formatebytes=X-N,bytes=-Nundbytes=X-; laut Beschreibung funktioniert auch Video-Seeking gut- Auf Basis der Dateierweiterung erkennt der Server MIME-Typen und sendet den Response-Header
Content-Type; erkannt werden zahlreiche Erweiterungen für Webdateien, Bilder, Schriftarten, Dokumente, Videos, Audiodateien und Archive - Zu den Sicherheitsmaßnahmen für Pfade gehören die Ablehnung von Pfaden ab
PATH_MAX, das Blockieren von Pfad-Ausbrüchen über.., das Voranstellen des Präfixeswww/bei allen Request-Pfaden sowie das Ablehnen von Pfaden mit Symlinks perO_NOFOLLOW_ANY - Zur Abschwächung von Slowloris-artigen DoS-Angriffen wird die Verbindung geschlossen und
408 Request Timeoutzurückgegeben, wenn zwischen zwei Lesevorgängen mehr als 10 Sekunden liegen oder der vollständige Header-Empfang länger als 10 Sekunden dauert - Bei HTTP/1.1-Requests ist der Header
Host:erforderlich; derHost-Wert selbst wird zwar nicht verwendet, aber die Existenz des Headers wird gemäß RFC 9112 Section 3.2 verlangt - In
config.Slassen sich Document Root, Fehlerseitenverzeichnis, Standarddatei, Empfangs-Timeout, Geschwindigkeits- und Größenlimits fürPUTsowie die maximale Zahl gleichzeitiger Prozesse anpassen - Für eine Portierung auf Linux oder andere Unix-Systeme müssten unter anderem die Register für Syscall-Aufrufe und
svc, die Art der Fehler-Rückgabe,fork(),SO_NOSIGPIPE,O_NOFOLLOW_ANY,renameatx_np(), Struktur-Layouts, die Mach-O-Relocation-Syntax und das Signal-Handling angepasst werden
1 Kommentare
Hacker-News-Kommentare
Wenn man tatsächlich große Programme in Assembly, insbesondere mit einem Makro-Assembler, schreibt, merkt man schnell, dass es im Grunde nicht fundamental anders ist als Programmierung auf höherem Niveau, nur ausführlicher
Letztlich reicht es, sich daran zu gewöhnen, mit Prozeduren und Makros Abstraktionen zu schaffen, und oft ist es viel schwieriger, Assembly effektiv zu lesen, als sie zu schreiben
strlenläuft am Ende in C, Rust, Assembly oder jeder anderen Sprache den String durch und sucht nach dem NULL-Byte. Weil man genau ausschreibt, was die CPU in welcher Reihenfolge tun soll, fühlt es sich manchmal sogar intuitiver an als in anderen SprachenDas ist wirklich ein schönes und hervorragend gemachtes Projekt. In Anknüpfung an andere Kommentare ist so ein Projekt für mich eher wie eine Minecraft-Map
Es gibt riesige, erstaunliche Maps, kleine Survival-Maps, Maps, die man lokal nur für sich und Freunde öffnet, und Server, die kommerziell groß werden wollen. Dank AI ist es sehr einfach geworden, auf dem Server Häuser zu bauen oder neue Wege zu entwerfen, aber der Wert, der in dieser Welt entsteht, hängt vom eigentlichen Zweck des Servers ab und davon, ob noch mehr Häuser und Straßen dort überhaupt sinnvoll sind
Dass kommerzielle Server schneller wachsen und mehr Häuser und Straßen haben können, ist großartig, aber die Zuneigung, die ein Kunstprojekt erzeugt, ist damit nicht vergleichbar
Es hat sich irgendwie warm angefühlt zu sehen, dass noch jemand so etwas von Hand direkt machen will. Ich bin also nicht der Einzige
Ich würde gern ähnliche Projekte sehen und freue mich, dass ich nicht der Einzige bin. Ich glaube, wenn die meisten Programmierer ein paar Wochen oder Monate lang Assembly lernen würden, würde viel von der Mystik darum verschwinden, wie CPU und kompilierte Sprachen funktionieren
Interessantes Projekt. Ich habe eine deutlich minimalere Version für x86 Linux gebaut; falls du sehen willst, wie die aussieht, hier ist sie: https://github.com/jcalvinowens/asmhttpd
Ich wollte fragen, ob es für dich in Ordnung wäre, wenn ich den Link zu deinem Repository in mein README aufnehme
Dieses gefälschte O'Reilly-Buchcover ist einfach großartig
Der Vergleich ist zwar wenig sinnvoll, aber ich würde trotzdem gern wissen, wie die Performance im Vergleich zu voll ausgestatteten Webservern aussieht. Ich würde gern Kennzahlen wie maximale Requests pro Sekunde sehen
ymawky nutzt ein Modell mit
forkpro Verbindung und ist daher grundsätzlich langsamer als produktionsreife Server wie nginx oder Apache. nginx verwendet ereignisbasierte I/O mitkqueue/epollund kann dadurch Tausende gleichzeitige Verbindungen ohne den Overhead eines Prozess-forkpro Request verarbeiten. Apache nutzt Thread-Pools und verarbeitet mehrere Verbindungen, ohne für jede Anfrage neu etwas zu erzeugenEin direkter Vergleich mit anderen Webservern würde meist nur den Unterschied zwischen fork pro Verbindung und Event-Loop bzw. Thread-Pool messen und hätte mit Assembly nur wenig zu tun
Wenn man stattdessen mit einem ähnlich aufgebauten, in C geschriebenen Server mit Fork pro Verbindung vergleicht, wäre der Durchsatz wahrscheinlich fast gleich. Der Flaschenhals dieses Modells ist nicht der eigentliche Code, sondern
fork()selbst. Wahrscheinlich wirkt es sich stärker auf Binärgröße und Startzeit aus als auf Requests pro Sekunde. Trotzdem wäre ein echter Benchmark sicher interessantGut gemacht. Ich arbeite auch an einem ähnlichen, aber kleineren Projekt mit RISC-V; das hier ist großartig
Ich habe Lust, bewusst gegen die Richtung anzuschwimmen, in die diese Welt des Vibe-Codings geht, und wieder das Gefühl zu haben, herausgefordert zu werden, deshalb versuche ich gerade, einen WebAssembly-Software-Renderer zu schreiben
Ich weiß nicht, ob ich es zu Ende bringen werde, es ist verrückt und man kann nicht behaupten, dass es nützlich wäre. Aber es fühlt sich wirklich gut an
Glückwunsch an den ursprünglichen Autor zu dieser Leistung
Danach baue ich damit ein Spiel, aber da der Reiz der Herausforderung jetzt weg ist, komme ich damit kaum noch voran. Macht aber nichts, denn es hat Spaß gemacht. Mit Vibe-Coding hätte ich dieses Vergnügen oder diese Zufriedenheit nicht gehabt
Ich wollte sehen, wie gut ein LLM einen Renderer für CGA in reinem 8088-Assembler schreiben kann, also habe ich es ausprobieren lassen, und es hat auf Anhieb ein ziemlich ordentliches Demo erzeugt. In den Prompt habe ich die Vektoren eines Elite-Raumschiffs gegeben
https://imgur.com/a/Dy5rUku
Eines meiner ersten Assembly-Projekte war ein CGI-Skript, das zu 100 % in x86-Assembly geschrieben war
Ein vollständiger Webserver ist natürlich noch deutlich beeindruckender. Trotzdem würde ich Anfängern empfehlen, sich zuerst CGI und
mod_cgiin Apache anzusehenÜber CGI-Unterstützung denke ich schon seit ein paar Wochen nach, habe mich aber noch nicht ernsthaft damit beschäftigt. Falls es irgendwo gehostet ist, würde ich es gern sehen; das könnte später eine gute Referenz sein, wenn ich daran arbeite
Wir wechseln gerade zu AI, hören auf, Code zu schreiben und uns den Kopf darüber zu zerbrechen, und hier schreibt jemand einen Webserver in Assembly
Das macht einen demütig