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

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

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

== 예제 ==
아래 난수 생성기 프로그램은 화살표 명령을 사용해서 명령의 흐름을 바꾸는 방법을 보이고 있다. <code>?</code> 명령은 명령 포인터를 임의의 가로 세로 방향으로 보낸다.
<syntaxhighlight lang="befunge">
 vv  <      <
     2
     ^  v<
  v1<?>3v4
     ^   ^
 >  >?>  ?>5^
     v   v
  v9<?>7v6
     v  v<
     8
  .  >  >   ^
 ^<
</syntaxhighlight>

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

== 같이 보기 ==
* [[4DL (프로그래밍 언어)|4DL]]
* [[Argh!]]
* [[Befreak (프로그래밍 언어)|Befreak]]
* [[PATH (프로그래밍 언어)|PATH]]

== 외부 링크 ==
* [http://quadium.net/funge/spec98.html Funge-98 공식 명세] {{웨이백|url=http://quadium.net/funge/spec98.html |date=20041225010717 }}
* [https://web.archive.org/web/20041228055841/http://www.devlib.org/Programming/Languages/Befunge/index.php devlib.org의 Befunge 자료들]
* [https://web.archive.org/web/20041216095411/http://catseye.mine.nu:8080/ Cat's Eye Technologies]

[[분류:난해한 프로그래밍 언어]]
[[분류:1993년 개발된 프로그래밍 언어]]
[[분류:스택 지향 프로그래밍 언어]]
[[분류:영어 기반이 아닌 프로그래밍 언어]]