Skip to content

Instantly share code, notes, and snippets.

@dittos
Created August 6, 2012 13:55
Show Gist options
  • Save dittos/3274591 to your computer and use it in GitHub Desktop.
Save dittos/3274591 to your computer and use it in GitHub Desktop.

bf2aheui

명령어 번역

테이프

ㄱ, ㄴ 두 개의 스택을 사용하여 테이프를 구현한다.

<--    v    -->
a .. b c d .. e
|  ㄱ  | | ㄴ |

a: ㄱ 스택의 맨 아래
c: ㄱ 스택의 맨 위 (= 항상 현재 위치)
d: ㄴ 스택의 맨 위
e: ㄴ 스택의 맨 아래
  • <: c를 ㄴ 스택의 맨 위로 옮기면(삭싼) b가 현재 위치가 됨.
  • >: d를 ㄱ 스택의 맨 위로 옮기면(산싹) d가 현재 위치가 됨.

단, 아직 접근한 적 없는 곳으로 데이터 포인터를 이동하려 하면 값을 0으로 초기화 해주어야 한다. 이때 아희의 stack underflow 처리 동작(반대 방향으로 움직임)을 이용한다. 따라서 <샥바싼, >샨바싹으로 변환할 수 있다.

그리고 실행 전에 현재 포인터가 가리키는 값을 0으로 초기화(삭바)한다.

증감 연산

  • : ㄱ 스택을 선택.
  • 밪반타: 1을 만든다.
  • 또는 : 각각 +, -

입출력

  • .: 삭빠맣 (ㄱ 선택, 중복, 문자 출력)
  • ,: 삭바밯 (ㄱ 선택, 뽑기, 문자 읽기)

루프

삭뺘우차(루프 몸통)

에서 스택 맨 위의 값이 0이면 로 가서 루프를 탈출한다. 그리고 0이 아니면 루프 몸통으로 진입, 루프 몸통의 끝에 가면 wrapping되어 다시 루프를 실행한다.

루프가 중첩될 경우 코드를 어떻게 배치할지가 관건일 듯.

최적화

위에는 변환을 간단하게 하기 위해 모든 코드 조각을 스택 선택 명령으로 시작했지만, 스택을 굳이 바꾸지 않아도 되는 경우가 대부분일 것이다.

필요없는 경우에 스택 선택 명령을 생략하면 코드 크기가 줄어들 것임.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment