비펀지

스택 기반의 난해한 프로그래밍 언어

비펀지(Befunge)는 스택 기반의 난해한 프로그래밍 언어로, 기존의 프로그래밍 언어들과는 다르게 프로그램이 2차원 공간 상에 배열되어 있다. "화살표" 명령들은 명령의 흐름을 왼쪽, 오른쪽, 위, 아래로 향하게 하고, 반복문은 명령의 흐름을 원 모양으로 만들어서 구성된다.

역사

편집

원래 비펀지는 1993년에 크리스 프레시(Chris Pressey)가 가능한 한 컴파일이 어려운 프로그래밍 언어를 고안하려는 시도로 만든 언어이다. 따라서 비펀지는 자기 수정 프로그램을 만들 수 있도록 설계되었으며, gp 명령을 제공한다. 그럼에도 불구하고, 나중에 몇 개의 컴파일러가 만들어졌다. 처음 만들어진 언어를 Befunge-93이라 하며 그 이후에 만들어진 확장도 존재하는데, 여기에는 코드 공간을 다차원으로 확장하고 멀티쓰레딩, 즉 같은 공간 안에서 여러 명령 포인터가 동시에 존재할 수 있는 Funge-98이 포함된다. 비펀지 확장들과 변형들은 Fungeoid 또는 펀지(Funge)라고 보통 불린다.

처음 명세는 올바른 비펀지 프로그램을 가로 80 글자와 세로 25 글자 크기의 공간으로 제한하였다. Befunge-93 프로그램은 단지 하나의 스택만을 가질 수 있고 저장 공간이 제한되어 있기 때문에, 원래 Befunge-93 언어는 튜링 완전하지 않다. Funge-98 확장은 튜링 완전성을 위해, 명령들이 스택을 로 사용할 수 있도록 재정의하는 ‘큐 모드’를 비롯한 ‘모드’라는 개념을 추가하였다. 또한 Funge-98 프로그램들은 제한 없이 확장될 수 있다. Befunge-93과 같이 80칸 위치에서 반대편으로 넘어가는 대신, Funge-98 명령 포인터는 코드 공간이 마치 원환체처럼 구성되었으며 여전히 실제로 사용되는 영역은 임의로 확장될 수 있는, 크리스 프레시가 ‘Lahey-space’라고 명명한 규칙을 따른다.

예제

편집

아래 난수 생성기 프로그램은 화살표 명령을 사용해서 명령의 흐름을 바꾸는 방법을 보이고 있다. ? 명령은 명령 포인터를 임의의 가로 세로 방향으로 보낸다.

 vv  <      <
     2
     ^  v<
  v1<?>3v4
     ^   ^
 >  >?>  ?>5^
     v   v
  v9<?>7v6
     v  v<
     8
  .  >  >   ^
 ^<

명령 목록

편집
명령 설명
0-9 해당하는 숫자를 스택에 넣는다.
+ 덧셈: ab를 순서대로 꺼낸 후, a+b를 넣는다.
- 뺄셈: ab를 순서대로 꺼낸 후, b-a를 넣는다.
* 곱셈: ab를 순서대로 꺼낸 후, a*b를 넣는다.
/ 정수 나눗셈: ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다. a가 0이라면 사용자에게 연산의 결과를 묻는다.
% 나머지: ab를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지를 넣는다. a가 0이라면 사용자에게 연산의 결과를 묻는다.
! 논리 부정: 숫자를 꺼내서 그 값이 0이면 1을 넣고, 아니면 0을 넣는다.
` 비교: ab를 순서대로 꺼낸 후, b>a이면 1을 넣고, 아니면 0을 넣는다.
> 명령 포인터를 오른쪽으로 움직이게 한다.
< 명령 포인터를 왼쪽으로 움직이게 한다.
^ 명령 포인터를 윗쪽으로 움직이게 한다.
v 명령 포인터를 아랫쪽으로 움직이게 한다.
? 명령 포인터를 임의의 가로 세로 방향으로 움직이게 한다.
_ 숫자를 꺼낸 후, 그 값이 0이면 명령 포인터가 오른쪽으로, 아니면 왼쪽으로 움직이게 한다.
| 숫자를 꺼낸 후, 그 값이 0이면 명령 포인터가 아랫쪽으로, 아니면 윗쪽으로 움직이게 한다.
" 문자열 모드를 시작한다; 다음 "가 나올 때까지 나오는 모든 문자의 ASCII 값을 넣는다.
: 스택의 꼭대기에 있는 값을 복제한다.
\ 스택의 꼭대기에 있는 두 값의 위치를 교환한다.
$ 스택에서 숫자를 꺼낸다.
. 숫자를 꺼낸 후 그 숫자를 문자열로 출력한다.
, 숫자를 꺼낸 후 그 숫자에 해당하는 ASCII 문자를 출력한다.
# 트램폴린(Trampoline): 다음 명령을 무시한다.
g yx를 순서대로 꺼낸 후, 프로그램의 (x, y) 위치에 있는 문자의 ASCII 값을 넣는다.
p yx, v를 순서대로 꺼낸 후, 프로그램의 (x, y) 위치에 있는 문자를 v에 해당하는 ASCII 문자로 바꾼다.
& 사용자에게 숫자를 입력받고 그 값을 넣는다.
~ 사용자에게 문자를 입력받고 그 ASCII 값을 넣는다.
@ 프로그램을 종료한다.

같이 보기

편집

외부 링크

편집