널 프로그래밍 언어
위키백과 ― 우리 모두의 백과사전.
널(NULL)은 데이비드 루이스(David Lewis)가 만든 ‘0차원’ 난해한 프로그래밍 언어이다. 2차원 프로그래밍 언어인 비펀지에서 영감을 받아 만들어졌다. 이 언어로 짠 코드는 하나의 큰 숫자로 이루어져 있으며, 인터프리터는 코드를 실행하기 위해 그 수를 소인수분해한다.
목차 |
[편집] ‘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의 값을 바꾼다. |