{{위키데이터 속성 추적}}
[[파일:Whitespace_in_vim2.png|섬네일|322px|[[구문 강조]]를 적용한 화이트스페이스 코드: [[Hello world 프로그램]]<br />{{범례|#0000ab|[[탭]](Tabs)}}
{{범례|#ab0000|[[공백]](Spaces)}}]]

'''화이트스페이스'''({{lang|en|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에서 지원하는 명령은 다음과 같다:
{| class="wikitable"
! style="width:10%;" | 명령
! style="width:10%;" | 인자 종류
! style="width:80%;" | 설명
|-
| <code>SS</code> || 숫자 || 해당하는 숫자를 스택에 넣는다.
|-
| <code>SLS</code> || - || 스택 꼭대기에 있는 숫자를 복제한다.
|-
| <code>STS</code> || 숫자 (''n'') || 스택 꼭대기부터 세서 ''n''번째 숫자를 복사해서 스택 꼭대기에 넣는다.
|-
| <code>SLT</code> || - || 스택 꼭대기에 있는 두 숫자의 자리를 바꾼다.
|-
| <code>SLL</code> || - || 스택에서 숫자 하나를 꺼내서 버린다.
|-
| <code>STL</code> || 숫자 (''n'') || 스택 꼭대기에 있는 숫자만 빼고, 스택 윗쪽에 있는 ''n''개의 숫자를 버린다.
|-
| <code>TSSS</code> || - || 스택에서 ''a''와 ''b''를 순서대로 꺼낸 후, ''a''+''b''를 넣는다.
|-
| <code>TSST</code> || - || 스택에서 ''a''와 ''b''를 순서대로 꺼낸 후, ''b''-''a''를 넣는다.
|-
| <code>TSSL</code> || - || 스택에서 ''a''와 ''b''를 순서대로 꺼낸 후, ''a''*''b''를 넣는다.
|-
| <code>TSTS</code> || - || 스택에서 ''a''와 ''b''를 순서대로 꺼낸 후, 정수 나눗셈 ''b''/''a''의 몫을 넣는다.
|-
| <code>TSTT</code> || - || 스택에서 ''a''와 ''b''를 순서대로 꺼낸 후, 정수 나눗셈 ''b''/''a''의 나머지(''b'' mod ''a'')를 넣는다.
|-
| <code>TTS</code> || - || 스택에서 ''v''와 ''a''를 순서대로 꺼낸 후, 힙 공간의 주소 ''a''에 값 ''v''를 저장한다.
|-
| <code>TTT</code> || - || 스택에서 숫자 ''a''를 꺼낸 후, 힙 공간의 주소 ''a''에 들어 있는 값을 넣는다.
|-
| <code>LSS</code> || 라벨 || 라벨을 현재 위치에 설정한다.
|-
| <code>LST</code> || 라벨 || 지정된 라벨에 있는 서브루틴을 호출한다.
|-
| <code>LSL</code> || 라벨 || 지정된 라벨로 이동한다.
|-
| <code>LTS</code> || 라벨 || 스택에서 숫자를 꺼내서, 그 숫자가 0이면 지정된 라벨로 이동한다.
|-
| <code>LTT</code> || 라벨 || 스택에서 숫자를 꺼내서, 그 숫자가 음수이면 지정된 라벨로 이동한다.
|-
| <code>LTL</code> || - || 서브루틴을 끝내고 원래 위치로 돌아 간다.
|-
| <code>LLL</code> || - || 프로그램을 종료한다.
|-
| <code>TLSS</code> || - || 스택에서 숫자 하나를 꺼내고, 그 숫자가 가리키는 ASCII 문자를 출력한다.
|-
| <code>TLST</code> || - || 스택에서 숫자 하나를 꺼내고, 그 숫자를 문자열로 출력한다.
|-
| <code>TLTS</code> || - || 사용자에게 문자 하나를 입력받고, 스택에서 숫자 ''a''를 꺼내서 힙 공간의 주소 ''a''에 그 문자의 ASCII 값을 저장한다.
|-
| <code>TLTT</code> || - || 사용자에게 숫자를 입력받고, 스택에서 숫자 ''a''를 꺼내서 힙 공간의 주소 ''a''에 그 숫자를 저장한다.
|}

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

== 외부 링크 ==
* {{언어링크|en}} [https://web.archive.org/web/20080331083700/http://compsoc.dur.ac.uk/whitespace/ Whitespace 홈페이지]
* [http://developers.slashdot.org/article.pl?sid=03/04/01/0332202 Slashdot에 올라 온 발표 소식]

[[분류:난해한 프로그래밍 언어]]
[[분류:2002년 개발된 프로그래밍 언어]]
[[분류:영어 기반이 아닌 프로그래밍 언어]]