창조유저그룹-커즈닷컴
Window close
ID :     PASS :   
   
  처음으로
  창조
  창조 소개
창조 다운로드
CUGz.com 소개
온라인 도움말
  커뮤니티
  가입인사
자유게시판
Q/A게시판
TIP/TECH
열린강좌
자주하는질문
아이디어게시판
  자료실
  소스자료실
프로그램자료실
기타자료실
명예의 전당
이미지 자료실
  지원/기타
  표준용어재정
구글 웹서치  
관리자 전용


기타자료실
- '창조'로 제작하지 않은 프로그램이나, '창조'와 관련된 프로그램들을 올리는 곳입니다.
- 첨부가능 확장자는 *.zip,*.rar,*.exe,*.jpg,*.gif,*.png 입니다.


LIST ALL
Posted by 김제형2008-11-10 00:31:36, Hit : 12529
난해한 프로그래밍 언어
Homepage : http://www.김제형.je.ro
File #1 : ABC.zip (116.2 KB)   Download : 226
Post URL : http://cugz.sjworks.net/bbs/zboard.php?id=pds_etc&no=855

세상에는 여러가지 프로그래밍 언어가 있다. 그 중에서도 해커들이 장난이나 컴퓨터의 한계를 시험하기 위하여 만든 프로그래밍 언어가 있는 데  그것을 난해한 프로그래밍 언어라고 한다.
그 중에서 자주 쓰이는 것은 화이트 스페이스, NULL, 브레인퍽(뇌를 엿먹인다는 뜻), HQ9+,
아희가 있다.
그럼 들어가 볼까요?
문법


1. 브레인퍽

브레인퍽(Brainfuck)은 우어반 뮐러(Urban Muller)가 1993년 경에 만든 최소주의 컴퓨터 프로그래밍 언어이다. 이름에 포함된 fuck이 욕설이기 때문에, 정중한 표현을 위해서 때때로 Brainf*ck, Brainf***, 혹은 단순히 BF라고 부르기도 한다.


목차 [숨기기]
1 언어의 설계
1.1 명령어들
2 해설
3 관련 항목
4 외부 고리
 



[편집] 언어의 설계
뮐러는 가장 작은 컴파일러로 구현할 수 있는 간단한 튜링 완전한 프로그래밍 언어를 만드는 것이 목적이었다. 이 언어는 여덟 개의 명령어로 구성되어 있다. 아미가 컴퓨터에서 작동하는 원래 컴파일러의 둘째 판은 크기가 240 바이트 밖에 안 된다. 그는 다른 난해한 프로그래밍 언어이자, 컴파일러 크기가 1024바이트인 False의 영향을 받았다.


이름이 말해 주듯이, 브레인퍽 프로그램은 이해하기 어려운 경향이 있다. 하지만 튜링 기계는 컴퓨터가 할 수 있는 모든 작업을 할 수 있고, 브레인퍽이 튜링 완전하기 때문에 브레인퍽 또한 복잡하기는 해도 컴퓨터가 할 수 있는 모든 작업을 할 수 있다.


이 언어는 프로그램 외에, 0으로 초기화된 바이트 단위의 배열과, 처음에 배열의 맨 첫 바이트를 가리키는 포인터, 그리고 입출력 스트림으로 구성된 간단한 기계 모델에 기반을 두고 있다.



[편집] 명령어들
여덟 개의 명령어들은 각각 한 개의 문자로 구성되어 있으며 다음과 같다:


문자 의미
> 포인터를 증가시킨다.
< 포인터를 감소시킨다.
+ 포인터가 가리키는 바이트의 값을 증가시킨다.
- 포인터가 가리키는 바이트의 값을 감소시킨다.
. 포인터가 가리키는 바이트의 값을 ASCII 문자로 출력한다.
, 포인터가 가리키는 바이트에 입력받은 문자의 ASCII 값을 넣는다.
[ 포인터가 가리키는 바이트의 값이 0이면 짝이 되는 뒷쪽의 ]로 이동한다.
] 포인터가 가리키는 바이트의 값이 0이 아니면 짝이 되는 앞쪽의 [로 이동한다.


위의 정의 대신에, ]에 ‘짝이 되는 앞쪽의 [로 이동한다’는 의미를 사용할 수 있다. 이는 간단하지만 대칭적이지 못 하고 효율적이지도 않다. 이 두 정의는 모든 브레인퍽 프로그램에 대해서 동일한 행동을 보인다. 거의 사용되지 않지만 동일한 또 다른 정의로는, [가 ‘짝이 되는 뒷쪽의 ]로 이동한다’는 의미를 가지고, ]가 ‘포인터가 가리키는 바이트의 값이 0이 아니면 짝이 되는 앞쪽의 [ 다음 명령어로 이동한다’는 의미를 가지도록 하는 것이 있다.


브레인퍽 프로그램들은 ptr이 unsigned char* 형이라 가정할 때 다음과 같은 치환을 사용해서 C 언어로 번역할 수 있다:


브레인퍽 C
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr = getchar();
[ while (*ptr) {
] }



[편집] 해설
참고로 여기서는 배열의 각각의 원소들을 바이트로 서술했기 때문에, - 명령은 필요가 없으며 255개의 + 명령으로 고칠 수 있다. 비슷하게, 만약 배열이 유한하고 환형이면, < 명령은 (배열 크기 - 1)개의 > 명령으로 고칠 수 있다. 하지만 이 언어가 튜링 완전하려면 배열의 크기와 각각의 원소들의 크기가 모두 제한이 없어야 한다. (이는 엄밀히 말할 때 현대의 PC가 튜링 완전하지 않은 이유와 동일하다.)



2. Ook

Ook
위키백과 ― 우리 모두의 백과사전.
이동: 둘러보기, 찾기
Ook는 브레인퍽의 변형으로, 장난으로 만들어진 난해한 프로그래밍 언어이다.



[편집] 명령어
브레인퍽 Ook Description
> Ook. Ook? 포인터를 증가시킨다.
< Ook? Ook. 포인터를 감소시킨다.
+ Ook. Ook. 포인터가 가리키는 바이트의 값을 증가시킨다.
- Ook! Ook! 포인터가 가리키는 바이트의 값을 감소시킨다.
. Ook! Ook. 포인터가 가리키는 바이트의 값을 ASCII 문자로 출력한다.
, Ook. Ook! 포인터가 가리키는 바이트에 입력받은 문자의 ASCII 값을 넣는다.
[ Ook! Ook? 포인터가 가리키는 바이트의 값이 0이면 짝이 되는 뒷쪽의 ]로 이동한다.
] Ook? Ook! 포인터가 가리키는 바이트의 값이 0이 아니면 짝이 되는 앞쪽의 [로 이동한다.



[편집] Hello World 프로그램
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook.
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook.
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.

3.화이트 스페이스

화이트스페이스(Whitespace)는 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris, cim)가 2003년 4월 1일(만우절)에 발표한 난해한 프로그래밍 언어이다. 이 언어의 인터프리터는 공백 문자를 뺀 모든 문자를 무시한다. 오직 공백과 탭, 그리고 개행문자만이 문법에 포함된다. 2004년 현재 이 언어의 최신 버전은 0.3이다.


이 언어는 스택 기반의 명령형 프로그래밍 언어이다. 프로그램이 실행되는 가상 머신은 스택과 힙을 가지고 있다. 프로그래머는 스택에 임의의 정수를 자유롭게 푸시할 수 있으며, (아직 부동 소수점이나 실수의 구현은 없다) 또한 변수와 자료 구조를 계속 보존하기 위해서 힙에 접근할 수 있다.



[편집] 명령들
여기에서는 공백 문자들의 표현을 간편하게 하기 위하여 공백은 a, 탭은 b, 개행문자는 c로 표기한다.


화이트스페이스의 명령은 둘 이상의 공백 문자로 이루어져 있다. 그 중 일부 명령 뒤에는 인자가 필요한데, 크게 숫자 인자와 라벨 인자로 나뉜다.


숫자는 첫 문자가 공백일 때 양수이고, 탭일 때 음수이다. 그 다음 문자부터는 숫자의 절대값을 2진수로 표현하며, 공백은 0, 탭은 1을 가리킨다. 숫자 인자는 숫자 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 13은 abbabc, aabbabc, aaabbabc 등으로, -13은 bbbabc, babbabc, baabbabc 등으로, 0은 c, ac, aac, aaac, bc, bac, baac 등으로 표현할 수 있다.
라벨은 공백과 탭만으로 이루어진 문자열이다. 라벨 인자는 라벨 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 ababac와 babac, c는 서로 다른 라벨을 가리키는 인자이다.
화이트스페이스 0.3에서 지원하는 명령은 다음과 같다:


명령 인자 | 종류 | 설명
aa | 숫자 | 해당하는 숫자를 스택에 넣는다.
aca | - | 스택 꼭대기에 있는 숫자를 복제한다.
aba | 숫자 (n) | 스택 꼭대기부터 세서 n번째 숫자를 복사해서 스택 꼭대기에 넣는다.
acb | - | 스택 꼭대기에 있는 두 숫자의 자리를 바꾼다.
acc | - | 스택에서 숫자 하나를 꺼내서 버린다.
abc | 숫자 (n) | 스택 꼭대기에 있는 숫자만 빼고, 스택 윗쪽에 있는 n개의 숫자를 버린다.
baaa | - | 스택에서 a와 b를 순서대로 꺼낸 후, a+b를 넣는다.
baab | - | 스택에서 a와 b를 순서대로 꺼낸 후, b-a를 넣는다.
baac | - | 스택에서 a와 b를 순서대로 꺼낸 후, a*b를 넣는다.
baba | - | 스택에서 a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다.
babb | - | 스택에서 a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지를 넣는다.
bba | - | 스택에서 v와 a를 순서대로 꺼낸 후, 힙 공간의 주소 a에 값 v를 저장한다.
bbb | - | 스택에서 숫자 a를 꺼낸 후, 힙 공간의 주소 a에 들어 있는 값을 넣는다.
caa | 라벨 | 라벨을 현재 위치에 설정한다.
cab | 라벨 | 지정된 라벨에 있는 서브루틴을 호출한다.
cac | 라벨 | 지정된 라벨로 이동한다.
cba | 라벨 | 스택에서 숫자를 꺼내서, 그 숫자가 0이면 지정된 라벨로 이동한다.
cbb | 라벨 | 스택에서 숫자를 꺼내서, 그 숫자가 음수이면 지정된 라벨로 이동한다.
cbc | - | 서브루틴을 끝내고 원래 위치로 돌아 간다.
ccc | - | 프로그램을 종료한다.
bcaa | - | 스택에서 숫자 하나를 꺼내고, 그 숫자가 가리키는 ASCII 문자를 출력한다.
bcab | - | 스택에서 숫자 하나를 꺼내고, 그 숫자를 문자열로 출력한다.
bcba | - | 사용자에게 문자 하나를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 문자의 ASCII 값을 저장한다.
bcbb | - | 사용자에게 숫자를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 숫자를 저장한다.


4. HQ9+

HQ9+는 몇몇 종류의 컴퓨터 프로그램을 만드는 데 매우 효과적인, 간단하고 세련된 프로그래밍 언어이다. 클리프 비플(Cliff L. Biffle)이 2000년경에 만들었다. 언어의 이름에서 알 수 있듯이, 이 언어는 네 개의 한 글자 명령어, 즉 H, Q, 9, +를 가지고 있다.


H 명령은 ‘Hello, world!’를 출력한다.
Q 명령은 프로그램의 소스 코드를 출력한다. (콰인의 역할을 한다)
9 명령은 99 Bottles of Beer on the Wall 노래의 가사를 출력한다.
+ 명령은 가산기를 증가시킨다.
예를 들어서 ‘HHQ+HQ++’라는 코드는 올바른 HQ9+ 프로그램이다. 이 프로그램은 ‘Hello, world! Hello, world! HHQ+HQ++ Hello, world! HHQ+HQ++’를 출력하면서 가산기를 세 번 증가시킬 것이다.


실제로 HQ9+로 유용한 프로그램을 만들 수는 없으며, 난해한 프로그래밍 언어로 분류된다. 각각의 명령들은 새로운 프로그래밍 언어를 배우는 초보자들이 하는 공통적인 과제를 표시한다. 예를 들어서, ‘Hello, world!’라는 문장을 만드는 프로그램은 언어를 처음 배울 때 하는 과제인데, 몇몇 프로그래밍 언어는 이런 일을 하기가 상당히 어렵지만 HQ9+에서는 H 명령으로 해결할 수 있는 매우 기초적인 과제이다. 많은 프로그래밍 언어에서 가장 어려운 과제는 콰인, 즉 자기 자신의 소스 코드를 출력하는 프로그램을 만드는 것이지만 HQ9+에서는 이 또한 자명하다.


HQ9+ 인터프리터는 만들기 매우 쉬우며, 여러 언어로 많이 만들어져 있다. 하지만 HQ9+ 프로그램은 입력을 받을 수 없기 때문에 HQ9+로 HQ9+ 인터프리터나 컴파일러를 만드는 것은 불가능하다.



[편집] HQ9++
HQ9++는 David Morgan-Mar가 만든 HQ9+의 확장이다. 이 언어는 HQ9+와 하위 호환성을 유지하는 객체 지향적인 언어이다. 여기에는 가산기를 두 번 증가시키면서 객체의 새 인스턴스를 만드는 새로운 명령 ++이 추가되었으며, 정보 은닉의 원리에 따라서 이 객체에 접근하는 것은 불가능하다.



5.NULL
널(NULL)은 데이비드 루이스(David Lewis)가 만든 ‘0차원’ 난해한 프로그래밍 언어이다. 2차원 프로그래밍 언어인 비펀지에서 영감을 받아 만들어졌다. 이 언어로 짠 코드는 하나의 큰 숫자로 이루어져 있으며, 인터프리터는 코드를 실행하기 위해 그 수를 소인수분해한다.


목차 [숨기기]
1 ‘Hello, world’ 프로그램
2 언어의 설계
3 명령들
4 바깥 고리
 



[편집] ‘Hello, world’ 프로그램
다음 176자리 숫자는 ‘Hello, world.’라는 문장을 출력한다. 읽기가 편하도록 네 자리마다 끊어서 쓰여졌다.


1536 0939 3637 8695 0397 1282 8393 3599 5386 2489 2174 3204 8303 4857 0033
5501 5791 3898 8589 7612 6298 7035 0403 1567 4567 6936 8158 1873 0836 9080
7564 6108 6944 1191 3908 7533 4154 2249 0572 8307 4613 6781 4488 9367


[편집] 언어의 설계
이 언어의 인터프리터는 0부터 2까지의 숫자가 붙어 있는 3개의 바이트 단위 큐와 두 개의 정수 변수 x와 y를 사용한다. 이 언어에서 사용하는 수는 모두 0을 포함한 양수로, 계산 과정에서 음수가 나오면 0을 사용한다. 처음에 x에는 프로그램을 나타내는 숫자가 들어 가고, y에는 1이 들어 가며, 0번 큐가 선택되어 있다.


인터프리터는 먼저 x의 가장 작은 소인수를 찾아서, x를 그 숫자로 나누고 y에 그 숫자를 곱한다. 그리고 그 소인수에 해당하는 명령이 실행된다. 이 과정은 x가 0 혹은 1이 되거나, 종료 명령이 실행될 때까지 반복된다.



[편집] 명령들
해당하는 소인수가 n번째로 작은 소수라고 하면, n을 14로 나눈 나머지에 따라 각각 다음과 같은 명령이 실행된다. 예를 들어서 16번째 소수인 53은 2번째 소수인 3과 같은 의미를 가진다.


n | mod 14 | 해당하는 첫 소인수 설명
0 | 43 | 프로그램을 종료한다.
1 | 2 | 현재 선택된 큐를 다음 큐로 바꾼다. (단, 2번 큐가 선택되었으면 0번 큐로 돌아 온다.)
2 | 3 | 현재 선택된 큐를 이전 큐로 바꾼다. (단, 0번 큐가 선택되었으면 2번 큐로 돌아 온다.)
3 | 5 | 현재 선택된 큐의 앞쪽에 있는 바이트에 해당하는 ASCII 문자를 출력한다. 큐가 비어 있으면 널 문자를 출력한다.
4 | 7 | 글자 하나를 입력받아서, 선택된 큐의 앞쪽에 있는 숫자를 그 글자에 해당하는 ASCII 값으로 바꾼다. 큐가 비어 있을 경우 그냥 그 숫자를 큐에 넣는다.
5 | 11 | y에서 현재 선택된 큐의 앞쪽에 있는 숫자를 뺀다. y가 음수가 되면 0으로 고치고, 큐가 비어 있으면 이 명령은 무시된다.
6 | 13 | y에 현재 선택된 큐의 앞쪽에 있는 숫자를 더한다. 큐가 비어 있으면 이 명령은 무시된다.
7 | 17 | 현재 선택된 큐의 앞쪽에 있는 숫자에 y를 더한다. 숫자가 256을 넘으면 하위 8비트(256으로 나눈 나머지) 만을 취하고, 큐가 비어 있으면 그냥 y의 하위 8비트를 큐에 넣는다.
8 | 19 | 현재 선택된 큐의 앞쪽에 있는 숫자를 다음 큐(1번 명령과 같음)의 뒷쪽으로 옮긴다. 현재 선택된 큐가 비었으면 0을 다음 큐의 뒷쪽에 넣는다.
9 | 23 | 현재 선택된 큐의 앞쪽에 있는 숫자를 이전 큐(2번 명령과 같음)의 뒷쪽으로 옮긴다. 현재 선택된 큐가 비었으면 0을 이전 큐의 뒷쪽에 넣는다.
10 | 29 | 현재 선택된 큐의 앞쪽에 있는 숫자를 빼서 버린다. 큐가 비었으면 이 명령은 무시된다.
11 | 31 | 현재 선택된 큐의 앞쪽에 y의 하위 8비트(256으로 나눈 나머지)를 넣는다.
12 | 37 | 현재 선택된 큐가 비었거나, 앞쪽에 있는 숫자가 0이면, x의 가장 작은 소인수를 찾아서 x를 그 수로 나누고 y에 그 수를 곱한다.
13 | 41 | x와 y의 값을 바꾼다.



6. ETA

ETA는 마이크 테일러(Mike Taylor)가 만든 난해한 프로그래밍 언어이다. 이 언어의 이름은 사용하는 명령어의 목록에서 유래하기도 했으며, 7진법 수체계를 사용한다는 점에서 착안하여 일곱번째 그리스 문자인 에타에서 따 온 것이기도 하다.


목차 [숨기기]
1 언어의 구성
1.1 명령어들
1.2 N 명령
1.3 H 명령
2 ETA로 만든 "Hello, world" 프로그램
3 외부 고리
 



[편집] 언어의 구성
이 언어는 스택을 사용하는 명령형 프로그래밍 언어로, 영어에서 가장 자주 사용되는 알파벳 여덟 개, E, T, A, O, I, N, S, H를 명령어로 사용한다. 대소문자의 구별은 없으며, 명령은 아니지만 개행 문자도 언어에 포함된다. 이 문자들을 제외한 다른 모든 문자는 무시되기 때문에, 이론적으로는 ETA 코드를 알파벳을 사용하는 대부분의 자연어와 흡사하게 만들 수 있다.



[편집] 명령어들
명령 설명
E | 스택에서 두 개의 숫자 b와 a를 순서대로 팝한 후, a를 b로 나눈 몫과 나머지를 순서대로 푸시한다.
T | 스택에서 두 개의 숫자 addr과 cond를 순서대로 팝한 후, cond가 0이 아니면 프로그램의 addr번째 줄의 첫 명령어로 이동한다. addr이 0일 경우 프로그램을 종료한다.
A | 그 명령어가 있는 줄 다음 줄의 번호를 스택에 푸시한다. 예를 들어서 첫 줄일 경우 2가 푸시된다.
O | 스택에서 하나의 숫자를 팝해서, 그 숫자가 가리키는 ASCII 문자를 출력한다. 이 명령은 EBCDIC와 같은 다른 문자셋을 사용하는 컴퓨터에서도 똑같은 동작을 한다.
I | 한 글자를 입력받아서 그 글자의 ASCII 값을 스택에 푸시한다. 이 명령은 EBCDIC와 같은 다른 문자셋을 사용하는 컴퓨터에서도 똑같은 동작을 한다.
N | 지정한 숫자를 스택에 푸시한다. 자세한 것은 아래를 참고하라.
S | 스택에서 두 개의 숫자 b와 a를 순서대로 팝한 후, b에서 a를 빼서 그 결과를 스택에 푸시한다.
H | 스택에서 숫자 하나를 팝해서, 그 숫자를 사용해서 스택에 halibut 연산을 행한다. 자세한 것은 아래를 참고하라.



[편집] N 명령
이 명령은 그 뒤에 따라 오는 숫자를 스택에 푸시한다. 숫자는 7진법으로 표시되며, 숫자는 아래 표와 같은 문자로 표현한다. 숫자의 끝은 E 문자로 표시된다.


문자 H T A O I N S
숫자 0 1 2 3 4 5 6


예를 들어서 Ntone이라는 명령은 75(7진법으로 135)라는 숫자를 스택에 푸시한다.



[편집] H 명령
이 명령은 한 개의 숫자 n을 스택에서 팝한 후, 다음과 같은 방법으로 스택을 조작한다:


n이 양수일 경우, 스택 꼭대기부터 세어서 (n+1)번째 숫자를 스택의 꼭대기로 옮긴다. 그 위에 있던 모든 숫자들은 아래로 한 칸씩 내려가게 된다. 예를 들어서 n이 1이라면 이 명령은 꼭대기의 두 숫자의 자리를 바꾼다.
n이 음수이거나 0일 경우, 스택 꼭대기부터 세어서 (-n+1)번째 숫자를 스택에 꼭대기에 복사한다. 예를 들어서 n이 0이라면 이 명령은 스택 꼭대기에 있는 숫자를 복제한다.


[편집] ETA로 만든 "Hello, world" 프로그램
다음 프로그램은 "Hello, World!"라는 문장을 출력한다.


No heat: "hello.eta", written by Mike Taylor


** FUNGICIDE **
-- Fungus calendar --
CURTSEY:
 Fungal toe!  Fungal toe!  Fungal hoe!
  (Burnt programmer nucleus)
 Ooooooo!
CRUDDY 2nd TOE:
 Nine(!) fungal hyaena toe5!
 Dungy alfalfa, penalty superlunary -- Oh, blubber!
 Oo! Oooo! OW!



7. 아희

개요
인터프리터가 아희를 실행하는 방법은 funge와 비슷합니다. 즉, 코드 공간 안에 커서가 있어서 커서가 위치한 곳에 적혀 있는 명령을 수행하고, 또 그 명령에 따라 커서가 움직이는 것입니다. 하지만, 그 코드가 ASCII가 아니라 한글이라는 점이 다릅니다.


한글은 홀소리와 닿소리로 나눌 수 있습니다. 홀소리는 커서가 이동할 방향을 지정하고, 닿소리는 인터프리터가 수행할 명령을 지정합니다. 받침이 있는 글자는 닿소리가 두 개가 되는데, 이 때 받침은 명령을 보조하는 인자로 작용합니다. (사용되지 않는 받침은 모두 무시됩니다.) 커서가 글자 위에 오게 되면 닿소리부터 실행한 다음 홀소리에 따라서 움직입니다.


커서는 코드 공간의 맨 첫 줄 맨 첫번째 칸에서 시작합니다. 맨 처음에 홀소리가 없을 경우 커서는 기본값으로 아랫쪽으로 이동하는데, 이는 #!과 호환시키기 위한 것으로, 기본 방향이 오른쪽인 funge와는 다른 점입니다.


코드 공간의 한 쪽 끝에 다다르면 커서는 반대편 끝으로 이동합니다. 이는 Funge-98의 wrapping algorithm과 동일합니다.


아희에서 쓰이는 저장 공간은 여러 개가 있습니다. 대부분이 스택이고, 큐가 하나 있습니다. 그리고 확장기능과 소통하는 통로가 있는데, 스택과 마찬가지로 씁니다. 집어넣기(push)로 인수를 전달하고 뽑아내기(pop)로 결과를 받아옵니다. 중복 명령을 포함한 모든 뽑아내기를 쓰는 명령에서 저장 공간에 값이 모자랄 경우, 커서는 그 명령을 실행하지 않고 커서가 있는 글자의 홀소리의 반대방향으로 움직입니다.


 


홀소리
각 홀소리의 기능은 다음과 같습니다.


ㅏ, ㅓ, ㅗ, ㅜ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 한 칸 옮깁니다.
ㅑ, ㅕ, ㅛ, ㅠ - 커서를 각각 오른쪽, 왼쪽, 위, 아래로 두 칸 옮깁니다.
ㅡ - 커서가 가로로 왔으면 그 방향대로, 세로로 왔으면 전에 있던 자리로 옮깁니다.
ㅣ - 커서가 세로로 왔으면 그 방향대로, 가로로 왔으면 전에 있던 자리로 옮깁니다.
ㅢ - 커서를 전에 있던 자리로 옮깁니다.
기능 없음: ㅐ ㅔ ㅒ ㅖ ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ (커서가 이동하는 방향은 변하지 않습니다.)
 


닿소리
각 닿소리의 기능은 다음과 같습니다.


ㅇ 묶음


ㅇ은 없음 명령으로 아무 일도 하지 않습니다.
ㅎ은 끝냄 명령으로 커서의 실행을 끝냅니다. 이 때 스택에서 맨 위 값을 뽑아서 운영체제에 돌려 줍니다.
ㄷ 묶음 - 셈


ㄷ은 덧셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 더한 값을 저장공간에 집어넣습니다.
ㄸ은 곱셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 둘을 곱한 값을 저장공간에 집어넣습니다.
ㅌ은 뺄셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 뺀 값을 저장공간에 집어넣습니다.
ㄴ은 나눗셈 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 값을 저장공간에 집어넣습니다.
ㄹ은 나머지 명령으로 저장공간에서 두 값을 뽑아낸 다음 나중 값에서 먼저 값을 나눈 나머지를 저장공간에 집어넣습니다.
ㅁ 묶음 - 저장공간


ㅁ은 뽑기 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값, 큐라면 맨 앞의 값을 뽑아냅니다.(pop) 통로라면 거기서 값을 하나 뽑아옵니다. ㅁ 명령에는 받침이 올 수 있는데, 이에 대한 설명은 아래에 있습니다.
ㅂ은 집어넣기 명령입니다. 지금 저장공간이 스택이라면 맨 위에, 큐라면 맨 뒤에 값을 집어넣습니다.(push) 통로라면 값을 하나 보냅니다. 집어넣거나 보낼 값은 받침이 결정하는데, 이에 대한 설명은 아래에 있습니다.
ㅃ은 중복 명령입니다. 지금 저장공간이 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고, 큐라면 맨 앞의 값을 앞에 하나 더 덧붙입니다. (통로라면 아까 보낸 값을 한 번 더 보냅니다.)
ㅍ은 바꿔치기 명령입니다. 지금 저장공간이 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꿉니다. (통로라면?)
ㅁ에 ㅇ받침이 있으면 저장공간에서 뽑아낸 값을 숫자로, ㅎ받침이 있으면 그 값에 해당하는 유니코드 문자로 출력합니다. 나머지 받침은 뽑아낸 값을 그냥 버립니다. ㅂ도 마찬가지로 ㅇ받침이 있으면 입력받은 숫자를, ㅎ받침이 있으면 입력받은 문자의 유니코드 코드값을 저장공간에 집어넣습니다.


단, ㅂ의 경우 나머지 받침이 있으면 그 받침을 구성하는 선의 수에 따른 값을 집어넣습니다. 받침이 없으면 0을 집어넣습니다.


ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅈ ㅊ ㅋ ㅌ ㅍ  
 2  2  3  5  4  4  2  3  4  3  4  4  
ㄲ ㄳ ㄵ ㄶ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅄ ㅆ
 4  4  5  5  7  9  9  7  9  9  8  6  4


 받침 중에는 1획인 것이 없는데, 1은 2/2나 3-2 같은 셈으로 간단하게 만들 수 있습니다. 예: `반밧나`, `밪반타` 등.


ㅅ 묶음 - 제어, 저장공간 확장


ㅅ은 선택 명령으로 저장공간을 선택합니다. 어느 것을 선택하는지는 받침을 따르는데, 이에 대한 설명은 아래에 있습니다.
ㅆ은 이동 명령으로 저장공간에서 값 하나를 뽑아내서 받침이 나타내는 저장공간에 그 값을 집어 넣습니다.
ㅈ은 비교 명령으로 저장공간에서 값 두 개를 뽑아 내서 비교합니다. 나중에 뽑아낸 값이 더 크거나 같으면 1을, 아니면 0을 지금 저장공간에 집어넣습니다.
ㅊ은 조건 명령으로 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 홀소리의 방향대로, 0이면 그 반대 방향대로 갑니다.
ㅅ나 ㅆ으로 선택할 수 있는 스택은 (받침 없음), ㄱ, ㄴ, ㄷ, ㄹ, ㅁ, ㅂ, ㅅ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㄲ, ㄳ, ㄵ, ㄶ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅄ, ㅆ이 있습니다. ㅇ은 큐이며, ㅎ을 선택하면 확장 기능과 소통하기 위한 통로가 선택됩니다.


 처음에 선택되어 있는 스택은 (받침 없음) 스택입니다. ("사" 와 같은 명령으로 선택할 수 있습니다.)


 


구현
코드는 UTF-8로 된 텍스트 형식입니다. 코드는 한글로만 이루어지는데, 여기서 한글은 유니코드 U+AC00에서 U+D7A3까지의 범위에 있는 글자(Hangul Syllable 영역)를 말합니다. 그 밖의 글자나 코드에서 지정하지 않은 나머지 공간은 모두 빈 칸으로 처리되어 커서가 이동하는 방향에 아무 영향을 주지 않습니다.


 


예제
다음은 "Hello, world!"를 출력하는 프로그램입니다.


밤밣따빠밣밟따뿌
빠맣파빨받밤뚜뭏
돋밬탕빠맣붏두붇
볻뫃박발뚷투뭏붖
뫃도뫃희멓뭏뭏붘
뫃봌토범더벌뿌뚜
뽑뽀멓멓더벓뻐뚠
뽀덩벐멓뻐덕더벅



8. 말레볼제(지구상에서 가장 어려운 프로그래밍 언어)

Malbolge(말레볼제)는 벤 올름스테드(Ben Olemstead)가 1998년에 만든 난해한 프로그래밍 언어로, 그 이름은 단테의 신곡에 나오는 지옥 중 제8옥인 말레볼제(Malebolge)에서 왔다.


Malbolge의 특징은 존재할 수 있는 가장 최악의 (가장 어렵고 난해한) 프로그래밍 언어로 설계되었다는 것이다. 하지만 이해를 어렵게 만들기 위해 사용된 방법 중 몇몇은 단순화할 수 있다.


목차 [숨기기]
1 Malbolge의 역사
2 Malbolge로 만든 "Hello, world" 프로그램
3 Malbolge의 구성
3.1 레지스터와 포인터
3.2 메모리
3.3 명령
3.4 Crazy 연산
3.5 암호화
3.5.1 첫째 방법
3.5.2 둘째 방법
3.5.3 암호화 과정에서의 사이클
4 바깥 고리
 



[편집] Malbolge의 역사
Malbolge가 처음 발표되었을 때 매우 이해하기 어려웠기 때문에, 첫 Malbolge 프로그램이 만들어질 때까지는 2년이 걸렸다. 이 프로그램은 사람의 손으로 쓰여진 것이 아니다: 이 프로그램은 Andrew Cooke이 디자인하고 리스프로 구현된 빔 탐색 알고리즘을 통해서 만들어졌다.


2000년 8월 24일에, Anthony Youhas는 자신의 블로그에 "Malbolge의 신비를 벗겨냈다"고 소개하면서 그 증거로 여러 문장을 출력하는 세 개의 Malbolge 프로그램을 제시하였다. 하지만 그는 그 프로그램을 만드는 방법에 대해서는 언급하지 않았다.


그 뒤, Lou Scheffer가 Malbolge의 암호학적 분석을 하고 입력을 출력으로 되돌리는 프로그램을 공개했다.


올름스테드는 Malbolge가 튜링 완전하다고 생각하였으나, Malbolge 프로그램이 접근할 수 있는 메모리 공간의 한계 때문에, Malbolge의 상태 모델은 유한하며 따라서 Malbolge는 튜링 완전하지 않다. 또 다른 흥미로운 제안은 Malbolge로 민감한 루프를 구현할 수 있느냐는 것인데 이는 7년 만에 가능한 것으로 밝혀졌다.


2004년 8월 19일에, Tomasz Wegrzanowski는 임의의 문자열을 출력하는 Malbolge 프로그램을 생성하는 생성기를 만들었다. 그에 따르면, 이 생성기는 이동 명령을 무시하고, D 레지스터를 메모리의 맨 처음을 가리키게 한 후, A 레지스터가 필요한 값이 될 때까지 NOP, ROT, 그리고 Crazy 연산을 반복하여 원하는 값을 만들어 낸다. 이 방법으로 만들어진 프로그램은 Anthony의 프로그램보다 훨씬 더 크다.


2005년에 이자와 히사시(飯澤 恒)는 〈난해한 프로그래밍 언어 Malbolge의 프로그래밍 방법(難プログラミング言語Malbolgeにおけるプログラム構成手法〉이라는 논문을 통해 Malbolge에서 반복문을 구현하는 방법을 보였으며, 그 예제로 "99 bottles of beer" 프로그램을 만들었다.[1] 그는 Crazy 연산의 조합으로 덧셈 등의 연산을 구현하고, 일정한 횟수만큼 메모리를 접근해서 원하는 값을 만들어 내는 방법을 사용하였다.



[편집] Malbolge로 만든 "Hello, world" 프로그램
다음 프로그램은 "Hello, world."라는 문장을 출력한다.


 (=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**
 hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<



[편집] Malbolge의 구성
Malbolge는 삼진법 가상 머신, 즉 Malbolge 인터프리터의 기계어이다. 표준 인터프리터와 공식 명세서의 내용은 서로 약간 다른데, 여기서는 실제로 작동하는 프로그램을 만들 수 있도록 표준 인터프리터의 작동을 설명하겠다.



[편집] 레지스터와 포인터
Malbolge에는 다른 언어들의 변수와 대응되는 세 개의 레지스터, 즉 a, c, d 레지스터가 있다. 프로그램이 실행될 때 세 레지스터의 값은 모두 0이다. c 레지스터는 현재 실행되는 명령을 가리키는 특수한 용도로 사용된다.


아래에서 [d]는 d 레지스터의 값이 메모리 주소이며, [d]는 그 주소에 저장되는 값이라는 것을 나타낸다. [c]도 마찬가지이다.



[편집] 메모리
가상 머신에는 각각 10자리 삼진수 숫자를 저장할 수 있는 59049개의 메모리 공간이 있다. 각각의 공간에는 0부터 59048까지의 주소가 붙어 있으며 0부터 59048까지의 값을 저장할 수 있다. 59049가 저장될 경우 0으로 바뀐다.


Malbolge 프로그램이 시작되기 전에, 메모리의 앞부분이 프로그램으로 채워진다. 프로그램에 들어 있는 모든 공백 문자는 사라지며, 프로그래밍을 더욱 더 어렵게 하기 위해, 공백 문자를 제외한 프로그램은 아래에 설명된 명령 중 하나로 시작하여야 한다.


나머지 메모리 공간은 이전의 두 메모리 주소를 crazy 연산으로 계산한 값으로 채워진다 ([m] = crz [m-2], [m-1]). 이 방법으로 채워진 메모리는 12개 간격으로 그 값이 반복된다. (각각의 삼진수 한 자리는 3개나 4개 간격으로 그 값이 반복되기 때문에, 전체 값은 12개 간격으로 반복된다고 할 수 있다)



[편집] 명령
Malbolge에는 여덟 개의 명령이 있다. Malbolge는 [c]의 값에 c를 더하고, 그 값을 94로 나눈 나머지에 따라 어떤 명령을 실행할 지 결정한다. 각각의 결과에 따라 실행되는 명령은 다음과 같다.


([c] + c)
mod 94 | 어셈블리 표현 | 설명
4 | jmp [d] + 1 | [d]의 값에 1을 더한 위치로 이동해서 그 위치부터 프로그램 실행을 진행한다.
5 | out a | a의 값을 아스키 문자로 화면에 출력한다.
23 | in a | 문자 하나를 입력받아서, 그 문자의 아스키 코드를 a에 넣는다. 개행문자는 항상 10으로 입력되며, 파일의 끝(EOF)에서는 59048이 입력된다.
39 | rotr [d] / mov a, [d] | [d]의 값을 3진수 한 자리만큼 돌린다. (즉 0002111112는 2000211111이 된다) 결과는 [d]와 a에 둘 다 저장된다.
40 | mov d, [d] | [d]에 있는 값을 d로 복사한다.
62 | crz [d], a / mov a, [d] | [d]와 a의 값을 가지고 아래에 설명된 crazy 연산을 수행한다. 결과는 [d]와 a에 둘 다 저장된다.
68 | nop | 아무 일도 하지 않는다.
81 | end | 프로그램을 종료한다.


위에 속하지 않는 모든 값은 68과 같은 역할(아무 일도 하지 않음)을 한다. 이 값들은 프로그램이 처음에 불릴 때는 허용되지 않지만 프로그램이 실행되면서 메모리 공간이 바뀐 상태에서는 명령으로 쓰일 수 있다.


각각의 명령이 실행된 후, 해당 명령은 아래에서 설명하는 방법으로 암호화되어서, 이동 명령이 실행되지 않았다면 다음에 실행되었을 때 같은 역할을 하지 않게 된다. 이동 명령이 실행되었을 경우에는 현재 명령이 아닌 이동된 위치 바로 앞에 있는 명령이 암호화된다. 그 후, c와 d의 값이 1씩 증가한 후 다음 명령이 실행된다.



[편집] Crazy 연산
두 숫자의 각각의 3진법 자리마다 다음 표를 적용해서 결과를 얻는다. 예를 들어서 crz 0001112220, 0120120120의 결과는 1001022211이다.


            Input 2
crz          0 1 2
             -----
         0 | 1 0 0
Input1   1 | 1 0 2
         2 | 2 2 1



[편집] 암호화
명령이 실행된 후, [c]의 값이 94보다 작을 때까지 94를 뺀다. 그 결과는 다음과 같은 (실제로는 완전히 같은) 두 방법을 통해 암호화되어 다시 [c]에 저장된다.



[편집] 첫째 방법
다음에서 결과값을 찾은 후, 그 아래에 있는 문자의 아스키 코드를 [c]에 저장한다.


0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
----------------------------------------------------------------------------------------------
9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb


[편집] 둘째 방법
다음 표에서 결과값을 찾은 후 그 값을 [c]에 저장한다.


결과값 저장할 값 | 결과값 저장할 값 | 결과값 저장할 값 | 결과값 저장할 값 | 결과값 저장할 값
0 57 | 19 108 | 38 113 | 57 91 | 76 79
1 109 | 20 125 | 39 116 | 58 37 | 77 65
2 60 | 21 82 | 40 121 | 59 92 | 78 49
3 46 | 22 69 | 41 102 | 60 51 | 79 67
4 84 | 23 111 | 42 114 | 61 100 | 80 66
5 86 | 24 107 | 43 36 | 62 76 | 81 54
6 97 | 25 78 | 44 40 | 63 43 | 82 118
7 99 | 26 58 | 45 119 | 64 81 | 83 94
8 96 | 27 35 | 46 101 | 65 59 | 84 61
9 117 | 28 63 | 47 52 | 66 62 | 85 73
10 89 | 29 71 | 48 123 | 67 85 | 86 95
11 42 | 30 34 | 49 87 | 68 33 | 87 48
12 77 | 31 105 | 50 80 | 69 112 | 88 47
13 75 | 32 64 | 51 41 | 70 74 | 89 56
14 39 | 33 53 | 52 72 | 71 83 | 90 124
15 88 | 34 122 | 53 45 | 72 55 | 91 106
16 126 | 35 93 | 54 90 | 73 50 | 92 115
17 120 | 36 38 | 55 110 | 74 70 | 93 98
18 68 | 37 103 | 56 44 | 75 104



[편집] 암호화 과정에서의 사이클
Lou Scheffer의 Malbolge를 암호학적으로 분석한 결과에서는 암호화 과정에서의 다음과 같은 여섯 개의 사이클을 언급하고 있다:


33 => 53 => 45 => 119 => 78 => 49 => 87 => 48 => 123 => 71 => 83 => 94 => 57 => 91 => 106 => 77 => 65 => 59 => 92 => 115 => 82 => 118 => 107 => 75 => 104 => 89 => 56 => 44 => 40 => 121 => 35 => 93 => 98 => 84 => 61 => 100 => 97 => 46 => 101 => 99 => 86 => 95 => 109 => 88 => 47 => 52 => 72 => 55 => 110 => 126 => 64 => 81 => 54 => 90 => 124 => 34 => 122 => 63 => 43 => 36 => 38 => 113 => 108 => 39 => 116 => 69 => 112 => 68 => 33 ...
37 => 103 => 117 => 111 => 120 => 58 => 37 ...
41 => 102 => 96 => 60 => 51 => 41 ...
42 => 114 => 125 => 105 => 42 ...
50 => 80 => 66 => 62 => 76 => 79 => 67 => 85 => 73 => 50 ...
70 => 74 => 70 ...
이 사이클들은 각각의 시간에 다른 일을 한 다음 극적으로 돌아와서 반복되는 루프를 만드는 데 사용할 수 있다. Lou Scheffer는 이 아이디어를 (아래에 링크된 그의 분석 결과에 포함되어 있는) 사용자의 입력을 모두 출력으로 되돌리는 Malbolge 프로그램을 만드는 데 사용했다.


이제 링크
아희 자바스크립트 인터프리터 : http://puzllet.org/doc/aheui/jsaheui_ko.html

첨부 파일은 이것을 메모장으로 정리해 노았으니까, 잘 보세요.

맞다! 어떤 미친 사람이 게임을 Brainfuck으로 만들었어요. 소스 파일은 무려 2MB!
소스와 EXE압축해서 올립니다.


김제형   2008-11-10 AM 12:32:06  
여기에 올린 이유.
딴데는 다 이미지만 올린다고 한다...
한수훈   2008-11-10 PM 4:19:43  
어떻게 쓰는거지요? ㅎㅎ
김제형   2008-11-10 PM 6:27:19  
??
박종훈   2008-11-12 PM 1:34:30  
히히~ 난해한 프로그래밍 언어군요 ㅋㅋ
저는 아희인가, 그거만 알고 있었는데(물론 이름만 들어봤지 너무 난해해서 사용은 못해봤어요-_-...)
더 난해한 언어들도 많군요 ㅋㅋ
LIST ALL               GO TO THE TOP


N
Category
   Subject
Posted by
Date
H
697 기타
   한타 ↔ 영타 (조썰체 해독기 -.-) [1]
지상현 2007/01/01  13701
기타
   난해한 프로그래밍 언어 [4]
김제형 2008/11/10  12529
695 기타
   [요청자료] 스눕스파이.. [7]
최재일[20JI] 2004/05/20  11587
694 기타
   한타 ↔ 영타! (Qwerty, 두벌식) [5]
지상현 2006/01/20  11441
693 기타
   [유용한 도구..] Spy++ v7 (한글..) [5]
박종훈 2006/04/09  10463
692 기타
   MS Access없이 MDB/ACCDB 파일을 ...
바람 2018/02/05  10003
691 기타
   원도우 XP 시디키 알아내는 프로그램 [12]
최재일 2005/11/02  9730
690 창조관련
   스타 배틀렛 시디키 추출기 [7]
김훈 2004/05/05  9716
689 기타
   놀라운 속도....[2] [1]
위자드 2004/04/27  9600
688 기타
   도스M 입니다. [4]
김정수 2005/02/19  9524
687 기타
   피디박스검색기; [1]
만물 2005/12/01  9336
686 기타
   델파이 6 퍼스널 버젼입니다. [13]
qkrwhdgns 2005/05/29  8594
685 기타
   VB로 만든 헬스장 관리 시스템;; [4]
최재일 2006/02/04  8376
684 기타
   버튼 디자인하기
김대명 2011/05/08  8371
notice 기타   소스를 제외한 자료를 올리는곳입... nylon 2002/09/07  8364
682 기타
   아주 간단한 비베6 윈속 웹 서버, [3]
한수훈 2010/08/04  8268
681 창조관련
   키로그 예제 프로그램인데.. -_-;; [11]
qkrwhdgns 2006/01/09  8220
680 기타
   고스트 멀티캐스트 서버 프론트엔드 [4]
강현구 2010/10/09  8096
679 창조관련
   시그마 계산기
성인e 2009/03/26  8032
678 기타
   한글로된 프로그래밍언어 '한글플... [16]
임근묵 2004/04/25  7993
677 창조관련
   창조 0.76버전입니다.:링크: [5]
nylon 2002/09/07  7848
676 기타
   IE.Eraser 1.0입니다^^ [2]
창조신화 2002/10/20  7817
675 창조관련
   마우스 감도조절 프로그램이라는데.. [2]
정윤부 2002/10/30  7501
674 기타
   인스톨제작 프로그램 인스톨팩토... [3]
창조신화 2002/09/08  7474
673 기타
   SmartSniff (스누핑 프로그램..) [3]
박종훈 2006/04/15  7307
LIST ALL   1 [2][3][4][5][6][7][8][9][10]..[28] Next
Copyright 1999-2024 Zeroboard / skin by reedyfox in miniwini style
로그인
지우개 Expert 3.0
제작자 : 천호성 님 [LINK]
로그인
대박로또2005
제작자 : 최재일 님 [LINK]
로그인
1박종훈15292 점
2지상현8809 점
3손상진7388 점
4권선중6060 점
5이진백5174 점
로그인
가입일닉네임
05/31김동률
03/31홍형기
09/01o00pp99oo
12/27이재민
11/20이희철
로그인