
C 프로그래머들이 가독성에 대해 저지른 새로운 범죄들
요약
제29회 국제 난해한 C 코드 콘테스트(IOCCC)의 2025년 결과가 발표되었습니다. 특히 단일 명령어 세트(OISC)인 Subleq를 활용해 소프트웨어 보존을 목표로 하는 Adrian Cable의 프로젝트가 주목받고 있습니다.
핵심 포인트
- IOCCC 2025 개최 및 23개의 우승작 선정
- Subleq 아키텍처를 이용한 소프트웨어 보존 프로젝트 소개
- 단일 명령어 세트(OISC)를 활용한 Linux 포팅 사례
- LLVM 기반 C 컴파일러 구축 및 에뮬레이션 가능성
제29회 국제 난해한 C 코드 콘테스트(International Obfuscated C Code Contest, 약칭 IOCCC)가 2025년 대회 결과와 함께 다시 돌아왔습니다. 올해 참가자 중 한 명은 독특하고 새로운 비책을 준비했습니다. 바로 실제 사용 사례(valid use case)를 갖춘 것입니다.
지난해 행사를 보도했을 당시, 이 대회는 4년의 휴식기를 깨고 막 부활한 상태였기에 이렇게 빨리 다시 돌아온 것을 보게 되어 기쁩니다.
이 글을 쓰는 시점을 기준으로 심사는 약 3주 전에 종료되었으나, YouTube에 녹화 영상이 있긴 해도 거의 3시간에 달하는 분량입니다. 각 우승자를 위한 개별 클립으로 편집하는 데 시간이 다소 걸렸으며, 이것이 우리가 지금 이 소식을 전하는 이유입니다. 이 프로그램들 중 상당수는 실제로 어떻게 작동하는지 직접 봐야만 믿을 수 있으며, 비디오 클립은 우리가 일반적으로 선호하는 형식은 아니지만 이 경우에는 매우 훌륭한 도구입니다.
올해는 무려 23개의 우승작이 선정되었으며, 여기에는 '해트트릭의 해트트릭'도 포함되어 있습니다. 즉, Yusuke Endoh, Nick Craig-Wood, Don Yang 세 명의 참가자가 각각 3개씩의 우승작을 배출했습니다. 저희가 개인적으로 엄선한 몇 가지 하이라이트만을 소개할 공간은 부족하지만, 모든 우승작을 읽어보시기를 강력히 추천합니다. 충분히 시간을 들일 가치가 있습니다.
IOCCC의 한 가지 특징은 심사위원인 Landon Curt Noll와 Leonid A. Broukhis가 매번 각 우승작을 위해 새로운 카테고리를 만들어낸다는 점입니다. 저희는 그들이 붙인 제목을 그대로 사용하므로, 소제목이 처음에 잘 이해되지 않더라도 관련 IOCCC 페이지를 읽어보면 설명이 될 수도 있지만... 굳이 의존하지는 마시기 바랍니다.
IOCCC29 – 2025/cable – 최고의 가상 에뮬레이터 (Best imaginary emulator)
우리가 모든 IOCCC의 모든 결과를 다 공부했다고 주장할 수는 없습니다. 1984년 첫 대회가 열렸을 때, 이 기자(vulture)는 아직 학교에 다니며 BASIC을 배우고 있었습니다. 하지만 올해는 Adrian Cable의 Subleq computer가 우리의 관심을 가장 많이 끌었습니다.
그 이유는 우리가 이미 그것, 혹은 적어도 그것과 밀접하게 관련된 프로젝트가 무엇을 하는지 살펴본 적이 있기 때문입니다. IOCCC로서는 이례적으로, 이 프로젝트는 소프트웨어 보존(software preservation) 분야에서 실제 사용 사례를 가지고 있습니다.
Eternal Software Initiative (ESI)의 아이디어는 매우 쉽게 에뮬레이션(emulation)되도록 특별히 설계된 컴퓨터 아키텍처를 구현함으로써, 원래의 하드웨어 플랫폼이 더 이상 존재하지 않게 된 이후에도 소프트웨어를 보존하는 것을 돕는 것입니다. GitHub에 샘플 구현체가 있습니다.
CPU 아키텍처는 새로운 것이 아닙니다. 이는 Subleq라고 불리는 단일 명령어 세트 컴퓨터 (One Instruction Set Computer, OISC)입니다. OISC는 RISC의 논리적 확장입니다. 명령어 세트를 단 하나의 명령어로 줄이는 것보다 더 줄일 수는 없기 때문입니다. 이 사례에서 그 명령어는 Subleq (subtract and branch if less than or equal to zero, 0 이하일 때 뺄셈 및 분기)입니다. 여기 2020년의 설명이 있으며, 그때도 새로운 것이 아니었습니다. 여기 2011년의 FPGA 하드웨어 [PDF]가 있습니다.
ESI는 소프트웨어로 Subleq를 구현했고, LLVM을 사용하여 이를 타겟으로 하는 C 컴파일러를 구축했으며, C 및 C++ 런타임 라이브러리를 포함하여 Linux를 이 아키텍처로 포팅했습니다. 해당 Linux에서 에뮬레이터를 실행하면, 이 아주 작은 기초로부터 어떤 하드웨어 아키텍처든 실행 가능한 버전으로 부트스트랩(bootstrap)할 수 있습니다.
그리고 우리는 정말로 '아주 작다'고 말하는 것입니다. 이것이 이 아키텍처의 IOCCC 수상 구현체입니다:
#include<SDL3/SDL.h> #define o s[1&s[t=e++]?s[t]/4:t]/4,t b,y,t,e,s[3<<27],V[32],*w,g;main(){for(g =SDL_GetWindowSurface(w=SDL_CreateWindow(0, 800,512,!read(b,s,'frog')));=o=y=o=o;~?~y ?e=1>(s[y]-=[s])?t:s&&++b>8e5?s[memcpy(3[ g],6[s]+s,25<<16),b=SDL_UpdateWindowSurface (w)]=4e,s/4:e:e:SDL_PollEvent(V)?y[s]=6[V ](1537-2V):0)^64||timespec_get(s+,1);}
이것이 전부입니다. 길이는 366바이트입니다.
네, 그래픽을 표시하기 위해 SDL 라이브러리에 의존하기는 하지만, 그럼에도 불구하고 이것이 상당히 놀랍다는 점에 동의하시리라 믿습니다.
데모 영상에서는 상당히 합리적인 속도로 풀 컬러 만델브로 집합 (Mandelbrot set)을 생성하고, Pong 게임을 플레이한 다음, Subleq에서 Linux와 몇 가지 앱이 실행되는 것을 보여줍니다. 이 영상을 볼 때, 주소와 우표를 붙일 공간이 충분히 남는 엽서 한 장에 이 소스 코드를 직접 손으로 쓸 수 있다는 점을 기억해 보세요. 단 9줄입니다.
조금 더 읽기 쉬운 버전의 코드도 여전히 단 91줄에 불과합니다.
Nick Craig-Wood의 해트트릭
'최고의 가상 에뮬레이터 (Best imaginary emulator)'와 더불어, 실제 에뮬레이터 부문에서도 우승자가 있습니다. Nick Craig-Wood는 놀랍게도 단 66줄의 C 언어로 작동하는 오리지널 Nintendo Game Boy 에뮬레이터를 선보였으며, 대회 규정에 맞춰 콘솔 모양처럼 코드를 포맷팅했습니다.
그의 또 다른 수상작은 '최고의 분수 에뮬레이터 (Best fractional emulator)'입니다. 이는 John Conway의 FRACTRAN 언어로 에뮬레이션된 Commodore 64 에뮬레이터(본문에는 그렇게 적혀 있습니다)의 믿기지 않을 정도로 작은 조합입니다.
또한 그는 '최고의 유니코드 활용 (Best use of Unicode)' 부문에서도 수상했는데, 이는 Forth의 한 버전을 구현한 것이며, C 코드 내에 회전하는 Mandelbrot 줌을 생성하는 Forth 프로그램을 포함하고 있습니다.
2025/endoh1 – 가장 눈부실 것 같은 작품
Yusuke Endoh가 거둔 세 번의 수상작 중 첫 번째는 Nixie tube(닉시관) 시뮬레이터입니다. The Reg FOSS 데스크가 신생 시절이었을 때, 전자 계산기(그리고 일부 주유기)는 이 방식으로 숫자를 표시했습니다. Nixie tube는 모든 숫자의 모양을 가진 필라멘트들이 차곡차곡 쌓여 있는 작은 전기관이며, 해당 필라멘트만 빛나게 하여 원하는 숫자를 표시합니다. 오늘날에도 여전히 새 Nixie tube를 구매할 수 있는데, Dalibor Farny가 운영하는 체코의 작은 회사가 이를 수작업으로 제작합니다.
많은 IOCCC 출품작과 마찬가지로, Endoh의 소스 코드는 자신이 시뮬레이션하는 대상의 모양을 띠도록 포맷팅되었습니다. 하지만 이 출품작의 경우, 이는 단순히 재미를 위한 사후 고려 사항이 아닙니다. 프로그램은 Nixie tube의 출력을 시뮬레이션하기 위해 자신의 소스 코드 내 숫자에 색상을 입혀 강조합니다. 소스 코드 자체가 곧 출력 메커니즘인 셈입니다.
우리는 '가장 충격적일 것 같은 작품 (Most likely to shock)'으로 선정된 Endoh의 두 번째 출품작에도 매료되었습니다. 이 작품은 놀라울 정도로 적은 공간에서 리히텐베르크 도형 (Lichtenberg figures)을 생성합니다. IOCCC가 시작될 무렵, 이 독사(vulture)는 이를 직접 구현하려고 시도했으나 끝내 제대로 작동시키지 못했습니다.
Endoh의 세 번째 우승작인 '가장 회복력 있는 승자 (Most resilient winner)'는 자신의 코드를 반복적으로 패치한 다음 스스로를 재구축하여, 자신이 그것을 수행하는 데 사용한 diff 도구로 소스 코드를 출력합니다. 적어도 이 독사(vulture)에게는 이것이 정신이 아득해지는 일이며, 이 일본인 프로그래머의 놀랍고도 기록적인 23번째 우승을 의미합니다.
첫 번째와 두 번째 작품에 충격과 황홀경을 느낀 심사위원들은 Tomoya Ishida의 '가장 마음을 진정시키는 상 (Most soothing award)' 수상작을 찬사했습니다. 이 작품은 'RELAX'라는 메시지를 포함한 단 36줄의 코드만으로, 합성된 해변 소리가 포함된 5분 길이의 앰비언트 곡이 담긴 WAV 파일을 생성합니다.
2025/uellenberg – Ping pong prize
우리는 자신의 소스 코드로부터 Nixie tube를 출력하기 위해 스스로 형식을 재구성하는 Endoh의 C 코드가 놀랍다고 생각했지만, Jonah Uellenberg의 출품작을 보고는 생각이 바뀌었습니다. 그의 Pong 게임은 콰인 (quine)입니다. 즉, 실행되었을 때 자신의 소스 코드를 출력으로 생성하는 프로그램입니다. 원본 Wiki 사이트 C2가 설명하듯, 이는 들리는 것보다 실질적으로 훨씬 더 어렵습니다.
Uellenberg의 프로그램은 우리가 상상했던 것보다 더 나아갑니다. 다른 많은 IOCCC 출품작들과 마찬가지로, 이 프로그램은 자체 소스 목록에 메시지를 포함하고 있습니다. 눈을 가늘게 뜨고 보면, 공백(whitespace) 속에 두 개의 패들과 공이 있는 Pong 화면을 볼 수 있습니다.
컴파일하여 실행하면 키 하나로 패들 중 하나를 움직일 수 있습니다... 그러면 프로그램은 자신의 소스 코드를 재구성하여 업데이트된 게임 화면을 보여주는, 약간씩 다른 새로운 버전을 출력합니다. 사용자는 이전 실행의 결과물을 반복적으로 컴파일함으로써 게임을 플레이합니다. 각 실행은 다음 게임을 위한 소스 코드를 출력합니다. 게임의 프레임 자체가 계속 변화하는 소스 코드인 셈입니다.
더 전통적인 게임의 재미를 원한다면, 3인 수상작인 '텔레포트할 가능성이 가장 높은 상 (Most likely to teleport)'은 비교적 직관적입니다. 단 54줄의 귀여운 코드로 구현된 로그라이크 (roguelike) 게임입니다.
Doctor Who의 팬들을 위해,
여기서는 선정된 작품 중 몇 가지만 강조해 보았습니다. 이 작품들은 다양한 이유로 진정으로 놀랍습니다. 예를 들어, Gil Dogon의 'Consistently constant' 수상작은 오일러 상수 (Euler's constant)의 수많은 자릿수를 출력하지만, 코드 내에서 단 하나의 변수만을 사용하며, 그 변수 이름은 당연하게도 e입니다. 추가적인 가치로서, 심사위원들과 참가자 모두 이 프로그램을 시 (verse)의 형태로 설명합니다.
이 콘테스트를 알려준 것에 대해, The Register는 Landon Curt Noll과 Reg의 독자 Anthony C Howe에게 감사를 표합니다. 다만 Howe에게는 일정한 이해관계가 있었다는 점을 언급해야겠습니다. 그는 정말 작지만 플레이 가능한 게임으로 '가장 침략할 가능성이 높은 (Most likely to invade)' 상을 받았는데, 이는 직장에서 몰래 플레이할 수 있도록 무해하게 보이게 설계되었던 특정 유형의 1980년대 PC 게임을 떠올리게 했습니다.
부트노트 (Bootnote)
Obfuscated C Contest (난해한 C 콘테스트)는 Underhanded C Contest (기만적인 C 콘테스트)와 혼동해서는 안 됩니다. 후자는 이러한 종류의 뒤틀린 천재성을 즐거운 장난이 아닌 기만적인 목적에 적용한 것입니다. ®
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기