아희?

아희는 한글로 된 난해한 프로그래밍 언어입니다. 네, 코드가 한글입니다. 물론 한글이라는 것이 쉽다는 뜻은 아닙니다.

프로그래밍 언어라면 모름지기 Hello, World! 부터 찍고 봐야 하는 법. 아희의 헬로월드를 보고 가시겠습니다.


밤밣따빠밣밟따뿌
빠맣파빨받밤뚜뭏
돋밬탕빠맣붏두붇
볻뫃박발뚷투뭏붖
뫃도뫃희멓뭏뭏붘
뫃봌토범더벌뿌뚜
뽑뽀멓멓더벓뻐뚠
뽀덩벐멓뻐덕더벅


2005년경 아희의 창시자 Puzzlet Chung 님이 작성한 아희의 Hello, world! 코드입니다. 정확히 8x8의 깔끔한 구성을 하고 있죠.[각주:1] 

이 코드의 출력값은 다음과 같습니다.

Hello, world!LF

깔끔하죠?



이런 아스트랄한 아햏햏함 덕분에, 아희는 한국 개발자들 사이에서 컬트적인 인기를 끌고 있습니다.

RPython으로 만든 인터프리터 알파희(RPAheui), 아희로 만든 아희 구현제 아희아희가 등장했고, 실행 가능한 코드인 아희 문학도 있으며, 2015년 정보올림피아드 고등부 공모전에는 아희 비주얼라이저가 출품되어 전국 은상의 기염을 토했을 뿐만 아니라, Sublime Text에는 하이라이팅 플러그인이 있을 뿐더러, Anarchy Golf백준 온라인 저지의 사용 가능 언어 중 하나로 자랑스럽게 이름을 걸고 있습니다...

개발자들이라는 족속은 원래 이렇습니다. 해커 정신이라는 거죠. (아님)



우오오오옹~! 내는 마치 인간 인터프리터데이!!

일단 아희 Specification 문서와 가희[각주:2] 1판 문서를 정독해보시는 걸 추천드립니다. 굳이 가희 문서까지 읽어보라고 하는 이유는, 저게 좀 더 이해하기 쉽게 설명되어 있어서 그렇읍니다


그럼, 우선 위의 코드를 해석해보도록 할까요?

위에서 언급한 바 있는 아희 비주얼라이저/IDE인 AheuiChem을 사용했습니다


//ㅂ로 읽음(먼저 이동 = 중성 읽은 후 명령 처리 후 이동), ㅁ=4 스택에 4를 넣음. 스택은 선입후출. 스택 아는 [4]

: 앓은 8, 스택 아는 [8, 4]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 스택 아는 [32]

: 나중 이동, 값을 뽑아 스택 맨 위에 두 번 넣기, 스택 아는 [32, 32]

: 8이므로, 스택 아는 [8, 32, 32]

: 9이므로, 스택 아는 [9, 8, 32, 32]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 9과 8을 뽑아 나중 값에 넣으므로 72, 스택 아는 [72, 32, 32]

: 맨 위의 값 72를 뽑아 맨 위에 두 번 넣음, 스택 아는 [72, 72, 32, 32], 커서 방향이 아래(ㅜ)로 변경

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 72 = 0x48, U+0048 = LATIN CAPITAL LETTER H, 콘솔에 H 출력, 스택 아는 [72, 32, 32]

: ㄷ=3을 저장소에 넣음, 스택 아는 [3, 72, 32, 32]

: ㅈ=3을 저장소에 넣음, 스택 아는 [3, 3, 72, 32, 32]

: ㅋ=3을 저장소에 넣음, 스택 아는 [3, 3, 3, 72, 32, 32]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 스택 아는 [9, 3, 72, 32, 32]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 스택 아는 [27, 72, 32, 32] (종성 ㅇ, ㅎ가 아니므로 무시되었음)

: 종성 값 ㄱ=2를 저장소에 넣음, 스택 아는 스택 아는 [2, 27, 72, 32, 32], 커서 방향이 왼쪽(ㅓ)로 변경

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [29, 72, 32, 32.]

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [101, 32, 32].

: 맨 위의 값 101을 뽑아 다시 넣음, 스택 아는 [101, 101, 32, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 101 = 0x65, U+0065 = LATIN SMALL LETTER E, 콘솔에 e 출력, 스택 아는 [101, 32, 32]

: 먼저 이동, ㄽ=7을 저장소에 넣음, 스택 아는 [7, 101, 32, 32].

: 나중 이동, 스택 아는 [108, 32, 32], 두 값을 뽑아 더한 후 나중 값에 넣은 듯, ㅇ 받침은 어떻게 됐는지 추가바람

: 맨 위의 값 108을 뽑아 맨 위에 두 번 넣음, 스택 아는 [108, 108, 32, 32], 커서 방향이 위(ㅗ)로 변경

: 맨 위의 값 108을 뽑아 맨 위에 두 번 넣음, 스택 아는 [108, 108, 108, 32, 32].

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 108 = 0x6C, U+006C = LATIN SMALL LETTER L, 콘솔에 l 출력, 스택 아는 [108, 108, 32, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 108 = 0x6C, U+006C = LATIN SMALL LETTER L, 콘솔에 l 출력, 스택 아는 [108, 32, 32]

: 먼저 이동, ㄷ=3을 저장소에 넣음, 스택 아는 [3, 108, 32, 32].

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [111, 32, 32]

: 맨 위의 값 111을 뽑아 다시 넣음, 스택 아는 [111, 111, 32, 32]. 커서 방향이 오른쪽(ㅏ)로 변경.

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 111=0x6F, U+006F = LATIN SMALL LETTER O, 콘솔에 o 출력, 스택 아는 [111, 32, 32]

: 나중 이동, 앞쪽 두 값을 서로 바꾸기, 스택 아는 [32, 111, 32]

: 나중 이동, 맨 위의 값 32를 뽑아 맨 위에 두 번 넣음, 스택 아는 [32, 32, 111, 32]

: ㄷ=3을 저장소에 넣음, 스택 아는 [3, 32, 32, 111, 32]

: ㅁ=4를 저장소에 넣음, 스택 아는 [4, 3, 32, 32, 111, 32]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 스택 아는 [12, 32, 32, 111, 32], 커서 방향이 아래(ㅜ)로 변경

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [44, 32, 111, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 44 = 0x2C, U+002C = COMMA, 콘솔에 , 출력, 스택 아는 32, 111, 32

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 32 = 0x20, U+0020 = SPACE, 콘솔에 출력, 스택 아는 111, 32

: 맨 위의 값 111을 뽑아 맨 위에 두 번 넣음, 스택 아는 [111, 111, 32]

: 맨 위의 값 111을 뽑아 맨 위에 두 번 넣음, 스택 아는 [111, 111, 111, 32], 커서 방향이 왼쪽(ㅓ)으로 변경

: 먼저 이동, ㄹㅎ=8을 저장소에 넣음, 스택 아는 [8, 111, 111, 111, 32]

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [119, 111, 111, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 119 = 0x77, U+0077 = LATIN SMALL LETTER W, 콘솔에 w 출력, 스택 아는 [111, 111, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 111 = 0x6F, U+006F = LATIN SMALL LETTER O, 콘솔에 o 출력, 스택 아는 [111, 32]

: 맨 위의 값 111을 뽑아 맨 위에 두 번 넣음, 스택 아는 [111, 111, 32], 커서 방향이 위(ㅗ)로 변경

: 먼저 이동, ㅋ=3을 저장소에 넣음, 스택 아는 [3, 111, 111, 32]

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [114, 111, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 114 = 0x75, U+0075 = LATIN SMALL LETTER R, 콘솔에 r 출력, 스택 아는 [111, 32]

: 먼저 이동, ㅋ=3을 저장소에 넣음, 스택 아는 [3, 111, 32], 커서 방향이 오른쪽(ㅏ)로 변경

: 두 값을 뽑아 나중 값에서 최상값을 뺀 후 나중 값에 넣음, 스택 아는 [108, 32]

: 맨 위의 값 108을 뽑아 맨 위에 두 번 넣음, 스택 아는 [108, 108, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 108 = 0x6C, U+006C = LATIN SMALL LETTER L, 콘솔에 l 출력, 스택 아는 [108, 32]

: 먼저 이동, ㄹㅎ=8을 저장소에 넣음, 스택 아는 [8, 108, 32], 커서 방향이 아래(ㅜ)로 변경

: 두 값을 뽑아 나중 값에서 최상값을 뺀 후 나중 값에 넣음, 스택 아는 [100, 32]

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 100 = 0x64, U+0064 = LATIN SMALL LETTER D, 콘솔에 d 출력, 스택 아는 [32]

: 먼저 이동, ㄹ=5를 저장소에 넣음, 스택 아는 [5, 32], 커서 방향이 왼쪽(ㅓ)으로 변경

: 나중 이동, 계산, 두 값을 뽑아 더한 후 나중 값에 넣음, 스택 아는 [37].

: 먼저 이동, ㅁ=4를 저장소에 넣음, 스택 아는 [4, 37].

: 두 값을 뽑아 나중 값에서 최상값을 뺀 후 나중 값에 넣음, 스택 아는 [33].

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 33 = 0x21, U+0021 = EXCLAMATION MARK, 콘솔에 ! 출력, 스택 아는 [(비어 있음)]

: 먼저 이동, ㄱ=2를 저장소에 넣음, 스택 아는 [2], 커서 방향이 오른쪽(ㅏ)로 변경

: 먼저 이동, ㄹ=5를 저장소에 넣음, 스택 아는 [5, 2]

: 나중 이동, 계산, 두 값을 뽑아 곱한 후 나중 값에 넣음, 스택 아는 [10], 커서 방향이 아래(ㅜ)로 변경

: 나중 이동, 한 값을 뽑아 문자로 써내기, 스택 아의 최상값은 10 = 0x0A, U+000A = LINE FEED, 콘솔은 개행됨(\n), 스택 아는 [(비어 있음)]

: 먼저 이동, 한 값을 뽑아 돌려준 뒤 끝내기, 스택 아의 최상값은 (없음), 아무것도 리턴하지 않고 프로그램 종료

[program terminated]


어떠셨나요? 누가 봐도 정말 한글의 아름다움을 극한까지 살린, 멋진 튜링 완전 언어가 아닌가요?



앗하이.


  1. 뭐, 실제로는 개행 코드가 붙겠지만요. [본문으로]
  2. 아희를 확장한 언어. 마유쨔마(Mayu Laierlence) 님이 제작. [본문으로]

+ Recent posts