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