화이트스페이스 (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
구문 강조를 적용한 화이트스페이스 코드: Hello world 프로그램
     (Tabs)      공백(Spaces)

화이트스페이스(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 - 스택에서 ab를 순서대로 꺼낸 후, a+b를 넣는다.
TSST - 스택에서 ab를 순서대로 꺼낸 후, b-a를 넣는다.
TSSL - 스택에서 ab를 순서대로 꺼낸 후, a*b를 넣는다.
TSTS - 스택에서 ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다.
TSTT - 스택에서 ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지(b mod a)를 넣는다.
TTS - 스택에서 va를 순서대로 꺼낸 후, 힙 공간의 주소 a에 값 v를 저장한다.
TTT - 스택에서 숫자 a를 꺼낸 후, 힙 공간의 주소 a에 들어 있는 값을 넣는다.
LSS 라벨 라벨을 현재 위치에 설정한다.
LST 라벨 지정된 라벨에 있는 서브루틴을 호출한다.
LSL 라벨 지정된 라벨로 이동한다.
LTS 라벨 스택에서 숫자를 꺼내서, 그 숫자가 0이면 지정된 라벨로 이동한다.
LTT 라벨 스택에서 숫자를 꺼내서, 그 숫자가 음수이면 지정된 라벨로 이동한다.
LTL - 서브루틴을 끝내고 원래 위치로 돌아 간다.
LLL - 프로그램을 종료한다.
TLSS - 스택에서 숫자 하나를 꺼내고, 그 숫자가 가리키는 ASCII 문자를 출력한다.
TLST - 스택에서 숫자 하나를 꺼내고, 그 숫자를 문자열로 출력한다.
TLTS - 사용자에게 문자 하나를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 문자의 ASCII 값을 저장한다.
TLTT - 사용자에게 숫자를 입력받고, 스택에서 숫자 a를 꺼내서 힙 공간의 주소 a에 그 숫자를 저장한다.

화이트스페이스 언어에 쓰이는 공백 문자는 대부분의 언어와 컴파일러에서 각 토큰을 구분하는 공백 이상의 의미를 갖지 않는다.

바깥 고리[편집]