[목차] == [[공백]]문자 == [[컴퓨터]]에서 [[콘솔]]이나 [[프린터]]로 찍었을 때 공백을 표현하는 문자들을 의미한다. [[POSIX]] 표준에 따르면 [[아스키 코드]] 9(Horizontal Tab), 10(Line Feed), 11(Vertical Tab), 12(Form Feed), 13(Carriage Return), 32(Space) 여섯 개가 여기에 속한다. [[C(프로그래밍 언어)|C언어]]의 ''isspace'' 함수로 화이트스페이스를 가려낼 수 있다. || 문자 || 유니코드 || 이름 || || || U+0020 || [[스페이스 바|space]] (SPC) || || \\t || U+0009 || [[탭|horizontal tab]] (TAB) || || \\n || U+000A || newline (LF) || || \\v || U+000B || vertical tab (VT) || || \\f || U+000C || feed (FF) || || \\r || U+000D || carriage return (CR)|| LF, FF, CR은 모두 [[엔터 키|줄바꿈]]과 관련된 문자로, 과거 [[타자기]] 시절 기능에서 유래된 문자들이다. 문제는 현재 [[운영체제]]에 따라 어떤 문자를 줄바꿈으로 쓰는지가 다르기 때문에 호환성에 지대한 악영향을 미치고 있다. [[강제 줄 바꿈]] 참고. == [[난해한 프로그래밍 언어]]의 한 종류 == 2003년 [[만우절]]에 에드윈 브래디(Edwin Brady), 크리스 모리스(Chris Morris)라는 두 사람이 발표한 [[난해한 프로그래밍 언어]]. 얼핏 보면 코드로 보이지도 않는 의미불명, 정체불명의 프로그래밍 방식이 압권이다. 이름 그대로 화이트스페이스(Whitespace)인데, '''모든 명령어가 스페이스, 탭, 엔터로 구성되어 있다.''' 공백과 개행문자를 1바이트로 치기 때문에 바이트 수는 늘어나지만 소스 코드를 열어보면 '''아무것도 안 쓰여있는 것처럼 보인다.''' 여기서 이걸 만든 인간들이 얼마나 [[변태]]인지 파악할 수 있다. 기본적으로는 스택 기반의 '''명령어 입력형'''이다. 즉 공백과 탭과 엔터의 조합이 전부 명령어라는 것이다. 또한 스택과 힙을 갖고 있어서 스택에 임의의 '''정수(부동소수와 실수는 못 쓴다고 한다)'''를 입출력 가능하며, 변수와 자료구조 보존을 위해 힙에 접근할 수 있다고 한다. 편의를 위해 공백은 S, 탭은 T, 개행은 L로 표기하고, 스택 맨 위의 숫자는 a, 두 번째 숫자는 b로 표기한다. 명령어는 종류에 따라 앞에 '임프'(IMP)를 붙여야 쓸 수 있다. 임프는 다음의 종류가 있다. || 임프(IMP) || 용도 || || S || 스택 조작 || || TS || 수 연산 || || TT || 힙 액세스 || || L || 흐름 제어 || || TL || 입/출력 || 명령어를 설명하기 전에, 화이트스페이스에서는 숫자를 [[2진법]]으로 표현한다. 부호는 숫자 앞에 S를 붙이면 양수, T를 붙이면 음수이다(둘 중 하나는 꼭 붙여야 한다). S=0, T=1 이며 뒤에 L을 입력해야 숫자로 인식된다. {{{+2 스택 조작(IMP: S)}}} || 명령어 || 매개 변수 || 의미 || || S || 숫자 || 숫자를 스택에 넣는다. || || LS || - || 스택 맨 위에 있는 숫자를 복제한다. || || TS || 숫자(n) || 스택 맨 위에서부터 n번째 숫자를 복사해서 스택 맨 위에 넣는다. || || LT || - || 스택 맨 위에 있는 두 숫자의 자리를 바꾼다. || || LL || - || 스택 맨 위의 숫자 하나를 버린다. || || TL || 숫자(n) || 스택 맨 위를 제외하고 스택 위쪽에 있는 n개의 숫자를 버린다. || {{{+2 연산(IMP: TS)}}} 참고로 a, b는 위에서도 말했듯이 스택 가장 위의 두 숫자를 뜻한다. || 명령어 || 의미 || || SS || 스택에서 a,b를 꺼낸 다음 a+b하여 넣는다. || || ST || 스택에서 a,b를 꺼낸 다음 a-b하여 넣는다. || || SL || 스택에서 a,b를 꺼낸 다음 a*b하여 넣는다. || || TS || 스택에서 a,b를 꺼낸 다음 a/b하여 몫을 넣는다. || || TT || 스택에서 a,b를 꺼낸 다음 a/b하여 나머지를 넣는다. || {{{+2 힙 액세스(IMP: TT)}}} || 명령어 || 의미 || || S || 스택에서 v,a를 꺼낸 다음 힙 공간의 주소 a에 v를 넣는다. || || T || 스택에서 a를 꺼낸 다음 힙 공간의 주소 a에 있는 값을 넣는다. || {{{+2 흐름 제어(IMP: L)}}} || 명령어 || 매개 변수 || 의미 || || SS || 라벨 || 현위치에 라벨을 설정한다. 라벨은 공백과 탭만으로 구성되며 끝에 엔터를 넣어서 인식시킨다. || || ST || 라벨 || 지정 라벨의 서브루틴을 호출한다. || || SL || 라벨 || 지정 라벨로 이동한다. || || TS || 라벨 || 스택에서 숫자를 꺼내서 0이면 지정된 라벨로 이동한다. || || TT || 라벨 || 스택에서 숫자를 꺼내서 -이면 지정된 라벨로 이동한다. || || TL || - || 서브루틴을 끝내고 호출자에게 컨트롤이 넘어간다. || || LL || - || 프로그램을 종료한다 || {{{+2 입/출력(IMP: TL)}}} || 명령어 || 의미 || || SS || 스택 맨 위의 숫자에 해당하는 ASCII 문자를 출력한다. || || ST || 스택 맨 위의 숫자를 문자열로 출력한다. || || TS || 문자 하나를 입력받고 스택 맨 위에 있던 값 대신 그 위치에 문자의 ASCII 값을 저장한다. || || TT || 숫자 하나를 입력받고 스택 맨 위에 있던 값 대신 그 위치에 숫자를 저장한다. || * 화이트스페이스로 만든 [[Hello, world!]] * '''{{{#red 공백}}},{{{#blue 탭}}}''' [[파일:external/upload.wikimedia.org/Whitespace_in_vim2.png]] [[분류:프로그래밍 언어]][[분류:난해한 프로그래밍 언어]][[분류:글쇠]]