
매 프레임마다 자신의 소스 코드를 재컴파일하는 Pong 게임 — IOCCC29 우승작은 커스텀 컴파일러에 의해 생성됨
요약
IOCCC29 우승작인 'Ping Pong Prize'는 매 프레임마다 자신의 소스 코드를 재컴파일하여 게임 상태를 업데이트하는 독특한 Pong 게임입니다. 개발자는 직접 난해한 코드를 작성하는 대신, 최적화 패스를 통해 난해한 C 코드를 생성하는 커스텀 컴파일러 'Insert'를 사용했습니다.
핵심 포인트
- 매 프레임마다 게임 상태가 포함된 새로운 C 소스 코드를 출력하는 콰인(Quine) 방식 활용
- 커스텀 언어 'Insert'의 컴파일러가 최적화 과정을 통해 난해한 코드를 자동 생성
- 최적화(Optimization)와 난해화(Obfuscation)가 유사한 결과로 수렴할 수 있음을 증명
- 컴파일 및 실행 사이클을 자동화하여 실시간 게임 플레이 구현
Jonah Uellenberg는 이달 초 제29회 국제 난해한 C 코드 대회(International Obfuscated C Code Contest, IOCCC29)에서 매 프레임마다 자신의 소스 코드를 재컴파일하는 버전의 Pong 게임으로 Ping Pong Prize를 수상했습니다. 프로그램이 실행될 때마다 현재의 디스플레이와 게임 상태가 내장된 다음 프레임용 C 소스 코드를 출력하며, 따라서 해당 출력을 컴파일하고 실행하면 게임이 한 단계 진행됩니다. 다소 아이러니하게도, Uellenberg는 난해한(obfuscated) 코드를 직접 작성하지 않았습니다. 대신 그는 자신이 만든 Insert라는 프로그래밍 언어로 깔끔하고 주석이 달린 소스 코드를 작성했으며, 이 언어의 컴파일러가 상을 받은 뒤섞인 C 코드를 생성했습니다.
오늘의 저주받은 코드(cursed code): 자신의 소스 코드를 수정하며 Pong을 플레이하는 컴퓨터 프로그램. (각 프레임은 새로운 컴파일입니다). https://t.co/kS2ACZ7r79 pic.twitter.com/7yIc9tXSdPJune 26, 2026
Uellenberg는 출품 노트에서 우승 코드가 "실제로 난해하게 작성된 것이 아니다. 처음부터 그랬던 적이 없다"라고 적으며, 그것이 수작업으로 뒤섞은 것이 아니라 컴파일러의 출력물임을 강조했습니다. Insert 컴파일러는 C를 대상으로 하며, 데드 코드(dead code)를 제거하기 위한 생존성 분석(liveness analysis), 상수 폴딩(constant folding), 그리고 하나의 변수 슬롯을 여러 값에 재사용하는 변수 병합(variable-merging) 패스와 같이 상용 컴파일러가 수행하는 크기 최적화 패스(size-optimization passes)를 실행합니다. 그런 다음 반복되는 토큰 시퀀스는 바이트를 줄이기 위해 C 전처리기 정의(C preprocessor defines)로 압축됩니다. 그의 설명에 따르면, 최적화와 난해화(obfuscation)는 동일한 출력으로 수렴하는 경향이 있으며, 이것이 결과물이 단일 문자 식별자(single-character identifiers)의 벽과 상수 및 가변 값을 혼합한 데이터 배열로 읽히는 이유입니다.
콰인(Quine)은 실행했을 때 자신의 소스 코드를 출력하는 프로그램을 말합니다. Uellenberg의 버전은 수정된 자신의 복사본, 즉 업데이트된 게임 상태가 구워져 들어간(baked in) 다음 프레임용 소스를 출력합니다. 그것을 실행하면 그다음 프레임을 출력하며, 이 과정이 계속 반복됩니다.
플레이어는 명령줄 인자 (command-line argument)로 "w" 또는 "e"를 전달하여 오른쪽 패들을 움직이며, 컴퓨터 상대와 경쟁합니다. 또한 컴파일 및 실행 사이클을 자동화하는 번들 스크립트 (bundled script)를 실행하여 경기가 실시간으로 진행되도록 합니다. 컴퓨터를 이기면 프로그램은 Chrome 공룡 게임을 모델로 한 사이드 스크롤 점프 게임 (side-scrolling jumper)인 두 번째 게임으로 전환되며, 이 게임을 클리어하면 다시 원래 게임으로 돌아옵니다.
IOCCC29는 주최 측이 2020년부터 2024년까지 4년간의 휴식기를 가진 이후 열린 두 번째 대회입니다. 2025년 수상작들은 소스 코드가 대회의 GitHub 저장소 (repository)에 공개되기 전인 6월 6일, YouTube 라이브 스트리밍을 통해 발표되었습니다.
Uellenberg이 스스로 수정하는 콰인 (self-modifying quines)을 작성하기 시작한 이유로 꼽은 Yusuke Endoh는 올해 세 개의 상을 받았습니다. 1984년부터 Landon Curt Noll에 의해 운영되고 크리에이티브 커먼즈 라이선스 (Creative Commons license) 하에 출판되는 이 대회는, Pong 출품작에 대해 심사위원단으로부터 내년에는 "Quine Doom"을 만드는 것을 자제해 달라는 요청을 담은 노트를 받기도 했습니다.
이 출품작은 전적으로 CSS로 작성된 x86 CPU 에뮬레이터 (x86 CPU emulator written entirely in CSS)와 순수 SQL로 렌더링된 플레이 가능한 Doom 빌드 (playable build of Doom rendered in pure SQL)를 포함하여, 불가능해 보이는 재료로부터 완전한 시스템을 짜내는 최근의 다른 업적들과 나란히 이름을 올렸습니다. 심사위원단은 2026년 말쯤 IOCCC30을 개최할 계획입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Tom's Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기