3P by neo 7달전 | favorite | 댓글 1개

xmas.c 코드 분석

  • 1988년에 만들어진 xmas.c라는 C 코드는 국제 난독화 C 코드 대회에서 우승함.
  • 이 코드는 출력물보다 작은 크기로, 텍스트 압축 표준에 새로운 방향을 제시함.
  • 코드를 컴파일하고 실행하면 파라미터 없이 작동하며, 재미있게도 타자기 키를 무작위로 두드린 것처럼 보임.

코드의 출력

  • 코드를 실행하면 "크리스마스의 열두 날" 노래 가사가 출력됨.
  • 출력 내용은 크리스마스 첫째 날부터 열두째 날까지의 선물을 나열한 가사임.

분석

  • 코드를 이해하기 위해서는 더 읽기 쉬운 형태로 재작성해야 함.
  • 재작성 과정에서 특정 문자열을 사용하여 치환 암호를 해독하는 방식이 드러남.
  • 변수 t는 재귀의 방향을 제어하는 데 중요한 역할을 함.
  • 코드는 재귀를 통해 치환 암호를 해독하고, 크리스마스 노래 가사를 출력함.

간소화

  • 프로그램을 이해하고 나면, 일부 반복문과 C 문자열 라이브러리 함수를 사용하여 코드를 간소화할 수 있음.
  • 최종적으로 코드를 간소화하면 단순히 가사를 출력하는 것으로 축소될 수 있음.

GN⁺의 의견

  • 창의성의 극치: xmas.c 코드는 치환 암호와 재귀를 사용하여 난독화된 코드를 작성한 훌륭한 예시임. 이는 프로그래밍에서 창의성이 어떻게 표현될 수 있는지 보여줌.
  • 교육적 가치: 코드를 분석하고 이해하는 과정은 초급 소프트웨어 엔지니어에게 프로그래밍 기술을 향상시키는 좋은 연습이 될 수 있음.
  • 재미와 흥미: 이 코드는 프로그래밍의 재미를 발견하고, 복잡한 문제를 해결하는 즐거움을 경험할 수 있는 기회를 제공함.
Hacker News 의견
  • TeX 세계의 유사한 예로 xii.tex가 있음:

    • TeX 문서에 복잡해 보이는 코드를 넣고 pdftex을 실행하면, 예상과 다른 결과를 얻을 수 있음. 이는 shreevatsa.net에서 확인 가능.
  • 이 코드는 콜모고로프 복잡성을 생각나게 함:

    • 이해하기 어려운 코드가 원하는 결과를 만들어내는 것을 보고, 더 짧으면서도 같은 결과를 내는 프로그램이 있을지, 그리고 그것을 어떻게 찾을지에 대한 호기심을 자극함.
  • 원래 발행됐을 때 이 코드를 받았지만, 파일 이름이 다름:

    • "carol.c"라는 이름으로 저장되어 있었고, 최신 시스템에서 컴파일 및 실행해보니 컴파일러에서 경고 메시지가 출력됨.
  • IOCCC(International Obfuscated C Code Contest)가 2023년에도 여전히 활발함:

    • IOCCC에 대한 설명이 훌륭하며, www.ioccc.org에서 확인할 수 있음.
  • 경고를 끄면 최신 코드 저장소(trunk)에서도 작동함:

  • Rosetta Code에도 비슷한 작업이 있음:

    • "Old Lady Swallowed a Fly"라는 점점 길어지는 노래를 반복적으로 생성하는 프로그램 예제가 있음. rosettacode.org에서 확인 가능.
  • 대학교 마지막 학기에 교수님이 이 코드 조각을 강의 시작 부분에서 보여준 좋은 기억이 있음:

    • 2022년 당시 교수님의 강의에서 이 코드를 처음 접한 경험을 회상함.
  • 대학 시절 C 언어에 대한 인쇄된 학습 자료에 이 코드가 있어서, 한 번 직접 타이핑해본 기억이 있음:

    • C 언어를 배울 때 실제로 이 코드를 직접 입력해봄으로써 기억에 남는 경험을 함.
  • 이 코드는 매우 오래된 버전의 C 언어를 사용함:

    • main 함수의 시그니처가 오래된 K&R 스타일을 사용하고 있어서, 현재는 컴파일되지 않을 것이라는 의견을 제시함.
  • IOCCC에서 래리 월이 두 번이나 우승한 것과 그가 Perl을 설계한 것 사이의 연관성이 흥미로운 점 중 하나임:

    • Perl의 설계자가 IOCCC에서 수상한 이력이 Perl 언어의 특징을 설명해주는 듯한 인상을 줌.