비번지
Befunge개발자 | 크리스 프레시 |
---|---|
처음 등장한 | 1993년 |
웹 사이트 | catseye |
영향을 받다 | |
넷째, FALSE |
Befunge는 2차원 스택 기반의 반사형 난해한 프로그래밍 [1]언어입니다.프로그램이 2차원 그리드 상에 배치된다는 점에서 기존 언어와 다르다."화살표" 명령은 제어 흐름을 왼쪽, 오른쪽, 위 또는 아래로 향하게 하며, 루프는 제어 흐름을 사이클로 전송하여 구성됩니다.그것은 "Fourth와 Lemmings의 교배"[2]로 묘사되어 왔다.
INTERCAL에 적합한 어패밀리입니다.직선의 제어 흐름이라는 상투적인 한계를 벗어나 이국적인 토폴로지를 가진 다차원을 통과하는 프로그램 카운터를 수용하는 컴퓨터 언어 패밀리입니다.
--
역사
이 언어는 1993년 크리스 프레시에[4] 의해 가능한 한 컴파일하기 어려운 언어를 고안하기 위한 시도로 아미가족을 위해 만들어졌다.주의:p
명령어를 사용하면, 자기 인식 코드를 사용할 수 있습니다.그럼에도 불구하고 다수의 컴파일러가 그 후에 작성되었습니다.원래의 "Befunge-93" 사양에 대한 많은 확장도 존재하며, 특히 Funge-98은 개념을 임의의 수의 차원으로 확장하고 여러 명령 포인터를 같은 공간에서 동시에 동작시키는 멀티스레드가 가능하다.비번지 확장과 변형은 펑가이드 또는 그냥 펑크라고 불립니다.
Befunge-93 사양은 각 유효한 프로그램을 수평으로 25개의 명령으로 구성된 80개의 명령 그리드로 수직 방향으로 제한합니다.이 제한을 초과하는 프로그램 실행은 그리드의 반대편에서 해당하는 포인트로 "뒤집기"됩니다. Befunge 프로그램은 위상적으로 토러스와 동일합니다.Befunge-93 프로그램은 단일 스택만 가질 수 있고 스토리지 배열이 한정되어 있기 때문에 Befunge-93 언어는 튜링 완전하지 않습니다(단, Befunge-93은 무제한 스택 워드 [5]크기를 가진 튜링 완전입니다).이후 Funge-98 사양은 프로그램의 크기 제한을 제거함으로써 튜링의 완성도를 제공합니다.Funge-98 명령 포인터의 이동은 고정된 제한으로 둘러싸이는 것이 아니라, 원래 모델인 Chris Lahey의 이름을 따서 "Lahey-space"라고 불리는 모델을 따릅니다.이 모델에서 그리드는 래핑에 관해 유한 크기의 토러스처럼 동작하면서도 무한히 확장할 수 있습니다.
어원학
Befunge라는 단어는 'before'라는 단어가 [citation needed]의도된 온라인 토론의 오타에서 유래되었다.
편수
앞서 말한 바와 같이 Befunge의 디자인 목표는 컴파일하기 어려운 언어를 만드는 것이었습니다.이것은 자기 수정 코드('p' 명령은 플레이필드에 새로운 명령을 쓸 수 있음)와 다차원 플레이필드(같은 명령이 4가지 다른 방향으로 실행될 수 있음)의 구현으로 시도되었다.
그럼에도 불구하고 이러한 장애물은 어느 정도 극복되었으며 Befunge 컴파일러는 적절한 기술을 사용하여 작성되었습니다.
표준 Befunge-93 배포판에 포함된 bef2c 컴파일러는 스레드 코드를 사용합니다.각 명령어는 C 코드의 스니펫으로 컴파일되며 제어는 Befunge 인터프리터에서와 마찬가지로 스니펫을 통해 흐릅니다(즉, 조건부로 '방향 레지스터'의 값에 따라).이것은 훌륭한 통역사보다 큰 이점을 가져다 주지 못한다.bef2c 컴파일러는 'p' 모드도 문자열 모드도 처리하지 않기 때문에 정확하지 않지만, 그렇게 하는 것이 불가능하지는 않습니다(단, C 언어는 이 작업에 적합하지 않을 수 있습니다).
예를 들어, Betty 컴파일러는 가능한 모든 직선의 명령을 하위 프로그램으로 취급하며, 'p' 명령이 하위 프로그램을 변경하면 해당 하위 프로그램이 다시 컴파일됩니다.이는 적시 컴파일에 대한 흥미로운 변화이며, '방향' 레지스터에 개입하지 않고 많은 명령을 네이티브 코드로 실행할 수 있기 때문에 인터프리터보다 훨씬 더 나은 이점을 얻을 수 있습니다.
샘플 Befunge-93 코드
화살표를 사용하여 제어 흐름을 변경하는 기술은 아래 난수 발생기 프로그램에 나와 있습니다.Befunge 명령 포인터는 왼쪽 상단 모서리에서 시작하여 리디렉션되지 않으면 오른쪽으로 이동합니다.화살표를 따라,?
명령어는 포인터가 디지트에 닿을 때까지 명령 포인터를 임의의 기본 방향으로 전송하여 스택에 푸시합니다.그런 다음 화살표는 로 이동합니다..
스택에서 숫자를 출력하고 포인터를 첫 번째 방향 랜덤라이저로 반환합니다.거기에는 없다@
이 프로그램을 종료하기 위해 1부터 9까지의 무한 난수 스트림을 생성합니다.
v>>>>v 12345 ^?^ > ? ?^ v?v 6789 >>>> v ^ .< >
다음 코드는 고전적인 "Hello World!" 프로그램의 예입니다.먼저 "olle"이라는 글자가H"는 ASCII 번호로 스택에 푸시됩니다.그런 다음 LIFO 순서로 스택에서 팝업되어 텍스트 문자로 출력되어 "Hello"를 표시합니다.공백은 ASCII에서 문자 번호 32로, 여기서 4와 8을 곱하여 구성되며 텍스트로 출력됩니다.그런 다음 나머지 코드도 유사한 방법으로 "월드!"를 출력한 후 ASCII 문자 10(라인 피드 문자, 출력 커서를 새 라인으로 이동)을 출력합니다.
> v v ,,,,,"안녕하세요"< > >48*, v v,,,,,,"세상!"< > >25*,@
다음 코드는 조금 더 복잡한 버전입니다.ASCII 문자 10(라인 피드 문자)을 스택에 추가한 후!dlrow , olleH 를 스택에 푸시합니다.LIFO 주문은 "H"가 스택의 맨 위에 있고 첫 번째 인쇄가 되고 "e"가 두 번째 인쇄가 되는 것을 의미합니다.문자를 인쇄하기 위해 프로그램은 처음에 스택의 상위 값을 복제하는 루프를 시작합니다(따라서 스택은 "\n!dlrow,olleHH"처럼 보입니다).그런 다음 "_" 연산은 중복된 값을 팝업하고 0이면 오른쪽으로, 그렇지 않으면 왼쪽으로 이동합니다.(이것은, 빈 스택을 팝 했을 때에 「0」을 반환하는 준거 인터프리터를 전제로 하고 있습니다).왼쪽 방향으로 이동하면 위쪽 값이 ASCII 문자로 팝업 및 인쇄됩니다.그런 다음 다음 다음 문자를 복제하고 "_" 테스트로 루프백하여 스택의 나머지 부분이 비워질 때까지 인쇄를 계속합니다. 따라서 다음 팝업 값이 0이 됩니다. 이때 "@"은 프로그램을 종료합니다.
>25*"! dlrow , olleH":v v:,_@ > ^
Befunge-93 명령어리스트
0-9 | 스택에 이 번호 푸시 |
+ | 추가:a와 b를 팝하고 a+b를 누른다. |
- | 감산:a와 b를 터트리고 b-a를 누르세요. |
* | 곱셈:a와 b를 터트린 후 a*b를 누릅니다. |
/ | 정수 나눗셈:a와 b를 터트린 다음 b/a를 눌러 0을 향해 반올림합니다. |
% | modulo: a와 b를 팝한 다음 b/a의 정수 나눗셈의 나머지를 누른다. |
! | 논리적 NOT: 값을 팝합니다.값이 0이면 1을 누르고, 그렇지 않으면 0을 누릅니다. |
` | 다음보다 큼:a와 b를 팝한 후 b>a이면 1을 누르고, 그렇지 않으면 0을 누릅니다. |
> | 오른쪽으로 움직이기 시작하다 |
< | 왼쪽으로 이동 시작 |
^ | 위로 이동 시작 |
v | 아래로 이동 시작 |
? | 임의의 기본 방향으로 이동하기 시작합니다. |
_ | 값을 팝합니다. 값이 0이면 오른쪽으로 이동하고, 그렇지 않으면 왼쪽으로 이동합니다. |
| 값을 팝합니다. 값이 0이면 아래로 이동하고, 그렇지 않으면 위로 이동합니다. |
" | Start string mode: 각 문자의 ASCII 값을 다음 문자까지 푸시합니다." |
: | 스택 상단에 중복된 값 |
\ | 스택 상단의 2개의 값을 스왑합니다. |
$ | 스택에서 값을 팝하여 폐기합니다. |
. | pop 값 및 출력 뒤에 공백이 있는 정수 |
, | 팝 값 및 ASCII 문자로 출력 |
# | 브리지: 다음 셀 건너뛰기 |
p | 「푸트」콜(나중에 사용하기 위해서 값을 보존하는 방법).y, x 및 v를 팝한 다음 프로그램의 (x,y)에 있는 문자를 ASCII 값이 v인 문자로 변경합니다. |
g | 「취득」콜(스토리지내의 데이터를 취득하는 방법).y와 x를 팝한 다음 프로그램의 해당 위치에 문자의 ASCII 값을 푸시합니다. |
& | 사용자에게 번호를 요청하고 푸시합니다. |
~ | 사용자에게 문자를 요청하고 해당 ASCII 값을 푸시합니다. |
@ | 프로그램 종료 |
(스페이스) | 수술 안 해 아무것도 안 해 |
대부분의 1차원 프로그래밍 언어에는 코멘트 텍스트와 소스 코드의 구문적인 구분이 필요합니다.단, 그 구분이 Brainfuck의 규칙처럼 사소한 것일 수도 있습니다.+-[]<>,.
댓글입니다.Lisp 및 Python과 같은 언어는 값이 사용되지 않는 컨텍스트에서 문자열을 주석으로 처리합니다.마찬가지로 Befunge에서는 코드에 문서를 포함시키기 위해 프로그래머는 단순히 제어 흐름을 "댓글" 영역 주위에 라우팅하여 해당 영역의 텍스트가 실행되지 않도록 합니다.
아현빈의 퀴네
>:# 0# \# g# , # 1 # + # : # 5 # 9 # * # - # _ @ Quine
「 」를 참조해 주세요.
레퍼런스
- ^ "Befunge - Esolang".
- ^ "The Befunge FAQ v.4". 1997-11-04. Archived from the original on 2001-04-17. Retrieved 2014-01-23.
- ^ Raymond, Eric (2003-12-29). "The Jargon File 4.4.7". Jargon File Text Archive. Archived from the original on 2016-01-05. Retrieved 2012-01-16.
- ^ Ais523 (2008-12-18). "Chris Pressey". Esolang. Retrieved 2014-01-23.
- ^ Oerjan (2014-01-18). "Talk:Befunge". Esolang. Retrieved 2014-01-23.