맨위로가기

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

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

화이트스페이스는 2002년 에드윈 브래디와 크리스 모리스가 개발한 프로그래밍 언어이다. 이 언어는 공백 문자(스페이스, 탭, 줄 바꿈)만을 사용하여 명령을 표현하며, 다른 문자는 주석으로 처리된다. 명령어는 명령어 수정 매개변수(IMP)와 연산자, 매개변수의 조합으로 구성되며, 스택 조작, 산술 연산, 힙 접근, 흐름 제어, I/O 등의 기능을 지원한다. 숫자와 라벨을 인자로 사용하며, 숫자는 이진수로 표현되고 라벨은 공백과 탭의 문자열로 정의된다. 화이트스페이스는 공백 문자를 통해 코드를 작성하는 독특한 특징을 가지고 있으며, "Hello, world!"와 같은 예제 코드를 통해 언어의 작동 방식을 확인할 수 있다.

더 읽어볼만한 페이지

  • 2002년 개발된 프로그래밍 언어 - F 샤프
    F#은 .NET 플랫폼에서 실행되는 크로스 플랫폼, 오픈 소스 프로그래밍 언어로서 함수형, 명령형, 객체 지향 프로그래밍을 지원하며 데이터 분석, 웹 개발, 앱 개발 등 다양한 분야에서 활용된다.
  • 2002년 개발된 프로그래밍 언어 - 시스템베릴로그
    SystemVerilog는 Verilog를 확장한 하드웨어 기술 및 검증 언어로서, 객체 지향 프로그래밍, 제약 기반 난수 생성, 어설션 등의 고급 검증 기능을 제공하여 하드웨어 설계 및 검증의 효율성을 높인다.
  • 영어 기반이 아닌 프로그래밍 언어 - 두리틀 (프로그래밍 언어)
    두리틀은 다국어 지원, 터틀 그래픽스 기반 직관적인 프로그래밍, 충돌 감지, 음악 지원, 프로토타입 기반 객체 지향 특징을 갖춘, 레고 조립 방식의 쉬운 프로그래밍 언어로서 다양한 운영체제와 웹 브라우저를 지원한다.
  • 영어 기반이 아닌 프로그래밍 언어 - 말레볼제
    말레볼제는 극도로 난해한 프로그래밍 언어로서 복잡한 문법과 자기 수정 특성을 가지며, 삼진법 가상 머신 기반으로 8개의 명령어와 세 개의 레지스터를 사용하고 59,049개의 메모리 공간을 가지지만 튜링 불완전성을 극복하기 위한 변종들이 개발되고 있으며, 프로그램 난독화나 암호 시스템 연구 등에 활용되나 극심한 난해함으로 인해 실용성은 낮다는 비판을 받지만, 컴퓨터 과학 분야에서 언어 설계의 극단적인 예시를 제시하며 프로그래밍 언어의 복잡성에 대한 이해를 높이는 데 기여한다.
  • 난해한 프로그래밍 언어 - HQ9+
    HQ9+는 간단한 인터프리터 구현이 가능한 난해한 프로그래밍 언어로, 'Hello, world!' 출력, 소스 코드 출력, "99 Bottles of Beer" 가사 출력, 누산기 값 증가의 네 가지 명령을 제공한다.
  • 난해한 프로그래밍 언어 - FRACTRAN
    FRACTRAN은 정수의 소인수 지수를 레지스터로 활용하여 분수 목록을 곱하는 과정을 반복하며 다양한 계산을 수행하는 계산 모델이다.
화이트스페이스 (프로그래밍 언어)
기본 정보
유형난해한 프로그래밍 언어
고안자에드윈 브래디와 크리스 모카트
발표일2003년 4월 1일
설계 방식스택 머신
영향을 받은 언어Brainfuck
영향 준 언어Pikalog
특징
명령 집합공백 문자 (스페이스, 탭, 줄 바꿈)
프로그래밍 패러다임명령형 프로그래밍
자료형정수
영감어셈블리어
파일 확장자.ws
예시
Hello, World!탭-스페이스 줄바꿈 스페이스 스페이스 스페이스 탭 탭 줄바꿈 스페이스 탭 스페이스 스페이스 스페이스 탭 줄바꿈 스페이스 스페이스 스페이스 스페이스 탭 줄바꿈 탭 줄바꿈 줄바꿈 줄바꿈

2. 역사

C++ 언어의 창시자인 비야네 스트롭스트룹(Bjarne Stroustrup)은 1998년에 공백 문자를 연산자로 사용하자는 아이디어를 농담 삼아 제안한 적이 있다.[4] 그로부터 5년 뒤인 2002년, 카야와 이드리스 언어 개발에도 참여했던 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris)가 더럼 대학교에서 화이트스페이스를 실제로 만들었다. 이후 슬래시닷은 2003년 만우절에 이 언어에 대한 기사를 게재했다.[3]

3. 문법

화이트스페이스 언어의 가장 큰 특징은 공백 문자(스페이스, 탭, 줄 바꿈)만을 사용하여 코드를 작성한다는 점이다. 대부분의 프로그래밍 언어에서 토큰 구분을 위해 사용되는 공백 문자가 화이트스페이스에서는 명령어와 데이터를 나타내는 유일한 수단이다. 공백, 탭, 줄 바꿈 이외의 모든 문자는 주석으로 간주되어 프로그램 실행에 영향을 주지 않는다. (자세한 내용은 #주석 참고)

화이트스페이스의 명령어는 명령어 수정 매개변수(IMP, Instruction Modification Parameter), 연산자, 그리고 필요한 경우 매개변수의 조합으로 구성된다.[1]


  • 명령어 수정 매개변수 (IMP): 명령어의 종류를 구분하는 역할을 한다. 스택 조작, 산술 연산, 힙 접근, 제어 흐름, 입출력(I/O) 등으로 나뉜다.[1]
  • 연산자: IMP와 결합하여 구체적인 동작(예: 스택에 숫자 넣기, 덧셈 수행 등)을 정의한다.
  • 매개변수: 일부 명령어는 추가 정보로 숫자나 라벨을 필요로 한다. 숫자와 라벨 역시 공백 문자의 조합으로 표현된다. (자세한 내용은 #숫자 표현, #라벨 참고)


예를 들어, 탭(Tab), 스페이스(Space), 스페이스(Space), 스페이스(Space) 순서로 입력된 `[Tab][Space][Space][Space]`는 산술 연산 IMP([Tab][Space])와 덧셈 연산자([Space][Space])가 결합된 형태로, 스택의 맨 위 두 숫자를 꺼내 더한 후 결과를 다시 스택에 넣는 명령어이다.

명령어의 구체적인 목록과 각 명령어의 기능은 #명령어 목록에서 확인할 수 있다.

3. 1. 명령어 목록

여기에서는 공백 문자들의 표현을 간편하게 하기 위하여 공백은 S, 탭은 T, 개행문자는 L로 표기한다.

화이트스페이스의 명령어는 IMP(Instruction Modification Parameter), 연산자, 그리고 필요한 경우 매개변수의 순서로 구성된다.[1] 명령어는 둘 이상의 공백 문자로 이루어져 있으며, 일부 명령 뒤에는 인자가 필요하다. 인자는 크게 숫자 인자와 라벨 인자로 나뉜다.

  • 숫자 인자: 숫자는 첫 문자가 공백(S)일 때 양수이고, 탭(T)일 때 음수이다. 그 다음 문자부터는 숫자의 절댓값을 2진수로 표현하며, 공백(S)은 0, 탭(T)은 1을 나타낸다. 숫자 인자는 숫자 표현 뒤에 개행문자(L)를 붙여 완성한다. 예를 들어, 13은 STTSTL (S + TTST + L)로 표현할 수 있고, -13은 TTTSTL (T + TTST + L)로 표현할 수 있다. 0은 단순히 L로 표현할 수 있다. (앞에 부호나 0을 나타내는 S/T를 임의로 붙여 SL, TL 등으로 표현해도 0이다.)
  • 라벨 인자: 라벨은 공백(S)과 탭(T)만으로 이루어진 문자열이며, 라벨 뒤에 개행문자(L)를 붙여 인자를 완성한다. 라벨은 고유한 식별자로 사용된다. 예를 들어, STSTSL와 TSTSL은 서로 다른 라벨을 가리킨다.


명령어 수정을 위한 IMP는 다음과 같다.[1]

IMP의미
S스택 조작
TS산술
TT힙 접근
L흐름 제어
TLI/O



화이트스페이스 0.3에서 지원하는 IMP별 명령어 목록은 다음과 같다.[1] ('복사'(STS) 및 '슬라이드'(STL) 연산은 Whitespace 0.3에 추가되었다.[1])

명령 (IMP + 연산자)인자 종류설명
스택 조작 (IMP: S)
SS숫자해당하는 숫자를 스택에 넣는다.
SLS-스택 꼭대기에 있는 숫자를 복제한다.
STS숫자 (n)스택 꼭대기부터 세서 n번째 숫자를 복사해서 스택 꼭대기에 넣는다. (0.3 버전 추가)
SLT-스택 꼭대기에 있는 두 숫자의 자리를 바꾼다.
SLL-스택에서 숫자 하나를 꺼내서 버린다.
STL숫자 (n)스택 꼭대기에 있는 숫자만 남기고, 그 아래에 있는 n개의 숫자를 버린다. (0.3 버전 추가)
산술 (IMP: TS)
TSSS-스택에서 ab를 순서대로 꺼낸 후, b+a를 계산하여 결과를 넣는다.
TSST-스택에서 ab를 순서대로 꺼낸 후, b-a를 계산하여 결과를 넣는다.
TSSL-스택에서 ab를 순서대로 꺼낸 후, b*a를 계산하여 결과를 넣는다.
TSTS-스택에서 ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다. (a가 0이면 오류 발생)
TSTT-스택에서 ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지(b mod a)를 넣는다. (a가 0이면 오류 발생)
힙 접근 (IMP: TT)
TTS-스택에서 값 v와 주소 a를 순서대로 꺼낸 후, 힙 공간의 주소 a에 값 v를 저장한다.
TTT-스택에서 주소 a를 꺼낸 후, 힙 공간의 주소 a에 저장된 값을 스택에 넣는다.
흐름 제어 (IMP: L)
LSS라벨현재 위치에 라벨을 설정한다. 라벨은 프로그램 내에서 고유해야 한다.
LST라벨지정된 라벨의 위치를 호출 스택에 저장하고, 해당 라벨 위치로 이동하여 서브루틴을 호출한다.
LSL라벨지정된 라벨 위치로 무조건 이동한다.
LTS라벨스택에서 숫자를 하나 꺼내서, 그 숫자가 0이면 지정된 라벨 위치로 이동한다.
LTT라벨스택에서 숫자를 하나 꺼내서, 그 숫자가 음수이면 지정된 라벨 위치로 이동한다.
LTL-서브루틴 실행을 종료하고, 호출 스택에 저장된 원래 위치로 돌아간다.
LLL-프로그램을 정상적으로 종료한다.
I/O (입출력) (IMP: TL)
TLSS-스택에서 숫자 하나를 꺼내고, 그 숫자에 해당하는 ASCII 문자를 표준 출력으로 내보낸다.
TLST-스택에서 숫자 하나를 꺼내고, 그 숫자를 문자열 형태로 표준 출력으로 내보낸다.
TLTS-표준 입력에서 문자 하나를 읽고, 스택에서 주소 a를 꺼내서 읽은 문자의 ASCII 값을 힙 공간의 주소 a에 저장한다.
TLTT-표준 입력에서 숫자를 읽고(개행 문자로 종료), 스택에서 주소 a를 꺼내서 읽은 숫자를 힙 공간의 주소 a에 저장한다.


3. 2. 주석

공백, , 줄 바꿈 문자를 제외한 다른 문자는 무시되므로 주석으로 사용할 수 있다.

3. 3. 숫자 표현

여기에서는 설명을 위해 공백 문자를 다음과 같이 표기한다:

  • 공백: S (Space)
  • 탭: T (Tab)
  • 줄바꿈: L (Linefeed)


화이트스페이스에서 숫자는 부호, 값, 종료 문자를 순서대로 조합하여 표현한다.

  • 부호: 숫자의 첫 문자는 부호를 나타낸다.
  • 공백(S)은 양수를 의미한다.
  • 탭(T)은 음수를 의미한다.
  • : 부호 문자 다음에는 숫자의 절댓값을 2진법으로 표현한다.
  • 공백(S)은 숫자 0을 나타낸다.
  • 탭(T)은 숫자 1을 나타낸다.
  • 종료: 숫자 표현은 항상 줄바꿈(L) 문자로 끝나야 한다.


예를 들어 숫자를 표현하면 다음과 같다:

  • 양수 75: 십진수 75는 이진수 1001011에 해당한다. 부호는 양수(S)이고, 값은 'TSSTSTT' (1001011)이며, 종료 문자(L)를 붙여 'S TSSTSTT L' 로 표현한다.
  • 음수 50: 십진수 -50은 이진수 110010에 해당한다. 부호는 음수(T)이고, 값은 'TTSSTS' (110010)이며, 종료 문자(L)를 붙여 'T TTSSTS L' 로 표현한다.
  • 숫자 0: 값 없이 종료 문자 'L' 만으로 표현할 수 있다.

3. 4. 라벨

제어 흐름에 사용되는 식별자다. 라벨은 공백(Space) 문자와 (Tab) 문자로만 구성된 문자열이며, 반드시 줄 바꿈(Line Feed) 문자로 끝나야 한다.[1] 예를 들어, '공백-탭-공백-탭-공백-줄 바꿈'(소스 표기 예시: STSTSL)과 '탭-공백-탭-공백-줄 바꿈'(소스 표기 예시: TSTSL)은 서로 다른 라벨로 인식된다.

화이트스페이스 언어는 라벨을 위한 별도의 네임스페이스를 가지지 않으므로, 프로그램 내에서 사용되는 모든 라벨은 서로 겹치지 않는 고유한 이름을 가져야 한다.[1] 라벨은 특정 코드 위치를 지정하는 명령어(LSS), 해당 위치로 이동하는 명령어(LSL, LTS, LTT), 서브루틴을 호출하는 명령어(LST) 등 제어 흐름 관련 명령어에서 인자로 사용된다.

4. 예제 코드

다음은 화이트스페이스로 작성된 "Hello, world!" 프로그램 예제이다. 코드의 가독성을 위해 각 공백(Space)은 `S`, 탭(Tab)은 `T`, 줄 바꿈(Line Feed)은 `L` 문자로 표시하였다. 각 줄 끝의 설명은 해당 코드 줄의 동작을 나타낸다.



S S S T S S T S S S L ; 스택에 숫자 72 ('H') 푸시 (이진수 1001000)

T L S S ; 스택 최상단 값('H')을 문자로 출력

S S S T T S S T S T L ; 스택에 숫자 101 ('e') 푸시 (이진수 1100101)

T L S S ; 스택 최상단 값('e')을 문자로 출력

S S S T T S T T S S L ; 스택에 숫자 108 ('l') 푸시 (이진수 1101100)

T L S S ; 스택 최상단 값('l')을 문자로 출력

S S S T T S T T S S L ; 스택에 숫자 108 ('l') 푸시 (이진수 1101100)

T L S S ; 스택 최상단 값('l')을 문자로 출력

S S S T T S T T T T L ; 스택에 숫자 111 ('o') 푸시 (이진수 1101111)

T L S S ; 스택 최상단 값('o')을 문자로 출력

S S S T S T T S S L ; 스택에 숫자 44 (',') 푸시 (이진수 101100)

T L S S ; 스택 최상단 값(',')을 문자로 출력

S S S T S S S S S L ; 스택에 숫자 32 (' ') 푸시 (이진수 100000)

T L S S ; 스택 최상단 값(' ')을 문자로 출력

S S S T T T S T T T L ; 스택에 숫자 119 ('w') 푸시 (이진수 1110111)

T L S S ; 스택 최상단 값('w')을 문자로 출력

S S S T T S T T T T L ; 스택에 숫자 111 ('o') 푸시 (이진수 1101111)

T L S S ; 스택 최상단 값('o')을 문자로 출력

S S S T T T S S T S L ; 스택에 숫자 114 ('r') 푸시 (이진수 1110010)

T L S S ; 스택 최상단 값('r')을 문자로 출력

S S S T T S T T S S L ; 스택에 숫자 108 ('l') 푸시 (이진수 1101100)

T L S S ; 스택 최상단 값('l')을 문자로 출력

S S S T T S S T S S L ; 스택에 숫자 100 ('d') 푸시 (이진수 1100100)

T L S S ; 스택 최상단 값('d')을 문자로 출력

S S S T S S S S T L ; 스택에 숫자 33 ('!') 푸시 (이진수 100001)

T L S S ; 스택 최상단 값('!')을 문자로 출력

L L L ; 프로그램 종료



일부 웹 브라우저에서는 화이트스페이스 소스 코드를 표시할 때 탭 문자가 만드는 가로 간격이 고정되지 않고, 다음 가로 탭 정지 위치에 따라 달라질 수 있다. 또한, 사용 중인 소프트웨어에 따라 탭 문자가 해당하는 개수의 공백 문자로 변환되어 표시될 수도 있다.

참고로, 소스 코드에 첨부된 샘플 파일(`examples/hworld.ws`)[5]을 Whitespace 인터프리터에 전달하면 다음과 같이 동작한다. 이는 위의 코드 예제("Hello, world!")와는 다른 출력을 보여준다.



$ ./wspace examples/hworld.ws

Hello, world of spaces!


참조

[1] 웹사이트 Whitespace http://compsoc.dur.a[...] 2015-12-08
[2] 서적 Humble Pi: a comedy of maths errors Allen Lane 2019
[3] 웹사이트 New Whitespace-Only Programming Language http://developers.sl[...] 2003-04-01
[4] 웹사이트 Generalizing Overloading for C++2000 http://www.stroustru[...] AT&T Labs 2014-01-23
[5] 웹사이트 hworld.ws http://compsoc.dur.a[...] 2024-01-26



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com