본문 바로 가기

[ 테크 ]

어셈블리의 낭만을 다시 한 번. 웹 어셈블리 진화론

by김국현

어셈블리의 낭만을 다시 한 번. 웹

일반에 공개된 포토샵 1.0의 소스코드가 최근 화제가 되었다. 열어 보니 파스칼과 어셈블리어가 적절하게 배합된 모습이 그 시절의 정취를 느끼게 했다.


어셈블리어는 기계어, 머신어 등으로도 불렸는데(물론 엄밀히는 다르지만), 기계가 말하는 그대로 완전 기계의 눈높이에서 프로그래밍을 하는 일이다. 경지에 이르면 6E 3A CF 20 등 대책 없는 16진수의 행진만 보고도 무슨 코드인지 얼핏 알 수 있기도 했다. 2진수가 아니라서 다행이었다고 여기며 기계와 친해졌다고나 할까.


기계의 프로그램을 사람이 이해하는 MOV, JMP 등 ‘니모닉(mnemonic, 기억법, 약칭)’으로 바꿔주는 것을 ‘디스어셈블’이라고 하는데, 8비트, 16비트 시절만 해도 ‘디스어셈블’ 한 번쯤 해보면서 기계의 말 한번 직접 들어보려는 것은 컴퓨터 키즈가 기계와 친해지는 방식이었다.


어셈블리어를 다룬다는 것은 순수히 기계의 수준으로 내려와서 사고한다는 뜻이기에, 어셈블리어에는 일종의 경외와 같은 아우라가 뒤따르기도 했다. 너무나 강력해서 곳곳에서 필요로 했지만, 누구나 다룰 수는 없었던 보검(寶劍)과도 같은 것이었다.


물론 실제로 기계어를 짤 때는 MOV, JMP 등의 니모닉으로 텍스트 파일로 작성 후 이를 진짜 기계어로 변환했는데, 이를 해주는 것이 어셈블러(ASM)였다. 인간이 회로 스위치 온·오프의 행렬을 기억할 수는 없는 일이니 기계의 말을 사람이 이해할 수 있을 정도로 (보통) 1:1로 대역(對譯)하는 작업이었다.

 

8비트, 16비트 시절의 컴퓨터는 너무나도 느렸기에, 모든 것을 일반 프로그래밍 언어로 짰다가는 버티기 힘들었다. 따라서 고속 연산이 필요한 기능 같은 것에는 어셈블리어가 고명처럼 올라가 있는 것이 보통이었다. 물론 아예 통째로 어셈블리어로 만들어진 것들도 많았다. DOS나 Lotus 1-2-3이 대표적이었는데, 할아버지 프로그래머들은 끈기가 있었다.


세월은 흘러 흘러 컴퓨터는 충분히 빨라져서 보통 언어를 컴파일한 것도 그럭저럭 잘 돌아갔다. 무엇보다도 기계어란 특정 CPU를 탑재한 특정 기계에서만 돌 수밖에 없었기에, 다양한 CPU와 다양한 기계가 당연시된 요즈음에는 무모한 일이 되어 버렸다. 인간이 기계의 말을 굳이 하는 일이 무의미해지다 못해 무모해진 시기가 도래해 버린 것.


그리고 어떤 현상이 발생하기 시작했는데, 지구상 모든 컴퓨터에 어떤 기계가 기생하게 된 것이다. 바로 브라우저마다 내장된 자바스크립트 엔진이었다. 그저 웹페이지의 효과를 내기 위한 코드를 실행하기 위한 실행기반 정도에서 시작한 자바스크립트 엔진이었지만, 구글이 V8을, MS가 Chakra를, 모질라가 스파이더몽키를, 애플 등이 자바스크립트 코어를 만드는 등 각사가 혼신의 힘을 들여 어엿한 기계를 하나씩 만들고 있었던 것.


그리고 그 완성품들은 웹브라우저가 없는 서버에까지 확장해갔으니 노드(Node.js)가 바로 그것이었다. 마치 미토콘드리아가 흡수되듯 기계들은 또 다른 기계를 받아들여 자신의 일부로 삼아갔다.

그런데 이 기생 기계를 돌리는 방법은 자바스크립트라는 다소 느린 언어를 매번 한 줄 한 줄 번역해 가는 방식이었다. 여기에서 코페르니쿠스적 전환이 일어나는데, 그렇다면 아예 이 기계의 눈높이에서 직접 말할 수 있으면 어떨까 고민하게 된 것이었다.


웹 기계의 기계어, 웹 어셈블리는 그렇게 생겨난다. 하지만 이 기생 기계의 기계어를 원어민처럼 바로 말하는 것은 역시나 인류에게는 힘든 일이다. 그렇다면 C나 C++과 같이 흔한 프로그래밍 언어로 짠 코드를 이 기계어로 바꿀 수 있게 된다면 어떨까? 그렇게 할 수만 있다면 이미 보통 기계용으로 만든 수많은 프로그램을 바로 웹이라는 가상 기계 위에서 돌릴 수 있게 된다.


웹 어셈블리가 웹을 기계답게 만드는 데 박차를 가하게 된 것이다. 오토캐드 등이 웹으로 이식되고, 소위 3세대 블록체인 등에도 스마트 컨트랙트 등 분산 앱을 만드는데 웹 어셈블리어를 채택한 예들이 생겨나고 있다.


예전 베이직이나 파스칼이 자신의 한계를 알고 어셈블리 코드에 의존했듯이 자바스크립트에서 웹어셈블리를 호출하는 풍경이라니. 서로 다른 이들이 어울려 함께 하는 우정이 느껴져 낭만적이다. 

공생, 공존, 그리고 진화. 기계의 세계도 어엿한 생태계였다.