재가 쓸게 별로 없어서 해석을 했거든요. 잘 봐 주시기 바랍니다.
Whirl 프로그래밍언어
1.이 프로그래밍 언어에서 주어진 것은, 오퍼레이션 링과 그에 달린 하나의 숫자(모든 정수 다 됨), 수학 링과 그에 달린 하나의 숫자(모든 정수 다 됨), 무한한 메모리(하나의 메모리 칸에는 하나의 정수를 넣을 수 있다.) 그리고 두 개의 명령어 1과 0이다.
2.명령어 휠에는 두 가지 명령어가 있다. 1과 0이다. 1 => 정해진 방향으로 정해진 링을 1칸 돌린다. 0 => 링을 돌리는 방향을 반대로 한다. 만약 뒤에 0이 있다면, 지금 링의 명령어를 실행하고, 링을 교체한다.(수학 링이면 오퍼레이션 링으로, 오퍼레이션 링이면 수학 링으로) 처음에는 오퍼레이션 링이 선택 되어 있고 밑 방향으로 돌린다.(시계방향) 그리고 수학 링과 오퍼레이션 링은 Noop명령어로 설정 되어 있다. 만약 1과 0 이외에 명령어가 오면 무시 한다.(PAdd할 때도 무시하는 걸로 알고 있음) 그렇다면 주석을 다는 것은 간편하다. 다만 0과 1만 조심하면 된다.
3.링
오퍼레이션 링
Noop => 아무 일 안함. Exit => 프로그램을 끝낸다. One => 오퍼레이션 링에 달린 숫자를 1로 만든다. Zero => 오퍼레이션 링에 달린 숫자를 0으로 만든다. Load => 오퍼레이션 링에 달린 숫자를 현재 가르키고 있는 메모리 안의 숫자로 만든다. Store => 현재 가르키고 있는 메모리 안의 숫자를 오퍼레이션 링에 달린 숫자로 바꾼다. PAdd => 현재 가르키고 있는 프로그램 포인터에 오퍼레이션 링에 달린 숫자를 더한다.(점프 같지요.JMP) DAdd => 현재 가르키고 있는 메모리 포인터(메모리 포인터가 가르키는 숫자가 아님)에 오퍼레이션 링에 달린 숫자를 더한다.(브레인 퍽에서는 >혹은 <명령어와 비슷) Logic => 만약 현재 메모리 포인터가 가르키고 있는 메모리 방 안의 숫자가 0이라면 링에 달린 숫자(뭔지 알겠지?)를 0으로 바꾼다. 아니면 링에 달린 숫자와 1을 AND연산(1&1=1 1&0=0 0&1=0 0&0=0)한다. If => 만약 현재 메모리 포인터가 가르키는 방의 숫자가 0이 아니면 링에 달린 숫자를 프로그램 포인터에 더한다.(PAdd 비슷) IntIO => 만약 링에 달린 숫자가 0이라면 숫자를 받아 현재 메모리 포인터가 가르키는 방에 숫자를 넣는다. 아니면 현재 메모리 포인터가 가르키는 방의 숫자를 출력한다. AscIO => 만약 링에 달린 숫자가 0이라면 문자를 받아 현재 메모리 포인터가 가르키는 방에 문자의 아스키 코드 값을 넣는다. 아니면 현재 메모리 포인터가 가르키는 방의 아스키 코드 값과 일치하는 문자를 출력한다.
수학 링
Noop => 아무 일도 않 함 Load => 수학 링에 달린 숫자를 현재 메모리 포인터가 가르키는 방 안의 숫자로 바꾼다. Store => 현재 메모리 포인터가 가르키는 방 안의 숫자를 링에 달린 숫자로 바꾼다. Add => 링에 달린 숫자에 메모리 포인터가 가르키는 방의 숫자를 더한다. Mult => 링에 달린 숫자에 메모리 포인터가 가르키는 방의 숫자를 곱한다. Div => 링에 달린 숫자를 메모리 포인터가 가르키는 방의 숫자로 나누어 몫을 링에 달린 숫자에 넣는다. Zero => 링에 달린 숫자를 0으로 만든다. < => 만약에 링에 달린 숫자가 메모리 포인터가 가르키는 방의 숫자보다 작다면 링에 달린 숫자를 1로 바꾼다. 아니면 링에 달린 숫자를 0으로 바꾼다. > => 만약에 링에 달린 숫자가 메모리 포인터가 가르키는 방의 숫자보다 크다면 링에 달린 숫자를 1로 한다. 아니면 링에 달린 숫자를 0으로 한다. = => 만약 링에 달린 숫자와 메모리 포인터가 가르키는 방의 숫자와 같다면 링에 달린 숫자로 1로 한다. 아니면 링에 달린 숫자를 0으로 한다. Not => 만약 링에 달린 숫자가 0이 아니면 0으로 바꾼다. 아니면 1로 바꾼다. Neg => 링에 달린 숫자에 마이너스를 붙인다.(-1을 곱한다. 0 => 0, 1 => -1, 2 => -2, -3 => 3...)
4. 설명 1+1을 출력하는 예제이다. 00 => 오퍼 링의 Noop명령을 실행하고 수학 링으로 바꾼다. 0 => 수학 링의 방향을 시계 반대로 바꾼다. 11 => 수학 링의 Not명령으로 링을 돌린다. 00 => 수학 링의 Not명령을 실행하고 오퍼 링으로 바꾼다. 00 => 오퍼 링의 Noop명령을 실행하고 수학 링으로 바꾼다. 1 => 수학 링의 Add명령으로 링을 돌린다. 00 => 수학 링의 Add명령을 실행하고 오퍼 링으로 바꾼다. 00 => 오퍼 링의 Noop명령을 실행하고 수학 링으로 바꾼다. 0 => 수학 링의 방향을 시계 방향으로 바꾼다. 1 => 수학 링의 Store명령으로 링을 돌린다. 00 => 수학 링의 Store명령을 실행하고 오퍼 링으로 바꾼다. 11 => 오퍼 링의 One명령으로 링을 돌린다. 00 => 오퍼 링의 One명령을 실행하고 수학 링으로 바꾼다. 00 => 수학 링의 Store명령을 실행하고 오퍼 링으로 바꾼다. 0 => 오퍼 링의 방향을 시계 반대 방향으로 바꾼다. 1111 => 오퍼 링의 IntIO명령으로 링을 돌린다. 00 => 오퍼 링의 IntIO명령을 실행하고 수학 링으로 바꾼다. 그럼 소스는 어떻게 만들가요? 위의 소스를 합치면 0001100001000001001100000111100 가 됩니다. 가끔씩 보기 좋도록 같은 크기를 정해 뛰어쓰기도 합니다. 00011000 01000001 00110000 0111100
5. 예제 Hello, World!를 출력 하는 예제. 110011100111000001111100000001000011111000011111100000000010 000011001111100001100010000010011111000100000000000001001111 100000111110001000000000000000001000111110010000001100001111 100011000000000100111110011100111000111000001000111000001111 100000111110010000011111000110011111100001111000001111000001 110011111100001111000110011100000111000100011111000001111100 100000110000000111000001110001111100011111000111000001000001 000011000111110001000001000000011100000111001000111110001111 000001111000011111100001111110000011110000000000000000011110 000011100111000011110011111000111110001111100000100000000000 000000000000111110001110000001110000011100011100111110001000 100000000011100001111100110000000010011111000111100000111100 111100010011100000111110000011111001100111100010001111000000 000001000111110010000010011110011001110001000111110001100000 100011111000011110011100111111000111100000111100011111000000 011110000011100100001111000100011111001100011111000111100000 111001110001100111100100000000000000011111000001111100010010 000011100001111100100000100011100000111000110011110001001111 110001100000111100011111000111100000111001000011110001001111 100000111110000000011110000011110000000000000000111000001110 000011000001100000111000111000001100111110000111111001001110 000011111000001100011000001001111110000011100110011111000000 000111000001110000111100001100 |