가희

—Mayu Laierlence

가희는 한글로 된 난해한 프로그래밍 언어입니다.

이 문서는 아희 확장에 대해 설명하고 있습니다. 이 문서에서 설명하지 않은 부분은 아희 표준 사양 페이지를 참고하세요.

코드

가희 코드는 언제나 다음 조건을 만족합니다.

  1. 가희 코드는 BOM 없는 UTF-8로 인코딩되어있어야 합니다.
  2. 가희 코드는 줄 수와 줄 길이가 각각 32비트의 부호를 갖지 않는 정수의 최대값보다 적어야만 합니다.
  3. 가희 코드는 한글 음절 문자만을 유효한 명령으로 사용하며, 명령이 아닌 문자는 흐름에 영향을 주지 않습니다.
  4. 줄바꿈 기호를 제외한 모든 문자는 한 칸으로 취급하며, 반각과 전각은 구분하지 않습니다.
  5. 줄바꿈 기호는 CRLF, CR, LF 중 하나입니다. 하나의 코드에 여러 줄바꿈 기호를 섞어 사용할 수는 없습니다.
  6. 줄바꿈 기호는 코드 맵을 만들 때만 사용됩니다.
  7. 코드 맵은 언제나 직사각형의 형태를 갖게 됩니다. 코드 맵의 오른쪽 끝은 가장 긴 칸을 갖는 줄의 너비이고, 그보다 짧은 칸을 갖는 줄은 가장 긴 칸을 갖는 줄의 길이에 맞게 줄 끝을 가상의 빈 문자로 채웁니다.

값은 최소 64비트의 부호를 갖는 정수를 의미합니다. 값은 수치에 상응하는 유니코드 문자로 변환할 수 있습니다.

공간

공간은 값을 기억 또는 송수신할 수 있는 모든 것을 의미합니다. <끝소리 없음>을 제외한 모든 공간은 모든 스레드에서 공유합니다. 스레드가 새로 생성되면 기본적으로 <끝소리 없음>이 선택되어 있으며, 선택 명령은 다른 스레드에는 영향을 주지 않습니다.

스택

스택은 먼저 넣은 값이 나중에 나오게 되는 형태의 공간을 뜻합니다. 끝소리 ㅇ과 ㅎ을 제외한 모든 공간의 기본값입니다. 가질 수 있는 값의 갯수는 적어도 32비트의 부호를 갖지 않는 정수의 최대값이어야 합니다.

큐는 먼저 넣은 값이 먼저 나오게 되는 형태의 공간을 뜻합니다. 끝소리 ㅇ의 기본값입니다. 가질 수 있는 값의 갯수는 적어도 32비트의 부호를 갖지 않는 정수의 최대값이어야 합니다.

스트림(통로)

스트림은 외부와 데이터를 주고받는 형태의 공간을 뜻합니다. 끝소리 ㅎ의 기본값이며, 읽고 쓸 수 있는 값의 갯수는 환경에 따라 다를수 있습니다. 열린 스트림에 처음으로 사용한 명령이 뽑기라면 해당 스트림은 뽑기 전용이 되고, 처음으로 사용한 명령이 넣기라면 해당 스트림은 넣기 전용이 됩니다. 뽑기 전용 스트림에 넣기 명령을 사용할 경우, 넣기 전용 스트림에 뽑기 명령을 사용할 경우, 열려있지 않은 스트림에 뽑기 명령이나 넣기 명령을 사용할 경우, 모두 오류로 처리됩니다.

명령

없음

갈피

갈피는 고급 언어의 레이블에 해당하는 부분입니다. 끝소리 있는 명령 등으로 다른 갈피로 이동하기 전에 포인터가 가리키는 위치가 포인터 스택에 들어갑니다. 이 후에 끝소리 없는 명령이나 명령을 사용하면 포인터 스택에서 이전 위치를 불러와 해당 위치로 이동하게 됩니다. 포인터 스택이 비어있으면 무시하고 계속 진행합니다. 명령을 받침 없이 사용해 멀티 스레드를 시작하면 코드의 왼쪽 위부터 아래로 읽기 시작하는 규칙이 적용됩니다. 갈피는 <끝소리 없음>을 제외하고는 비어 있으며, 빈 갈피로 가려고 하면 오류로 처리되어 방향이 반전됩니다. <끝소리 없음>을 제외한 모든 갈피는 덮어쓸 수 있습니다. 갈피는 모든 스레드에서 공유됩니다.

기본적인 동작은 아희와 같습니다.

읽고 쓰기

기본적인 동작은 아희와 같습니다.

큐와 스택

기본적인 동작은 아희와 같습니다.

스트림 (통로)

끝소리 있는 명령과 끝소리 있는 명령을 사용해서 파일을 열고 닫을 수 있습니다.
아희와는 달리, 스트림에 대한 명령은 끝소리 없는 명령처럼 동작합니다.

공간

아희와 같습니다.

견주기

명령으로 난수를 생성할 수 있습니다. 뽑은 값이 3이면 0부터 2 사이의 임의의 값을 넣습니다. 값을 뽑지 못했다면 오류로 판단합니다.

끝내기

이동

어떤 가운뎃소리는 이동 방향과 칸 수를 갖습니다.

가운뎃소리 방향 칸 수 아희 호환성
1
2
1
2
1
2
1
2
1
1

어떤 가운뎃소리는 이동 방향을 변경합니다.

가운뎃소리 설명 아희 호환성
세로축 방향을 반전합니다.
가로·세로축 방향을 반전합니다.
가로축 방향을 반전합니다.

커서가 코드 맵 밖으로 나갔다면 반대쪽 끝으로 돌아갑니다.

가반받우
다망우아
망희밤뱔

위 코드는 아래와 같은 흐름으로 실행됩니다.

㉠㉡㉢㉣
㉥㉦㉧㉤㉥
㉪㉫㉨㉩ ㉪

상태

코드를 실행하는 일반적인 상태인 실행 상태와, 실제로는 코드가 실행되지 않는 상태인 갈피 정의 상태가 있습니다. 실행 상태에서도 갈피를 등록할 수는 있지만 코드 오류로 인해 방향이 반전될 가능성이 있습니다. 갈피 정의 상태에서는 방향만 따라갈 뿐 실제로 코드를 실행하지는 않기 때문에 방향이 항상 같아 복잡한 코드를 작성할 때 유용합니다. 상태는 스레드 간에 공유되지 않습니다.

예제

0으로 나눌 때 42가 나오는 가희 코드입니다. 갈피 정의 상태를 사용하지 않았습니다.

국       -- 갈피 ㄱ 등록
밝밦뚜     -- 42를 넣기
  구     -- 선언 시에는 돌아갈 곳이 없으므로 무시하고 계속 진행
우 여        오류에서 왔다면 해당 명령이 있던 곳으로 돌아감
반부      -- 2와 0을 차례대로 넣기
 뉵      -- 나누는 중 오류가 발생했을 경우 갈피 ㄱ으로 가기 (나중 이동)
           돌아왔을 때 이 명령의 방향과 거리가 유지됨
 망희     -- 값을 출력하고 종료

아래는 이 코드를 실행할 때 순서대로 일어나는 일을 정리한 표입니다.

순서 문자 <끝소리 없음> 공간 (스택) 출력 누적
1
2 7
3 7, 6
4 42
5 42
6 42
7 42
8 42, 2
9 42, 2, 0
10 42, 2, 0
11 42, 2, 0
12 42, 2, 0, 7
13 42, 2, 0, 7, 6
14 42, 2, 0, 42
15 42, 2, 0, 42
16 42, 2, 0 42
17 42, 2, 0 42

0으로 나눌 때 42가 나오는 가희 코드입니다. 갈피 정의 상태를 사용합니다.

귱       -- 갈피 정의 상태로 변경
           정의 중에는 이후 코드가 실행되지 않음
국       -- 갈피 ㄱ 등록
마무      -- 값 2개를 꺼내 버리기
 밝밦뚜    -- 42를 넣기
   규    -- 선언 시에는 돌아갈 곳이 없으므로 무시하고 계속 진행
           오류에서 왔다면 해당 명령이 있던 곳으로 돌아감
   궇    -- 실행 상태로 변경
우  어       이후 코드가 실행되기 시작함
반부      -- 2와 0을 차례대로 넣기
 뉵      -- 나누는 중 오류가 발생했을 경우 갈피 ㄱ으로 가기 (나중 이동)
           돌아왔을 때 이 명령의 방향과 거리가 유지됨
 망희     -- 값을 출력하고 종료

아래는 이 코드를 실행할 때 순서대로 일어나는 일을 정리한 표입니다.

순서 문자 <끝소리 없음> 공간 (스택) 출력 누적
1
2
3
4
5
6
7
8
9
10
11
12 2
13 2, 0
14 2, 0
15 2, 0
16 2
17
18 7
19 7, 6
20 42
21 42
22 42
23 42

사족

가희아희에 기능을 더했다(加)는 뜻과, 가희의 가장 큰 특징인 갈피 관련 기능이 묶음이라는 것을 나타내는 이름입니다. 가희 자체는 실행시키면 안전하게 끝나는 가희 언어로 쓰여진 코드입니다. 하지만 사실은 歌姫라는 어감이 아름다워서 이렇게 정했습니다.

처리기

가희 처리기는 다음과 같은 조건을 만족해야 합니다.

  1. 완전한 아희 코드는 완전한 가희 코드입니다. 가희와 같은 코드 규칙이동 규칙을 갖는 아희 처리기에서 완전한 아희 코드를 실행한 결과는 같은 코드를 가희 처리기에서 실행한 결과와 정확히 일치해야 합니다. 3
  2. 줄바꿈 기호는 CRLF, CR 또는 LF 중 하나입니다. CRLF가 하나라도 있을 경우 CRLF를 줄바꿈 기호로 사용하고, CRLF가 없고 CR이 하나라도 있을 경우 CR를 줄바꿈 기호로 사용하고, 둘 다 없으면 LF를 줄바꿈 기호로 사용합니다.
  3. 한글 음절 문자는 U+AC00부터 U+D7A3까지입니다.
  4. 공백 문자는 U+0009, U+000A부터 U+000D까지, U+0020, U+0085, U+00A0, U+1680, U+2000부터 U+200A까지, U+2028, U+2029, U+202F, U+205F, U+3000입니다.
  5. 후행 공백은 모두 무시합니다. 코드 끝에 빈 행이 있다면 그 행을 무시합니다.

  1. 처리 도중 오류가 발생하면 현재 처리를 취소하고, 끝소리 갈피로 나중 이동을 합니다. 끝소리 갈피가 없으면 일반 오류로 판단하고 방향을 반전합니다. 

  2. 실행 시점에 스트림으로 정의된 공간만 지정할 수 있습니다. 지정한 공간이 큐 또는 스택일 경우 오류로 판단합니다. 

  3. 완전한 아희 코드란 아희 표준에 정의된 첫소리·가운뎃소리·끝소리와 가희에서 새로이 정의되지 않은 첫소리·가운뎃소리·끝소리만이 사용된 한글 문자 및 한글 이외의 문자가 사용된 코드를 말합니다.