사용자:스니피/작업장/펀지

영어: 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문 비스무리한 것도 지원했던 것 같지만(...) 시간이 흐르면서 지윈이 끊긴 것으로 보인다.