영어: Funge
개요
1998년에 만들어진 난해한 프로그래밍 언어들인 유니펀지(Unefunge), 비펀지(Befunge), 트리펀지(Trefunge)를 통틀어 부르는 이름. 이들의 조상격인 1993년 사양의 비펀지-93 등도 포함시키기도 한다.
공통적인 특징은
- 명령어가 '펀지스페이스(Fungespace)'라는 공간에 기록되고, 포인터가 이 안을 돌아다니며 명령을 수행한다는 것,
- 자료구조로는
일단은스택을 사용한다는 것 - 빈 스택에서 자료를 빼면 에러 대신 0을 뱉는다는 것
등이 있다.
>78*vD
v$_#>vN
7#!@ A
3 :v??v
9,-""""
4+1ACGT
+,,""""
>^^<<<<
대략 이딴 이런 식으로 코딩한다.
비펀지-93
최초의 펀지. "컴파일이 최대한 어려운 언어"를 지향점으로 설계되었으며, 그 결과 최초의 2차원 프로그래밍 언어가 되었다(...) 이후 여러 난해한 프로그래밍 언어들에 영향을 주었다.
펀지스페이스의 크기는 80*25로 제한되어있으며, 포인터는 오른쪽, 왼쪽, 위, 아래의 네 방향으로만 움직일 수 있다. 다음과 같은 명령어를 지원한다.
명령어 | 설명 |
---|---|
+ | 스택에서 두 값 a, b를 차례로 빼내고, a+b를 집어넣는다. |
- | 스택에서 두 값 a, b를 차례로 빼내고, b-a를 집어넣는다. |
* | 스택에서 두 값 a, b를 차례로 빼내고, a*b를 집어넣는다. |
/ | 스택에서 두 값 a, b를 차례로 빼내고, b/a의 몫을 집어넣는다. a가 0이면 무슨 값을 넣을지 사용자에게 묻는다. |
% | 스택에서 두 값 a, b를 차례로 빼내고, b/a의 나머지를 집어넣는다. a가 0이면 b를 집어넣는다. |
! | 스택에서 값 하나를 빼내고 그 값이 0이면 1을, 아니면 0을 집어넣는다. |
` | 스택에서 두 값 a, b를 차례로 빼내고, b>a면 1을, 아니면 0을 집어넣는다. |
> | 포인터의 이동 방향을 오른쪽으로 설정한다. |
< | 포인터의 이동 방향을 왼쪽으로 설정한다. |
^ | 포인터의 이동 방향을 위로 설정한다. |
v | 포인터의 이동 방향을 아래로 설정한다. |
? | 포인터의 이동 방향을 임의로 설정한다. |
_ | 스택에서 값 하나를 빼내고 그 값이 0이면 포인터의 이동 방향을 오른쪽으로, 아니면 왼쪽으로 설정한다. |
| | 스택에서 값 하나를 빼내고 그 값이 0이면 포인터의 이동 방향을 아래로, 아니면 위로 설정한다. |
" | 일명 문자열 모드. 다음 "가 나올 때까지 포인터가 이동하며 만난 문자들의 ASCII 값을 순서대로 스택에 집어넣는다. |
: | 스택 맨 위의 값을 복제한다. |
\ | 스택 맨 위의 두 값의 자리를 바꾼다. |
$ | 스택 맨 위의 값을 빼내서 버린다. |
. | 스택 맨 위의 값을 빼내서 정수로 출력한다. |
, | 스택 맨 위의 값을 빼내서 문자로 출력한다. |
# | 다음 명령어를 무시한다. |
g | 스택에서 두 값 y, x를 차례로 빼내고, 펀지스페이스의 좌표 (x, y)에 있는 문자의 ASCII 값을 스택에 집어넣는다. 그런 좌표가 없을 경우, 스택에 0을 집어넣는다. |
p | 스택에서 세 값 y, x, v를 차례로 빼내고, 펀지스페이스의 좌표 (x, y)에 있는 문자를 ASCII 값이 v인 문자로 설정한다. |
& | 정수를 입력받아서 그 값을 스택에 집어넣는다. |
~ | 문자를 입력받아서 그 ASCII 값을 스택에 집어넣는다. |
@ | 프로그램을 종료한다. |
0~9 | 대응하는 수를 스택에 집어넣는다. |
펀지-98
펀지의 최종 진화형. 상기했듯 유니펀지, 비펀지, 트리펀지라는 세 언어로 이루어져있으며, 각각 1차원, 2차원, 3차원 프로그래밍 언어이다. 이와 같은 방식으로 n차원의 Nefunge를 만들수도 있다고(...) 정신이 아득해진다
비펀지-93에서 달라진 점은
- 펀지스페이스의 크기가 사실상 무제한이 되었다.
- 포인터가 상하좌우가 아닌 다른 방향으로도 움직일 수 있다(!)
- 다룰 수 있는 스택의 수가 늘었다. 이 스택들은 하나의 스택 스택에 들어있다(...)
- 파일 입출력을 지원
- 멀티스레딩을 지원
- 잡다한 명령어 추가
그 외에 Fingerprint라는 방식으로 Python의 import문 비스무리한 것도 지원했던 것 같지만(...) 시간이 흐르면서 지윈이 끊긴 것으로 보인다.