화이트스페이스 (프로그래밍 언어)
화이트스페이스(Whitespace)는 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris, cim)가 2003년 4월 1일(만우절)에 발표한 난해한 프로그래밍 언어이다. 문법에는 오로지 공백과 탭, 그리고 개행 문자만이 의미가 있으며, 인터프리터는 이 3종류의 공백 문자를 뺀 모든 문자를 무시한다. 2004년 현재 이 언어의 최신 버전은 0.3이다.
이 언어는 스택 기반의 명령형 프로그래밍 언어이다. 프로그램이 실행되는 가상 머신은 스택과 힙을 가지고 있다. 프로그래머는 스택에 임의의 정수를 자유롭게 푸시할 수 있으며, (아직 부동소수점이나 실수의 구현은 없다.) 또한 변수와 자료 구조를 계속 보존하기 위해서 힙에 접근할 수 있다.
명령어 목록
편집여기에서는 공백 문자들의 표현을 간편하게 하기 위하여 공백은 S, 탭은 T, 개행문자는 L로 표기한다.
화이트스페이스의 명령어는 둘 이상의 공백 문자로 이루어져 있다. 그중 일부 명령 뒤에는 인자가 필요한데, 크게 숫자 인자와 라벨 인자로 나뉜다.
- 숫자는 첫 문자가 공백일 때 양수이고, 탭일 때 음수이다. 그 다음 문자부터는 숫자의 절대값을 2진수로 표현하며, 공백은 0, 탭은 1을 가리킨다. 숫자 인자는 숫자 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 13은 STTSTL, SSTTSTL, SSSTTSTL 등으로, -13은 TTTSTL, TSTTSTL, TSSTTSTL 등으로, 0은 L, SL, SSL, SSSL, TL, TSL, TSSL 등으로 표현할 수 있다.
- 라벨은 공백과 탭만으로 이루어진 문자열이다. 라벨 인자는 라벨 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 STSTSL와 TSTSL, L는 서로 다른 라벨을 가리키는 인자이다.
화이트스페이스 0.3에서 지원하는 명령은 다음과 같다:
명령 | 인자 종류 | 설명 |
---|---|---|
SS |
숫자 | 해당하는 숫자를 스택에 넣는다. |
SLS |
- | 스택 꼭대기에 있는 숫자를 복제한다. |
STS |
숫자 (n) | 스택 꼭대기부터 세서 n번째 숫자를 복사해서 스택 꼭대기에 넣는다. |
SLT |
- | 스택 꼭대기에 있는 두 숫자의 자리를 바꾼다. |
SLL |
- | 스택에서 숫자 하나를 꺼내서 버린다. |
STL |
숫자 (n) | 스택 꼭대기에 있는 숫자만 빼고, 스택 윗쪽에 있는 n개의 숫자를 버린다. |
TSSS |
- | 스택에서 a와 b를 순서대로 꺼낸 후, a+b를 넣는다. |
TSST |
- | 스택에서 a와 b를 순서대로 꺼낸 후, b-a를 넣는다. |
TSSL |
- | 스택에서 a와 b를 순서대로 꺼낸 후, a*b를 넣는다. |
TSTS |
- | 스택에서 a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다. |
TSTT |
- | 스택에서 a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지(b mod a)를 넣는다. |
TTS |
- | 스택에서 v와 a를 순서대로 꺼낸 후, 힙 공간의 주소 a에 값 v를 저장한다. |
TTT |
- | 스택에서 숫자 a를 꺼낸 후, 힙 공간의 주소 a에 들어 있는 값을 넣는다. |
LSS |
라벨 | 라벨을 현재 위치에 설정한다. |
LST |
라벨 | 지정된 라벨에 있는 서브루틴을 호출한다. |
LSL |
라벨 | 지정된 라벨로 이동한다. |
LTS |
라벨 | 스택에서 숫자를 꺼내서, 그 숫자가 0이면 지정된 라벨로 이동한다. |
LTT |
라벨 | 스택에서 숫자를 꺼내서, 그 숫자가 음수이면 지정된 라벨로 이동한다. |
LTL |
- | 서브루틴을 끝내고 원래 위치로 돌아 간다. |
LLL |
- | 프로그램을 종료한다. |
TLSS |
- | 스택에서 숫자 하나를 꺼내고, 그 숫자가 가리키는 ASCII 문자를 출력한다. |
TLST |
- | 스택에서 숫자 하나를 꺼내고, 그 숫자를 문자열로 출력한다. |
TLTS |
- | 사용자에게 문자 하나를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 문자의 ASCII 값을 저장한다. |
TLTT |
- | 사용자에게 숫자를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 숫자를 저장한다. |
화이트스페이스 언어에 쓰이는 공백 문자는 대부분의 언어와 컴파일러에서 각 토큰을 구분하는 공백 이상의 의미를 갖지 않는다.