비펀지
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
비펀지는 1993년 크리스 프레시에가 창조한 난해한 프로그래밍 언어이다. 프로그램의 자기 수정 능력을 강조하며, 2차원 격자 구조에서 실행되고 스택 기반 언어이다. 비펀지-93 이후 Funge-98과 같은 확장 버전이 등장했고, 펀지오이드 또는 펀지라고 불리는 다양한 변형을 낳았다. 비펀지 프로그램은 산술, 논리 연산, 제어 흐름 변경, 스택 및 메모리 조작 명령을 사용하며, 자기 수정 코드와 다차원 플레이 필드 사용으로 컴파일 과정이 복잡하다. 한국에서는 난해한 프로그래밍 언어 연구와 프로그래밍 교육 도구로 활용될 수 있다.
더 읽어볼만한 페이지
- 스택 지향 프로그래밍 언어 - 포스트스크립트
어도비 시스템즈에서 개발한 포스트스크립트는 페이지 기술 언어이자 튜링 완전한 프로그래밍 언어로서, 데스크톱 출판 혁명을 이끌고 인쇄 기술 발전에 기여했으며, PDF 형식의 기반이 되었다. - 스택 지향 프로그래밍 언어 - 포스 (프로그래밍 언어)
포스는 1958년 찰스 무어가 개발한 스택 기반, 역폴란드 표기법을 사용하는 프로그래밍 언어이며, 임베디드 시스템 등 다양한 분야에서 활용되었고, 1994년 ANSI 표준으로 제정되었다. - 영어 기반이 아닌 프로그래밍 언어 - 두리틀 (프로그래밍 언어)
두리틀은 다국어 지원, 터틀 그래픽스 기반 직관적인 프로그래밍, 충돌 감지, 음악 지원, 프로토타입 기반 객체 지향 특징을 갖춘, 레고 조립 방식의 쉬운 프로그래밍 언어로서 다양한 운영체제와 웹 브라우저를 지원한다. - 영어 기반이 아닌 프로그래밍 언어 - 말레볼제
말레볼제는 극도로 난해한 프로그래밍 언어로서 복잡한 문법과 자기 수정 특성을 가지며, 삼진법 가상 머신 기반으로 8개의 명령어와 세 개의 레지스터를 사용하고 59,049개의 메모리 공간을 가지지만 튜링 불완전성을 극복하기 위한 변종들이 개발되고 있으며, 프로그램 난독화나 암호 시스템 연구 등에 활용되나 극심한 난해함으로 인해 실용성은 낮다는 비판을 받지만, 컴퓨터 과학 분야에서 언어 설계의 극단적인 예시를 제시하며 프로그래밍 언어의 복잡성에 대한 이해를 높이는 데 기여한다. - 1993년 개발된 프로그래밍 언어 - 루아 (프로그래밍 언어)
루아는 C 언어와의 통합이 용이하고 작고 가벼운 확장 가능한 스크립트 언어로, 테이블 기반의 자료 구조를 통해 다양한 프로그래밍 패러다임을 지원하며 여러 분야에서 활용된다. - 1993년 개발된 프로그래밍 언어 - 비주얼 베이직 포 애플리케이션
비주얼 베이직 포 애플리케이션(VBA)은 마이크로소프트 오피스 제품군 등에서 매크로 생성 및 자동화 작업을 위해 사용되는 프로그래밍 언어로서, 여러 응용 프로그램에서 자동화 솔루션 구축, 오피스 프로그램 기능 확장, 사용자 정의 함수 제작, 다른 응용 프로그램과의 통합 등에 활용되며 보안 문제도 포함한다.
비펀지 - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
설계자 | 크리스 프레시 |
출시일 | 1993년 |
영향을 받은 언어 | 포스, FALSE |
일반 정보 | |
유형 | 2차원 난해한 프로그래밍 언어 |
2. 역사
비펀지는 1993년에 크리스 프레시가 가능한 한 컴파일하기 어려운 프로그래밍 언어를 고안하려는 시도로 만든 언어이다.[3] 비펀지는 `g`와 `p` 명령을 통해 자기 수정 프로그램을 만들 수 있도록 설계되었다.[3] 그럼에도 불구하고, 나중에 몇 개의 컴파일러가 만들어졌다. 처음 만들어진 언어를 '''Befunge-93'''이라 하며, 그 이후에 코드 공간을 다차원으로 확장하고 멀티쓰레딩을 지원하는 Funge-98과 같은 확장도 등장했다. 비펀지 확장들과 변형들은 Fungeoid 또는 펀지(Funge)라고 불린다.
'''비펀지'''라는 단어는 온라인 토론에서 'before'라는 단어를 입력하려다 발생한 오타에서 유래했다.
비펀지 프로그램은 2차원 격자 구조에서 실행된다. 프로그램 실행은 격자의 좌상단(0행 0열)에서 시작하여 오른쪽 방향으로 진행된다.[3] 격자의 각 칸에는 명령어가 들어 있으며, 명령어 포인터가 이 칸에 도달하면 해당 명령어가 실행된다.
1993년에 크리스 프레시(Chris Pressey)는 컴파일이 최대한 어려운 프로그래밍 언어를 만들고자 비펀지를 고안했다.[3] 이를 위해 비펀지는 자기 수정 프로그램을 만들 수 있도록 설계되었으며, `p` 명령어를 통해 플레이 필드에 새로운 명령을 쓸 수 있도록 했다. 또한, 다차원 플레이 필드를 통해 동일한 명령을 네 가지 다른 방향으로 실행할 수 있도록 하여 컴파일을 더욱 어렵게 만들었다.
befunge
[1]
웹사이트
Befunge – Esolang
https://esolangs.org[...]
Befunge-93은 프로그램을 가로 80 글자와 세로 25 글자 크기의 공간으로 제한했다. Befunge-93 프로그램은 단 하나의 스택만을 가질 수 있고 저장 공간이 제한되어 튜링 완전하지 않지만,[4] 무제한 스택 워드 크기를 통해 튜링 완전성을 가질 수 있음이 증명되었다. Funge-98 확장은 튜링 완전성을 위해, 명령들이 스택을 큐로 사용할 수 있도록 재정의하는 ‘큐 모드’를 비롯한 ‘모드’라는 개념을 추가하였다. 또한 Funge-98 프로그램들은 제한 없이 확장될 수 있다. Befunge-93과 같이 80칸 위치에서 반대편으로 넘어가는 대신, Funge-98 명령 포인터는 코드 공간이 마치 원환체처럼 구성되었으며 여전히 실제로 사용되는 영역은 임의로 확장될 수 있는, 크리스 프레시가 ‘Lahey-space’라고 명명한 규칙을 따른다.
3. 어원
4. 언어 사양
프로그램 실행 중 가장자리에 도달하면, 반대쪽 가장자리로 이동한다. 예를 들어, 오른쪽 가장자리에 도달하면 왼쪽 가장자리로, 아래쪽 가장자리에 도달하면 위쪽 가장자리로 이동한다.[4]
비펀지는 정수를 저장하는 스택을 사용하여 연산을 수행한다. 이 스택은 명령어의 인자를 전달하거나, 명령어의 실행 결과를 저장하는 데 사용된다.
5. 명령 목록
명령 설명 0-9
해당하는 숫자를 스택에 넣는다. +
덧셈: a와 b를 순서대로 꺼낸 후, a+b를 넣는다. -
뺄셈: a와 b를 순서대로 꺼낸 후, b-a를 넣는다. *
곱셈: a와 b를 순서대로 꺼낸 후, a*b를 넣는다. /
정수 나눗셈: a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 몫을 넣는다. a가 0이라면 사용자에게 연산의 결과를 묻는다. %
나머지: a와 b를 순서대로 꺼낸 후, 정수 나눗셈 b/a의 나머지를 넣는다. a가 0이라면 사용자에게 연산의 결과를 묻는다. !
논리 부정: 숫자를 꺼내서 그 값이 0이면 1을 넣고, 아니면 0을 넣는다. `
비교: a와 b를 순서대로 꺼낸 후, b>a이면 1을 넣고, 아니면 0을 넣는다. >
명령 포인터를 오른쪽으로 움직이게 한다. <
명령 포인터를 왼쪽으로 움직이게 한다. ^
명령 포인터를 윗쪽으로 움직이게 한다. v
명령 포인터를 아랫쪽으로 움직이게 한다. ?
명령 포인터를 임의의 가로 세로 방향으로 움직이게 한다. _
숫자를 꺼낸 후, 그 값이 0이면 명령 포인터가 오른쪽으로, 아니면 왼쪽으로 움직이게 한다. 숫자를 꺼낸 후, 그 값이 0이면 명령 포인터가 아랫쪽으로, 아니면 윗쪽으로 움직이게 한다. "
문자열 모드: 다음 "
가 나올 때까지 나오는 모든 문자의 ASCII 값을 넣는다.:
스택의 꼭대기에 있는 값을 복제한다. \
스택의 꼭대기에 있는 두 값의 위치를 바꾼다. $
스택에서 숫자를 꺼낸다. .
숫자를 꺼낸 후 그 숫자를 문자열로 출력한다. ,
숫자를 꺼낸 후 그 숫자에 해당하는 ASCII 문자를 출력한다. #
트램폴린: 다음 명령을 무시한다. g
y와 x를 순서대로 꺼낸 후, 프로그램의 (x, y) 위치에 있는 문자의 ASCII 값을 넣는다. p
y와 x, v를 순서대로 꺼낸 후, 프로그램의 (x, y) 위치에 있는 문자를 v에 해당하는 ASCII 문자로 바꾼다. &
사용자에게 숫자를 입력받고 그 값을 넣는다. ~
사용자에게 문자를 입력받고 그 ASCII 값을 넣는다. @
프로그램을 종료한다.
6. 컴파일
그럼에도 불구하고, 이러한 어려움은 어느 정도 극복되었으며, 적절한 기술을 사용하여 비펀지 컴파일러가 작성되었다.
표준 비펀지-93 배포판에 포함된 bef2c 컴파일러는 스레드 코드를 사용한다. 각 명령은 C 코드 조각으로 컴파일되며, 제어 흐름은 비펀지 인터프리터에서와 같이 (즉, '방향' 레지스터의 값에 따라) 조각을 통해 흐른다. bef2c 컴파일러는 'p' 명령이나 문자열 모드를 처리하지 않지만, 이를 처리하도록 만드는 것이 불가능한 것은 아니다.
etty 컴파일러는 JIT 컴파일 방식을 사용한다. 가능한 모든 직선 명령을 서브 프로그램으로 취급하며, 'p' 명령이 해당 서브 프로그램을 변경하면 해당 서브 프로그램이 다시 컴파일된다. 이 방식은 인터프리터에 비해 훨씬 더 나은 이점을 제공하는데, 많은 명령을 '방향' 레지스터에 대한 중간 결정 없이 네이티브 코드에서 실행할 수 있기 때문이다.
7. 프로그램 예제
vv < <
2
^ v<
v1>3v4
^ ^
> >?> ?>5^
v v
v9>7v6
v v<
8
. > > ^
^<
```
위 코드는 화살표 명령(<
, >
, ^
, v
)을 사용하여 명령의 흐름을 바꾼다. ?
명령은 명령 포인터를 임의의 가로 또는 세로 방향으로 보낸다. 이 프로그램은 1에서 9까지의 난수를 무한히 생성한다.[1]
```befunge
v>>>>>v
12345
^?^
> ? ?^
v?v
6789
>>>> v
^ .<
```
위 코드는 화살표를 따라가면서, ?
명령어를 통해 포인터가 숫자에 도달할 때까지 임의의 방향으로 이동하여 스택에 넣는다. 그 후 화살표는 .
으로 이동하여 스택에서 숫자를 출력하고, 포인터를 첫 번째 방향 임의 생성기로 되돌린다. 이 프로그램은 종료 명령(@
)이 없으므로 무한히 실행된다.[1]
```befunge
> v
v ,,,,,"Hello"<
>48*, v
v,,,,,,"World!"<
>25*,@
```
위 코드는 "Hello, World!"를 출력하는 고전적인 프로그램이다. 먼저 "olleH" 문자를 ASCII 숫자로 스택에 넣는다. 그런 다음 후입선출 순서로 스택에서 꺼내 텍스트 문자로 출력하여 "Hello"를 만든다. 공백은 ASCII에서 32번 문자이며, 4와 8을 곱하여 만든 후 출력한다. 나머지 코드는 "World!"를 출력하고, ASCII 문자 10(줄 바꿈 문자)을 출력한다.[1]
```befunge
>25*"!dlrow ,olleH":v
v:,_@
> ^
```
위 코드는 좀 더 복잡한 "Hello, World!" 출력 프로그램이다. ASCII 문자 10(줄 바꿈 문자)을 스택에 추가한 다음 "!dlrow ,olleH"를 스택에 넣는다. 후입선출 순서에 따라 "H"가 스택 맨 위에 오고, 먼저 출력된다. 프로그램은 루프에 들어가 스택 맨 위 값을 복제하고, _
연산은 복제된 값을 꺼내 0이면 오른쪽, 아니면 왼쪽으로 이동한다. 왼쪽으로 가면 스택 맨 위 값을 ASCII 문자로 출력한다. 이 과정을 반복하여 스택이 빌 때까지 문자를 출력하고, 프로그램이 종료된다.[1]
5! (팩토리얼):
5! = 5 × 4 × 3 × 2 × 1 = 120
참조
[2]
웹사이트
The Befunge FAQ v.4
http://cantor.res.cm[...]
1997-11-04
[3]
웹사이트
Chris Pressey
http://esolangs.org/[...]
2008-12-18
[4]
웹사이트
Talk:Befunge
http://esolangs.org/[...]
2014-01-18
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com