ymawky - servidor web hecho directamente en ensamblador ARM64
(github.com/imtomt)- ymawky es un servidor web de archivos estáticos escrito únicamente en ensamblador ARM64; funciona sin libc, usando solo syscalls, y opera con una estructura que hace
forkpor cada conexión - El objetivo de desarrollo es MacOS y solo puede ejecutarse en Apple silicon arm64; para compilarlo se necesitan Xcode Command Line Tools y
make - La ejecución predeterminada inicia en
127.0.0.1:8080; se puede especificar el puerto, pero actualmente no se admite una dirección personalizada y solo funciona en127.0.0.1 - La raíz de documentos es
www/por defecto;GET /buscawww/index.html, y las páginas de error están configuradas para servirse desdeerr/(code).html - Los métodos HTTP soportados son GET, PUT, DELETE, OPTIONS, HEAD; no soporta ejecución de código del lado del servidor ni parsing avanzado de URL como
/search?query=term PUTsoporta por defecto subidas de hasta 1GiB y escribe primero en el archivo temporalwww/.ymawky_tmp_<pid>antes de hacer rename, para evitar que una subida parcial sobrescriba un archivo existenteGETsoporta solicitudesRange: bytes=y maneja los formatosbytes=X-N,bytes=-N,bytes=X-, por lo que se indica que también funciona bien para la búsqueda en video- Detecta el tipo MIME según la extensión del archivo y envía el encabezado de respuesta
Content-Type; reconoce muchas extensiones de archivos web, imágenes, fuentes, documentos, video, audio y archivos comprimidos - Como protecciones de ruta, rechaza rutas de tamaño
PATH_MAXo mayor, bloquea escapes de ruta basados en.., anteponewww/a todas las rutas solicitadas y usaO_NOFOLLOW_ANYpara rechazar rutas que incluyan symlinks - Para mitigar DoS del tipo slowloris, si pasan más de 10 segundos entre lecturas o si la recepción completa de encabezados tarda más de 10 segundos, cierra la conexión y devuelve
408 Request Timeout - Las solicitudes HTTP/1.1 requieren el encabezado
Host:; aunque el valor deHostno se usa realmente, se exige la presencia del encabezado según la Sección 3.2 de RFC 9112 - En
config.Sse pueden ajustar la raíz de documentos, el directorio de páginas de error, el archivo predeterminado, el timeout de recepción, los límites de velocidad y tamaño dePUT, y el número máximo de procesos simultáneos - Para portarlo a Linux u otros Unix, habría que modificar los registros de llamada de syscall y
svc, la forma de retorno de errores,fork(),SO_NOSIGPIPE,O_NOFOLLOW_ANY,renameatx_np(), el layout de estructuras, la sintaxis de relocaciones Mach-O, el manejo de señales y otros elementos
1 comentarios
Comentarios de Hacker News
En la práctica, cuando uno escribe programas grandes en ensamblador, especialmente con un ensamblador de macros, enseguida se da cuenta de que no es algo fundamentalmente distinto de la programación de alto nivel, solo más verboso
Al final basta con acostumbrarse a crear abstracciones con procedimientos y macros, y muchas veces leer ensamblador de forma efectiva es bastante más difícil que escribirlo
strlen, ya sea en C, Rust, Assembly o cualquier otro lenguaje, al final recorre la cadena buscando el byte NULL. Como uno escribe de forma explícita exactamente qué tiene que hacer la CPU y en qué orden, a veces incluso se siente más intuitivo que otros lenguajesEs un proyecto realmente hermoso y muy bien hecho. Siguiendo la idea de otros comentarios, para mí este tipo de proyecto se parece más a un mapa de Minecraft
Hay mapas enormes e impresionantes, mapas pequeños de supervivencia, mapas que abres localmente solo para ti y tus amigos, y también servidores comerciales que apuntan a una escala grande. Gracias a la IA, se volvió muy fácil construir casas en el servidor o diseñar caminos nuevos, pero el valor que se crea en ese mundo depende del propósito original del servidor y de si de verdad tiene sentido seguir agregando casas y caminos
Está muy bien que los servidores comerciales puedan crecer más rápido y tener más casas y caminos, pero el cariño que produce un proyecto artístico no tiene comparación
Me dio una sensación cálida saber que todavía hay gente que intenta hacer estas cosas a mano. No era solo yo
Si hay proyectos parecidos me gustaría verlos, y me alegra saber que no soy el único. Creo que si la mayoría de los programadores dedicara unas semanas o unos meses a aprender ensamblador, gran parte del misterio sobre cómo funcionan la CPU y los lenguajes compilados desaparecería
Proyecto divertido. Tengo por ahí una versión mucho más minimalista para x86 Linux; si quieres ver cómo se ve, está aquí: https://github.com/jcalvinowens/asmhttpd
Me preguntaba si te parecería bien que agregara el enlace a tu repositorio en mi README
Esa falsa portada de libro de O'Reilly está buenísima
Aunque sea una comparación un poco sin sentido, me da curiosidad qué tanta performance tiene frente a servidores web con todas las funciones. Me gustaría ver métricas como el máximo de solicitudes por segundo
ymawky usa una estructura de
forkpor conexión, así que es fundamentalmente más lento que el enfoque que usan servidores orientados a producción como nginx o Apache. nginx usa I/O basado en eventos conkqueue/epoll, lo que le permite manejar miles de conexiones concurrentes sin el costo de hacer fork de un proceso por cada solicitud. Apache usa pools de hilos para atender múltiples conexiones sin crear uno nuevo por cada solicitudSi lo comparas de frente con otros servidores web, en la práctica casi siempre estarás midiendo la diferencia entre fork por conexión y un loop de eventos o un pool de hilos, y eso tiene poco que ver con el ensamblador
Si se comparara con un servidor similar escrito en C que también haga fork por conexión, supongo que el throughput sería casi el mismo. El cuello de botella de este modelo no es realmente el código, sino
fork()en sí. Probablemente el mayor impacto estaría en el tamaño del binario y el tiempo de arranque más que en las solicitudes por segundo. Aun así, sería divertido medirlo de verdadMuy bien hecho. Yo también estoy trabajando en un proyecto parecido pero más pequeño con RISC-V, y esto está excelente
Como quiero ir un poco a contracorriente de hacia dónde va este mundo del vibe coding, y volver a sentirme desafiado, estoy intentando escribir un renderizador por software en WebAssembly
No sé si lo vaya a terminar, es una locura y tampoco diría que sea útil. Pero se siente muy bien
Felicidades al autor original por el logro
Después de terminarlo, estoy haciendo un juego con eso, pero ahora que ya se fue la emoción del reto, casi no avanzo por ese lado. Igual no importa, porque fue divertido. Si lo hubiera hecho con vibe coding, no habría obtenido esa diversión ni esa satisfacción
Quise ver qué tan bien un LLM podía escribir un renderizador para CGA en puro ensamblador 8088, así que se lo pedí, y de una sola vez produjo un demo bastante decente. En el prompt le metí los vectores de una nave de Elite
https://imgur.com/a/Dy5rUku
Uno de mis primeros proyectos en ensamblador fue un script CGI escrito 100% en ensamblador x86
Un servidor web completo sin duda es más impresionante. Aun así, si alguien está empezando, recomendaría primero buscar CGI de Apache y
mod_cgiLlevo unas semanas pensando en soporte CGI, pero todavía no me he metido a fondo. Si está alojado en algún sitio, me gustaría verlo; podría ser una buena referencia para cuando me ponga a trabajarlo más adelante
Mientras nosotros nos estamos pasando a la IA y dejamos de escribir código y de quebrarnos la cabeza, aquí alguien está escribiendo un servidor web en ensamblador
Te pone humilde