GN⁺: 1988년 국제 난독화 C 코드 대회 우승작, Xmas.c
(udel.edu)xmas.c 코드 분석
- 1988년에 만들어진 xmas.c라는 C 코드는 국제 난독화 C 코드 대회에서 우승함.
- 이 코드는 출력물보다 작은 크기로, 텍스트 압축 표준에 새로운 방향을 제시함.
- 코드를 컴파일하고 실행하면 파라미터 없이 작동하며, 재미있게도 타자기 키를 무작위로 두드린 것처럼 보임.
코드의 출력
- 코드를 실행하면 "크리스마스의 열두 날" 노래 가사가 출력됨.
- 출력 내용은 크리스마스 첫째 날부터 열두째 날까지의 선물을 나열한 가사임.
분석
- 코드를 이해하기 위해서는 더 읽기 쉬운 형태로 재작성해야 함.
- 재작성 과정에서 특정 문자열을 사용하여 치환 암호를 해독하는 방식이 드러남.
- 변수
t
는 재귀의 방향을 제어하는 데 중요한 역할을 함. - 코드는 재귀를 통해 치환 암호를 해독하고, 크리스마스 노래 가사를 출력함.
간소화
- 프로그램을 이해하고 나면, 일부 반복문과 C 문자열 라이브러리 함수를 사용하여 코드를 간소화할 수 있음.
- 최종적으로 코드를 간소화하면 단순히 가사를 출력하는 것으로 축소될 수 있음.
GN⁺의 의견
- 창의성의 극치: xmas.c 코드는 치환 암호와 재귀를 사용하여 난독화된 코드를 작성한 훌륭한 예시임. 이는 프로그래밍에서 창의성이 어떻게 표현될 수 있는지 보여줌.
- 교육적 가치: 코드를 분석하고 이해하는 과정은 초급 소프트웨어 엔지니어에게 프로그래밍 기술을 향상시키는 좋은 연습이 될 수 있음.
- 재미와 흥미: 이 코드는 프로그래밍의 재미를 발견하고, 복잡한 문제를 해결하는 즐거움을 경험할 수 있는 기회를 제공함.
Hacker News 의견
-
TeX 세계의 유사한 예로
xii.tex
가 있음:- TeX 문서에 복잡해 보이는 코드를 넣고
pdftex
을 실행하면, 예상과 다른 결과를 얻을 수 있음. 이는 shreevatsa.net에서 확인 가능.
- TeX 문서에 복잡해 보이는 코드를 넣고
-
이 코드는 콜모고로프 복잡성을 생각나게 함:
- 이해하기 어려운 코드가 원하는 결과를 만들어내는 것을 보고, 더 짧으면서도 같은 결과를 내는 프로그램이 있을지, 그리고 그것을 어떻게 찾을지에 대한 호기심을 자극함.
-
원래 발행됐을 때 이 코드를 받았지만, 파일 이름이 다름:
- "carol.c"라는 이름으로 저장되어 있었고, 최신 시스템에서 컴파일 및 실행해보니 컴파일러에서 경고 메시지가 출력됨.
-
IOCCC(International Obfuscated C Code Contest)가 2023년에도 여전히 활발함:
- IOCCC에 대한 설명이 훌륭하며, www.ioccc.org에서 확인할 수 있음.
-
경고를 끄면 최신 코드 저장소(trunk)에서도 작동함:
- compiler-explorer.com에서 해당 코드의 작동 여부를 확인할 수 있음.
-
Rosetta Code에도 비슷한 작업이 있음:
- "Old Lady Swallowed a Fly"라는 점점 길어지는 노래를 반복적으로 생성하는 프로그램 예제가 있음. rosettacode.org에서 확인 가능.
-
대학교 마지막 학기에 교수님이 이 코드 조각을 강의 시작 부분에서 보여준 좋은 기억이 있음:
- 2022년 당시 교수님의 강의에서 이 코드를 처음 접한 경험을 회상함.
-
대학 시절 C 언어에 대한 인쇄된 학습 자료에 이 코드가 있어서, 한 번 직접 타이핑해본 기억이 있음:
- C 언어를 배울 때 실제로 이 코드를 직접 입력해봄으로써 기억에 남는 경험을 함.
-
이 코드는 매우 오래된 버전의 C 언어를 사용함:
- main 함수의 시그니처가 오래된 K&R 스타일을 사용하고 있어서, 현재는 컴파일되지 않을 것이라는 의견을 제시함.
-
IOCCC에서 래리 월이 두 번이나 우승한 것과 그가 Perl을 설계한 것 사이의 연관성이 흥미로운 점 중 하나임:
- Perl의 설계자가 IOCCC에서 수상한 이력이 Perl 언어의 특징을 설명해주는 듯한 인상을 줌.