코드 골프
1. 개요
코드 골프는 프로그램의 소스 코드 길이를 최소화하는 프로그래밍 기법 또는 그러한 기법을 사용하는 대회를 의미한다. 1963년 콜모고로프 복잡도 연구에서 개념이 시작되었으며, 1999년 펄 프로그래밍 언어에서 "코드 골프"라는 용어가 사용되었다. 코드 골프는 일반 골프처럼 적은 수의 타수로 목표를 달성하는 것에 비유하여, 더 적은 문자 수로 코드를 작성하는 것을 목표로 한다. 코드 골프를 위해 특별히 설계된 GolfScript, Flogscript와 같은 전용 프로그래밍 언어가 존재하며, 주석 제거, 공백 생략, 변수 선언 생략 등의 기법이 사용된다. Anarchy Golf, JAGC, Stack Exchange의 PPCG 등 온라인과 오프라인 대회도 개최된다.
2. 역사
프로그램 길이를 최대한 줄이려는 시도는 오래전부터 있었다. 예를 들어, 레그네센트랄렌의 GIER 컴퓨터에 대한 1962년 코딩 매뉴얼은 "가능한 가장 적은 수의 명령어로 코딩하는 것은 시간이 많이 걸리는 스포츠"라고 언급하며 실용적인 프로그래밍에는 권장하지 않는다고 밝히고 있다.
주어진 출력을 생성하는 가장 짧은 프로그램 길이에 대한 이론적 배경은 1963년 안드레이 콜모고로프의 콜모고로프 복잡도 연구에서 찾을 수 있다. 그러나 코드 골프는 단순히 정해진 출력만을 목표로 하는 콜모고로프 복잡도 개념보다 더 넓은 의미를 가지는데, 특정 입출력 변환을 수행하도록 요구하는 경우가 많기 때문이다.
"코드 골프"라는 용어 자체는 1999년 펄 커뮤니티에서 처음 사용된 것으로 보이며, 이후 RSA 암호화 프로그램을 펄로 매우 짧게 작성하는 것이 알려지면서 대중화되었다. 하지만 이와 유사하게 프로그램 길이를 줄이려는 비공식적인 경쟁은 그 이전부터 초기 APL 해커들 사이에서 인기가 있었던 것으로 알려져 있다. 오늘날 코드 골프라는 용어는 다양한 프로그래밍 언어에 적용되고 있으며, 심지어 코드 골프만을 위한 전용 프로그래밍 언어가 만들어지기도 했다.
3. 용어
"코드 골프"라는 용어는 골프에서 유래했다. 골프 선수들이 가장 적은 타수로 경기를 끝내려 하는 것처럼, 코드 골프 참가자들은 가능한 가장 짧은 코드를 작성하는 것을 목표로 한다. 이는 일반적인 스포츠나 게임에서 높은 점수를 추구하는 것과 대비되는 특징이다. 즉, 골프 선수들이 클럽 스트로크 수를 최소화하듯, 코드 골퍼들은 프로그램 작성에 필요한 키 스트로크나 문자 수를 줄이기 위해 노력한다.
5. 전용 골프 언어
코드 골프의 인기는 이를 위해 특별히 설계된 여러 프로그래밍 언어의 개발로 이어졌다. 이러한 언어들은 코드 길이를 가능한 한 줄이는 것, 즉 간결성을 최우선 목표로 삼는다. 프로그램 크기를 극단적으로 최적화하려는 시도는 오래전부터 있었지만, 펄과 같은 언어에서 '코드 골프'라는 용어가 사용되면서 더욱 활발해졌고, 전용 언어의 탄생을 촉발했다.
대표적인 전용 골프 언어로는 GolfScript, Flogscript, Stuck, Vyxal 등이 있다. 이들은 아이디어를 매우 짧은 코드로 표현할 수 있는 구조를 제공하며, 대부분 튜링 완전한 언어이다. 하지만 극단적인 간결성을 추구하는 과정에서 사람이 코드를 읽고 이해하기 어려운 가독성 문제가 발생한다. 이 때문에 실제 프로그래밍 환경에서는 거의 사용되지 않으며, 종종 난해한 프로그래밍 언어의 일종으로 여겨지기도 한다.
코드 골프 관련 웹사이트에서는 사용자들이 직접 만든 새로운 골프 언어들이 계속 등장하고 있다. 05AB1E, Husk, Pyth, CJam, Jelly 등도 널리 사용되는 골프 언어들이다. 드물게는 바이너리 람다 계산처럼 다른 목적으로 설계된 언어가 코드 골프에 제한적으로 활용되기도 한다.
다음은 원주율의 첫 1000자리를 출력하는 GolfScript 코드의 예시이다.
;''
6666,-2%{2+.2/@*\/10.3??2*+}*
`1000<~\;
6. 코드 골프 대회
일반적인 프로그래밍 사이트 등에서 볼 수 있는 코드 골프 문제에서는, 구현할 프로그래밍 언어를 특정하지 않는 경우도 있다. 하지만, 예를 들어 특정 언어 기능의 사용을 제한하는 등, 출제자가 문제의 형식을 한정할 수도 있다. 이러한 "언어를 특정하지 않는" 문제가 만들어짐으로써, 코드 골프에 특화된 프로그래밍 언어의 파생 설계로 이어지기도 했다. 대표적인 예시로는 REBOL의 파생 언어인 REBMU가 있다. 온라인상의 콘테스트에서도, 실제 오프라인에서 열리는 콘테스트에서도 시간 제한이 주어지는 경우가 있다.
다양한 프로그래밍 언어를 대상으로 하는 여러 코드 골프 대회가 온라인 및 오프라인으로 개최되고 있다. 주요 대회는 다음과 같다.
| 대회 이름 | 방식 | 주요 언어 | 상태 |
|---|---|---|---|
| Anarchy Golf | 온라인 | 다수의 주요 프로그래밍 언어, 일부 난해한 프로그래밍 언어 포함 | 실시 중 |
| JAGC | 온라인 | Perl, Python, Erlang, Ruby, Haskell, Bash, PHP | 실시 중 |
| SPOJ Shortening codes | 온라인 | 다수의 주요 프로그래밍 언어 | 실시 중 |
| Stack Exchange PPCG (Programming Puzzles & Code Golf) | 온라인 | 지정된 여러 프로그래밍 언어. 다른 형식의 프로그래밍 콘테스트도 함께 진행됨. | 실시 중 |
| 4clojure.com | 온라인 | Clojure | 실시 중 |
| Kona code golf | 온라인 | K | 실시 중 |
| phpGolf | 온라인 | PHP | 실시 중 |
| CodeGolf | 온라인 | Perl, PHP, Ruby, Python | 실시 중 |
| VimGolf | 온라인 | Vim 스크립트 | 실시 중 |
| Perl Golf Apocalypse | 오프라인 (Perl Conference 4.0, 캘리포니아주 몬터레이) | Perl | 2000년 7월 (과거) |