화이트스페이스 (프로그래밍 언어): 두 판 사이의 차이

내용 삭제됨 내용 추가됨
토끼군 (토론 | 기여)
편집 요약 없음
 
토끼군 (토론 | 기여)
명령 목록 집어 넣음 (from whitespace tutorial)
1번째 줄:
'''Whitespace'''는 [[에드윈 브래디]](Edwin Brady)와 [[크리스 모리스]](Chris Morris, cim)가 [[2003년]] [[4월 1일]]에 발표한 [[난해한 프로그래밍 언어]]이다. 이 언어의 인터프리터는 공백 문자를 뺀 모든 문자를 무시한다. 오직 공백과 탭, 그리고 개행문자만이 문법에 포함된다. [[2004년]] 현재 이 언어의 최신 버전은 0.3이다.
 
이 언어는 [[스택 (자료구조)|스택]] 기반의 [[명령형 프로그래밍|명령형]] 프로그래밍 언어이다. 프로그램이 실행되는 [[가상 머신]]은 스택과 [[동적 메모리 할당|힙]]을 가지고 있다. 프로그래머는 스택에 임의의 정수를 자유롭게 푸시할 수 있으며, (아직 부동 소숫점이나 실수의 구현은 없다) 또한 변수와 [[자료 구조]]를 계속 보존하기 위해서 힙에 접근할 수 있다.
 
== 외부 고리명령들 ==
''여기에서는 공백 문자들의 표현을 간편하게 하기 위하여 공백은 a, 탭은 b, 개행문자는 c로 표기한다.''
 
Whitespace의 명령은 둘 이상의 공백 문자로 이루어져 있다. 그 중 일부 명령 뒤에는 인자가 필요한데, 크게 숫자 인자와 라벨 인자로 나뉜다.
* 숫자는 첫 문자가 공백일 때 양수이고, 탭일 때 음수이다. 그 다음 문자부터는 숫자의 절대값을 [[2진수]]로 표현하며, 공백은 0, 탭은 1을 가리킨다. 숫자 인자는 숫자 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 13은 abbabc, aabbabc, aaabbabc 등으로, -13은 bbbabc, babbabc, baabbabc 등으로, 0은 c, ac, aac, aaac, bc, bac, baac 등으로 표현할 수 있다.
* 라벨은 공백과 탭만으로 이루어진 문자열이다. 라벨 인자는 라벨 뒤에 개행문자를 붙여서 표현한다. 예를 들어서 ababac와 babac, c는 서로 다른 라벨을 가리키는 인자이다.
 
Whitespace 0.3에서 지원하는 명령은 다음과 같다:
{|
| style="width:10%;"| '''명령''' || style="width:10%;"| '''인자 종류''' || style="width:80%;"| '''설명'''
|-
| <code>aa</code> || 숫자 || 해당하는 숫자를 스택에 푸시한다.
|-
| <code>aca</code> || - || 스택 꼭대기에 있는 숫자를 복제한다.
|-
| <code>aba</code> || 숫자 (''n'') || 스택 꼭대기부터 세서 ''n''번째 숫자를 복사해서 스택 꼭대기에 푸시한다.
|-
| <code>acb</code> || - || 스택 꼭대기에 있는 두 숫자의 자리를 바꾼다.
|-
| <code>acc</code> || - || 스택에서 숫자 하나를 팝해서 버린다.
|-
| <code>abc</code> || 숫자 (''n'') || 스택 꼭대기에 있는 숫자만 빼고, 스택 윗쪽에 있는 ''n''개의 숫자를 버린다.
|-
| <code>baaa</code> || - || 스택에서 ''a''와 ''b''를 순서대로 팝한 후, ''a''+''b''를 푸시한다.
|-
| <code>baab</code> || - || 스택에서 ''a''와 ''b''를 순서대로 팝한 후, ''b''-''a''를 푸시한다.
|-
| <code>baac</code> || - || 스택에서 ''a''와 ''b''를 순서대로 팝한 후, ''a''*''b''를 푸시한다.
|-
| <code>baba</code> || - || 스택에서 ''a''와 ''b''를 순서대로 팝한 후, 정수 나눗셈 ''b''/''a''의 몫을 푸시한다.
|-
| <code>babb</code> || - || 스택에서 ''a''와 ''b''를 순서대로 팝한 후, 정수 나눗셈 ''b''/''a''의 나머지를 푸시한다.
|-
| <code>bba</code> || - || 스택에서 ''v''와 ''a''를 순서대로 팝한 후, 힙 공간의 주소 ''a''에 값 ''v''를 저장한다.
|-
| <code>bbb</code> || - || 스택에서 숫자 ''a''를 팝한 후, 힙 공간의 주소 ''a''에 들어 있는 값을 푸시한다.
|-
| <code>caa</code> || 라벨 || 라벨을 현재 위치에 설정한다.
|-
| <code>cab</code> || 라벨 || 지정된 라벨에 있는 서브루틴을 호출한다.
|-
| <code>cac</code> || 라벨 || 지정된 라벨로 이동한다.
|-
| <code>cba</code> || 라벨 || 스택에서 숫자를 팝해서, 그 숫자가 0이면 지정된 라벨로 이동한다.
|-
| <code>cbb</code> || 라벨 || 스택에서 숫자를 팝해서, 그 숫자가 음수이면 지정된 라벨로 이동한다.
|-
| <code>cbc</code> || - || 서브루틴을 끝내고 원래 위치로 돌아 간다.
|-
| <code>ccc</code> || - || 프로그램을 종료한다.
|-
| <code>bcaa</code> || - || 스택에서 숫자 하나를 팝하고, 그 숫자가 가리키는 ASCII 문자를 출력한다.
|-
| <code>bcab</code> || - || 스택에서 숫자 하나를 팝하고, 그 숫자를 문자열로 출력한다.
|-
| <code>bcba</code> || - || 사용자에게 문자 하나를 입력받고, 스택에서 숫자 ''a''를 팝해서 힙 공간의 주소 ''a''에 그 문자의 ASCII 값을 저장한다.
|-
| <code>bcbb</code> || - || 사용자에게 숫자를 입력받고, 스택에서 숫자 ''a''를 팝해서 힙 공간의 주소 ''a''에 그 숫자를 저장한다.
|}
 
== 외부 고리 ==
* [http://compsoc.dur.ac.uk/whitespace/ Whitespace 홈페이지]
* [http://developers.slashdot.org/article.pl?sid=03/04/01/0332202 Slashdot에 올라 온 발표 소식]