Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: 세상에는 괴짜가 많다 (1)

내용으로 바로 넘어 가기


TokigunStudio3

228 / 3282   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

세상에는 괴짜가 많다 (1)

2004/08/12 PM 08:40 | [옛글] 내 생각, 내 느낌 | 0 comments | 0 trackbacks | AllBlog: vote, to pocket

일러두기: 이 글은 옛날에 사용하던 엔비 블로그에서 가져 온 것으로, 원문은 여기에서 볼 수 있습니다.

* 이 글은 두 개의 포스트로 이루어져 있습니다.

영어로 geek이라는 말의 의미는 괴짜라던지 이상한 짓을 해 대는-_- 사람을 뜻합니다. (geeky라는 형용사 형태도 쓰입니다) 이러한 괴짜가 컴퓨터 분야에서는 한 둘이 아닌데, 한 번 이 기회에 제가 아는 정말 괴짜같은 짓을 분류해서 몇 종류 소개해보자 합니다.


1. source code obfuscation

obfuscation의 사전적 의미와는 상관 없이; 프로그램 소스를 난해하게 만들어서 도저히 해석이 불가능할 정도로 만드는 것을 obfuscation이라고 합니다. obfuscation을 할 때에는 다음과 같은 방법이 주로 사용됩니다: (딴 것도 씁니다;)

- 변수명과 함수명을 이상 야릇하게 고치기 (O, o, _ 같은 것들을 배합하거나...)
- 한 문장에 여러 문장을 몰아 쓰기 (C 같은 경우 한 문장 안에서 여러 번 대입이 가능하니 그런 걸 응용하지요. 심각한 경우는 while이나 for 등의 조건절이 비정상적으로 길어질 경우... ;;;)
- define으로 매크로 왕창 정의해서 왕창 써대기
- 프로그램의 흐름을 의도적으로 엉망으로 만들기 (방법이 무진장 많은데, 제가 본 것 중 가장 황당한 것은 전혀 함수로 나눌 필요가 없는 코드를 함수 수십개로 나누고 전역으로 함수 포인터 선언한 뒤 각각의 함수가 다음에 실행할 함수의 포인터를 넘겨 주는 -_-; 경우였습니다.)
- trigraph[1] 같이 사람들이 잘 모르는 프로그래밍 언어의 숨겨진 부분을 이용하는 것
- 코드를 데이터나 기타 다른 용도로도 사용할 수 있도록 만들기 -_-;;; (Makefile과 소스가 함께 들어 있는 경우도 있습니다...) 종종 둘 이상의 언어에서 함께 돌아 가는 프로그램을 짜는 사람도 있습니다.[2]
- 프로그램 코드를 적당히 정돈해서 어떤 특정한 의미를 가질 수 있는 모양으로 만들기 (꽤 많습니다.)
- 프로그램 코드가 대칭이 되게 한다거나 줄을 마음대로 바꿔도 똑같이 동작하게 한다던가 하기 -_-
- 그 외 등등등....

[1] trigraph라 함은 EBCDIC 같이 일부 특수문자가 존재하지 않는 플랫폼/인코딩을 위해서 그런 특수문자를 다른 문자들의 조합으로 입력할 수 있게 하는 방법입니다. 예를 들어서 ??(는 [와 같습니다. (C 표준에 있어요. -_-;;)
[2] 가장 유명한 게 무려 8가지 언어로 똑같은 일을 하는 Polyglot이고, 또 유명한 게 Jerome Quelin 씨가 만든 프로그램이죠. -_-;

obfuscation에 사용되는 프로그래밍 언어는 대부분 C입니다. 그만큼 C가 워낙에 별 기능이 다 있어서 obfuscation하기는 딱 좋은 겁니다...만, 그 외에 다른 언어들도 obfuscation에 사용됩니다. (php, python, javascript, perl-_- 등...) 또한 obfuscated code contest 같은 것도 있습니다:

- International Obfuscated C Code Contest: 긴 역사를 가지고 있는 대회입니다. 이름에서도 볼 수 있듯이 C 언어(C++ 아님)가 대상이고, 좋은 작품을 많이 볼 수 있습니다. (winning entry를 참고하세요) 그나저나 ioccc 2004는 도대체 결과 언제 나오는 건지... ;;
- $A++: Perl에서 $A++를 얼마나 더 엽기적으로 구현할 수 있느냐-_-를 다루는 페이지입니다. 프랑스어로 a` plus(= for a` plus tard)가 see you again이라는 뜻이라서 프랑스에서 저런 게 유행하다는 군요.
- p-nand-q.com: 유명한 엽기 프로그래머-_- Gerson Kurz 씨의 파이썬 코드 모음입니다.

다음 프로그램은 어떤 문자열에 대한 CRC를 계산하는 C 코드입니다. 더 많은 코드는 위의 링크들에서 찾아 보시고 잠시 코드를 감상하고 넘어 갑시다. (사실 이것보다 더 엽기적인 것도 많은데 너무 길어서...)

CRC Calculator by Tom Torfs (10,005 bytes; from IOCCC 1998)


2. source code minimization

이건 앞에 나왔던 obfuscation의 한 종류로, 소스 코드를 최대한 줄이는 것을 의미합니다. Perl이나 C에서 많이 하는데 특히 Perl 같은 경우 golf라고 해서 최대한 적은 글자수로 어떤 일을 하는 프로그램을 작성하는 대회가 여러 개 있습니다. -_-; (물론 다른 언어도 씁니다만...)

뭐 obfuscation과 마찬가지로 얼마나 해당 언어를 더 잘 알고 있느냐가 minimization을 더 잘 하는 방법이 되겠습니다. 다음은 이러한 내용을 다루고 있는 페이지들입니다:

- Perl Golf: 무려 ActiveState와 O'REILLY 출판사가 후원하는 공식적인 Perl Golf 사이트입니다.
- Minigolf: 비공식적으로 이루어진 Perl Golf의 결과를 볼 수 있습니다.
- 앞에서 소개했던 the 5k contest 역시 여기에 속하는 대회입니다.
- 위의 ioccc 출품작 중 이런 분야에 속하는 게 꽤 됩니다. :)

다음 프로그램은 제가 만든(..) 아래에서 다시 설명할 Befunge-93 언어의 인터프리터입니다. 메세지 다 지우고 공백 등등 다 지우면 884바이트까지 나오는데 요즘은 바빠서 더 못 줄이겠군요 ;;; 공식적으로는 여기에 올라 와 있습니다. (ANSI C에 맞다고는 못 하겠습니다. -_-)

.tokinized Befunge-93 Interpreter 0.20 by Kang Seonghoon (14,074 bytes)


글이 길어 진 관계로 다음 글로 계속 잇겠습니다. ;;;

TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=378

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).