
'굳이 왜?'라는 질문이 가장 잘 어울리는 프로젝트
가끔 개발 세계에는 실용성과는 거리가 먼데도 마음을 빼앗기는 프로젝트가 있어요. 이번 'ymawky'가 딱 그래요. 순수 ARM64 어셈블리어로만 짠 웹서버인데, 이번엔 리눅스로 포팅하면서 CGI 기능까지 붙였대요. 만든 사람도 설명에 '딱히 이유는 없다(for no reason)'고 솔직하게 적어놨어요. 그런데 바로 그 '이유 없음'이 이 프로젝트의 매력이자, 의외로 배울 게 많은 지점이에요.
어셈블리로 웹서버를 짠다는 게 무슨 의미냐면
먼저 어셈블리어가 뭔지부터 풀어볼게요. 우리가 평소 쓰는 파이썬이나 자바스크립트는 사람이 읽기 편한 고급 언어예요. 컴퓨터는 사실 이런 말을 못 알아들어서, 컴파일러나 인터프리터가 0과 1로 된 기계어로 번역해줘야 돌아가거든요. 어셈블리어는 그 기계어 바로 한 단계 위, 그러니까 CPU가 실제로 실행하는 명령어 하나하나에 거의 1:1로 대응하는 가장 낮은 수준의 언어예요. 'ARM64'는 그중에서도 요즘 애플 실리콘 맥이나 라즈베리 파이, 스마트폰에 들어가는 ARM 계열 64비트 CPU의 명령어 체계를 말해요.
그러니까 이 사람은 'GET 요청이 들어오면 파일을 읽어서 HTTP 응답을 돌려준다'는, 보통 같으면 몇 줄이면 끝날 일을 CPU 명령어 수준에서 한 땀 한 땀 직접 짠 거예요. 비유하자면, 자동변속기 자동차를 두고 굳이 엔진 부품을 직접 깎아서 차를 모는 셈이죠.
기술적으로 들여다보면
어셈블리로 웹서버를 만들려면 평소 프레임워크가 다 숨겨주던 일들을 전부 손으로 해야 해요. 핵심은 시스템 콜(syscall)이에요. 이게 뭐냐면, 프로그램이 네트워크 연결을 열거나 파일을 읽는 것처럼 운영체제의 힘을 빌려야 하는 일을 할 때 커널에 직접 요청하는 통로예요. 보통은 라이브러리가 알아서 호출해주지만, 순수 어셈블리에서는 socket, bind, listen, accept, read, write 같은 시스템 콜을 레지스터(CPU 안의 작은 임시 저장 공간)에 번호와 인자를 직접 채워 넣고 호출해야 해요. 리눅스로 포팅했다는 건, 기존에 다른 OS의 시스템 콜 규약(번호와 호출 방식)을 리눅스 ARM64 규약에 맞게 전부 다시 맞췄다는 뜻이에요. OS마다 이 약속이 다르거든요.
여기에 더해진 CGI도 짚어볼게요. CGI(Common Gateway Interface)는 웹서버가 외부 프로그램을 실행해서 그 출력 결과를 웹페이지로 돌려주는 옛날 방식의 표준이에요. 요즘은 잘 안 쓰지만, 동작 원리가 깔끔해서 학습용으로 좋아요. 웹서버가 자식 프로세스를 띄우고, 요청 정보를 환경 변수로 넘겨주고, 그 프로그램의 표준 출력을 받아서 응답으로 흘려보내는 구조거든요. 이걸 어셈블리로 구현했다는 건 fork(프로세스 복제), exec(다른 프로그램으로 교체), 파이프를 통한 입출력 연결 같은 운영체제의 깊은 부분까지 손으로 다뤘다는 의미예요. 정말 만만치 않은 작업이에요.
이런 프로젝트가 가지는 의미
비슷한 결의 프로젝트들이 종종 등장해요. C 라이브러리(libc) 없이 순수 시스템 콜만으로 도는 바이너리를 만든다든가, 어셈블리로 운영체제나 게임을 짜는 사람들이 있죠. 이런 작업은 실무 생산성과는 거의 상관없어요. 하지만 평소 우리가 'pip install' 한 줄, 'npm install' 한 줄로 당연하게 가져다 쓰는 추상화 아래에서 실제로 무슨 일이 벌어지는지를 적나라하게 보여준다는 점에서 가치가 있어요. 프레임워크가 친절하게 가려둔 커튼을 직접 걷어내는 경험인 거죠.
한국 개발자에게 주는 시사점
물론 우리가 내일부터 어셈블리로 서버를 짤 일은 없어요. 하지만 이런 프로젝트를 한 번 들여다보는 것만으로도 얻는 게 있어요. HTTP 요청 하나가 들어와서 응답이 나가기까지, 소켓이 어떻게 열리고 시스템 콜이 어떻게 오가는지를 이해하면 평소 성능 튜닝이나 장애 디버깅을 할 때 시야가 완전히 달라지거든요. '네트워크가 느려요'라는 막연한 문제를 만났을 때, 그 아래 계층을 그려볼 수 있는 사람과 그렇지 않은 사람은 접근법부터 다르니까요. 저수준을 이해하는 건 어셈블리를 직접 쓰기 위해서가 아니라, 고수준 코드를 더 잘 쓰기 위해서예요.
마무리
'굳이?'라는 말이 절로 나오는 이 웹서버는, 우리가 매일 쓰는 추상화의 바닥이 실제로 어떻게 생겼는지 보여주는 살아있는 교재예요. 여러분은 평소 쓰는 도구의 '아래 한 계층'을 얼마나 들여다보시나요? 가끔은 이렇게 바닥까지 내려가 보는 경험이 개발자를 한 뼘 키워주는 것 같지 않나요?
🔗 출처: Hacker News