사용자:스니피/작업장: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
2번째 줄: 2번째 줄:


== 개요 ==
== 개요 ==
[[1993년]]에 만들어진 [[난해한 프로그래밍 언어]] Befunge-93, 그리고 여기서 파생된 언어들을 싸잡아 부르는 . 최초 버전인 Befunge-93과 가장 최근 버전인 Funge-98이 유명하다.
[[1998년]]에 만들어진 [[난해한 프로그래밍 언어]]들인 유니펀지(Unefunge), 비펀지(Befunge), 트리펀지(Trefunge)를 통틀어 부르는 이름. 이들의 조상격인 [[1993년]] 사양의 비펀지-93 등도 포함시키기도 한다.


== Befunge-93 ==
공통적인 특징은
최초의 펀지.
*명령어가 '펀지스페이스(Fungespace)'라는 공간에 기록되고, 포인터가 이 안을 돌아다니며 명령을 수행한다는 것,
*자료구조로는 {{ㅊ|일단은}} 스택을 사용한다는 것
*빈 스택에서 자료를 빼면 에러 대신 0을 뱉는다는 것
등이 있다.


제작 의도는 '컴파일이 최대한 어려운 언어를 만드는 것.' 이 과정에서 2차원 프로그래밍이라는 새로운 패러다임을 창조했으며, 이후 많은 [[난해한 프로그래밍 언어]]에 영향을 줬다.
<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이면 포인터의 이동 방향을 오른쪽으로, 아니면 왼쪽으로 설정한다.
|-
| &#124; || 스택에서 값 하나를 빼내고 그 값이 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문 비스무리한 것도 지원했던 것 같지만(...) 시간이 흐르면서 지윈이 끊긴 것으로 보인다.