난해한 프로그래밍 언어 »
에 풉;에 첫 작성. 에 허튼소리로 옮긴 뒤 윤문. 에 마크업 변경 과정에서 깨진 내부 링크를 수정함.
브레인퍽(Brainfuck)은 1993년에 우어반 뮐러(Urban Müller)가 만든 난해한 프로그래밍 언어이다.
1993년은 브레인퍽과 함께 비펀지와 FALSE가 만들어진 해로, 이 때문에 이 해를 “현대” 난해한 프로그래밍 언어의 기점으로 보기도 한다. Műller가 FALSE를 보고 자극을 받아 컴파일러가 수백 바이트 밖에 되지 않는 언어를 만든 뒤, 그걸 자기가 운영하던 (후에 Aminet이 되는) 아미가 소프트웨어 자료실에 올리면서 널리 알려졌다.
Brainfuck은 뇌엿이 아니라 “사람의 마음을 갖고 놀거나 혼란스럽게 한다”는 뜻의 영어 속어인데,
이름에 fuck이 들어 있어서 BF, Brainf*ck, Brainf*** 등으로 불리기도 한다.
하필 비슷하게 유명한 비펀지(Befunge)와 약자가 겹치기 때문에 파일 확장자를 보통 .bf
가 아닌 .b
로 쓰는 경향이 있다.
브레인퍽은 8가지 문자(+α) 및 7가지 명령만을 인식하는 명령형 언어이다.
C의 while
에 대응하는 단 하나의 제어 구조가 존재한다.
저장 장치는 일정 범위의 정수를 담을 수 있는 테이프가 전부로,
튜링 기계와 마찬가지로 한 번에는 테이프 헤드가 위치한 바로 그 위치만 건드릴 수 있는데 이로부터 튜링 기계와 동일하다는 점을 쉽게 보일 수 있다.
문자 | 설명 |
---|---|
+ | 테이프 헤드가 가리키는 숫자를 1 증가시킨다. |
- | 테이프 헤드가 가리키는 숫자를 1 감소시킨다. |
> | 테이프 헤드를 한 칸 오른쪽으로 옮긴다. |
< | 테이프 헤드를 한 칸 왼쪽으로 옮긴다. |
. | 테이프 헤드가 가리키는 숫자를 ASCII 문자로 해석해서 출력한다. |
, | 문자를 하나 읽어서 그 ASCII 값을 테이프 헤드가 가리키는 위치에 저장한다. 파일의 끝(EOF)에서의 동작은 구현체마다 차이가 있다. |
[…] | 유일한 루프문. 매 번 현재 테이프가 가리키는 숫자(매 루프마다 바뀔 수 있다)가 0인지 아닌지 체크해서, 조건이 만족되면 계속 안에 들어 있는 코드를 실행한다. 당연히 0번 실행될 수도 있다. |
다른 문자들은 기본적으로 주석으로 처리되어 무시된다. 단 다음 문자들은 특수한 의미를 가지는 경우가 있다.
문자 | 설명 |
---|---|
# | 현재 실행 중인 테이프 상태와 코드 위치를 표시하는 디버그 명령으로 흔히 쓰인다. |
! | 코드와 그 코드가 실행될 때 사용할 입력을 구분하는 용도로 쓰인다. 두번째로 나오는 ! 부터는 그냥 입력의 일부이다. 특히 브레인퍽으로 짠 브레인퍽 인터프리터에서 자주 쓰인다. |
이런 문자들 때문에 보통 진짜로 대놓고 코드에 대한 설명을 하고 싶을 경우 몇 가지 잘 쓰이는 방법이 있다.
테이프는 시작할 때 모든 칸이 0으로 채워져 있다. 테이프는 이상적으로는 왼쪽·오른쪽으로 무한하다고 가정하지만, 일부 구현체가 테이프가 유한하고 항상 맨 왼쪽에서 시작한다고 가정하는 경우가 있다. 웬만하면 처음 시작점에서 더 왼쪽으로 가거나, 오른쪽으로 지나치게 많이 가는 경우는 피하는 게 좋다.
이런 단순한 구조와는 달리, 실제로 브레인퍽으로 코드를 짜 보려면 고생이 이만 저만이 아니다. 당장 언어에 기본적인 것 빼고는 아무 것도 없을 뿐만 아니라, 함수가 없어 코드 구조화 자체가 불가능하고 테이프 위치에 따라 같은 코드가 다르게 동작할 수도 있기 때문에 치밀하게 계획할 필요가 있다.