아희

“한글로 쓰는 난해한 프로그래밍 언어”
— Puzzlet Chung


소개[편집 | 원본 편집]

엔하위키 미러 개발자인 Puzzlet Chung한글로 만든 난해한 프로그래밍 언어. 한글 모든 글자가 코드에 쓰일 수 있는 특성으로 인해, 언어 이름이 동작하는 언어의 코드기도 하다. 한국 웹에서 묘하게 컬트적인 인기를 얻고 있다. 비펀지와 동작이 유사하다.

한글 낱자의 디자인을 살릴 수 있는 프로그래밍 언어라는 목적을 가지고 고안되었다. 코드 공간 안에 커서가 존재해 커서가 위치한 곳에 적혀 있는 명령을 수행하고, 명령에 따라 다시 커서를 움직이는 방식으로 동작한다. 홀소리는 커서가 이동할 방향을 지정하고, 닿소리는 수행할 명령을 지정한다. 받침이 있는 경우 받침은 수행할 명령의 인자로 사용된다. 홀소리, 닿소리만 있는 경우를 포함해 한글이 아닌 문자는 코드 공간 상의 빈 공간으로 취급된다. 아희 인터프리터가 사용하는 저장 공간은 여러 가지가 있는데, 이중 대부분이 스택이고, 큐 하나, 확장기능과 소통하는 통로가 하나 있다.

최근에는 JIT이 가능한 구현체가 만들어지기도 했다. 트위터에 멘션을 보내면 코드를 실행시켜주는 트위터 봇까지 존재한다.

문법[편집 | 원본 편집]

아희 스펙 참고

닿소리[편집 | 원본 편집]

ㅇ: 아무것도 하지 않는다. 여기에 오는 받침은 모두 무시한다. ㅎ: 종료, 선택된 저장 공간에 값이 하나 이상 남아 있으면 ㅁ 명령으로 뽑아낼 수 있는 값을 뽑아내 반환. 저장 공간이 비어 있으면 0 값을 반환한다. 여기에 오는 받침은 모두 무시한다.

ㄷㄸㅌㄴㄹ: 순서대로 덧셈, 곱셈, 뺄셈, 나눗셈, 나머지 연산이며, 저장공간에서 두 값을 뽑아낸 다음 둘을 연산한 값을 저장공간에 저장한다. 순서가 있는 연산자의 경우 나중에 꺼낸 값이 연산자의 왼쪽에 온다. 여기에 오는 받침은 모두 무시한다.

  • '받밞라'는 3 mod 9 이므로 3을 저장하지만 '밞받라'는 9 mod 3 이므로 0을 저장한다.

ㅁ: 뽑기, ㅇ 받침이 오면 뽑아낸 값을 10진수로 출력, ㅎ 받침이 오면 뽑아낸 값에 해당하는 코드포인트의 유니코드 문자를 UTF-8로 출력한다. 다른 받침이 오면 뽑아낸 값을 버린다.

  • 밣발따밞발밟받따따따따했다 : 48600
  • 밣발따밞발밟받따따따따했다 : 뷘(48600은 16진법으로 BDD8 이고, U+BDD8 값에 해당되는 문자)

ㅂ: 집어넣기. 지금 저장공간이 스택이라면 맨 위에, 큐라면 맨 뒤에 값을 집어넣는다.(push) 통로라면 값을 하나 보낸다. ㅇ 받침이 오면 표준 입력에서 정수 문자열을 받아 이에 해당하는 값을 지금 저장공간에 집어넣고, ㅎ 받침이 오면 표준 입력에서 UTF-8로 유니코드 문자를 받아 이에 해당하는 유니코드 코드포인트를 지금 저장공간에 집어넣고, ㅇ이나 ㅎ이 아닌 받침에 대해서는 각각 상수를 저장공간에 집어넣는다.

입력값 출력값 입력값 출력값
ㄱ,ㄴ,ㅅ 2 ㄷ,ㅈ,ㅋ 3
ㅁ,ㅂ,ㅊ,ㅌ,ㅍ,ㄲ,ㄳ,ㅆ 4 ㄹ,ㄵ,ㄶ 5
6 ㄺ,ㄽ, 7
8 ㄻ,ㄼ,ㄾ,ㄿ, 9

1은 바로 입력할 수 없고, 3-2(받반타) 나 2/2(반반나) 식으로 구현한다.

  • 방망희: 숫자를 입력받아 출력한다.
  • 밯망희: 문자를 입력받아 유니코드 값을 저장한다. 감을 입력하면 44048(AC10)이 출력된다.
  • 박망희: ㄱ이 2에 해당하므로 2를 출력한다.

ㅃ: 중복 명령. 지금 저장공간이 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고, 큐라면 맨 앞의 값을 앞에 하나 더 덧붙인다.

  • 발빠닥망했다: 10 → 발로 5를 집어넣고(5), 빠로 5를 또 넣고(5 5), 다로 두 값을 더하고(ㄱ 무시, 5+5 =10) 망으로 숫자출력. ㅎ으로 종료.

ㅍ: 교환 명령. 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꾼다.

  • 발박받으로 5 2 3을 순서대로 저장했는데, 파를 넣어서 발박받파라고 하면 5 2 3 저장 이후 3과 2를 바꾸라는 의미이므로 5 3 2가 된다.

홀소리[편집 | 원본 편집]

아희에서는 홀소리로 커서를 이동한다.

  • ㅏ, ㅓ, ㅗ, ㅜ : 커서를 각각 오른쪽, 왼쪽, 위, 아래로 한 칸 이동
  • ㅑ, ㅕ, ㅛ, ㅠ : 커서를 각각 오른쪽, 왼쪽, 위, 아래로 두 칸 이동
  • ex) '아뱜이밝다망했다'는 뱜에서 커서를 두칸 오른쪽으로 이동하므로 다른 코드가 없으면 '아밤밝다망했다'와 같게 동작
  • ㅡ - 커서가 가로로 왔으면 통과, 세로로 왔으면 전에 있던 자리로 커서를 옮기고 진행 방향도 뒤집는다.
  • ㅣ - 커서가 세로로 왔으면 통과, 가로로 왔으면 전에 있던 자리로 커서를 옮기고 진행 방향도 뒤집는다.
  • ㅢ - 커서를 전에 있던 자리로 옮기고 진행 방향도 뒤집는다.
  • 그밖의 다른 홀소리는 기능이 없다.

예문[편집 | 원본 편집]

  • 주의: 여러줄로 되어있는 코드를 한줄에 붙여 그대로 실행하면 작동이 되지 않는다. 그 반대도 마찬가지.
입력 출력 해설
밤밣따빠밣밟따뿌
빠맣파빨받밤뚜뭏
돋밬탕빠맣붏두붇
볻뫃박발뚷투뭏붖
뫃도뫃희멓뭏뭏붘
뫃봌토범더벌뿌뚜
뽑뽀멓멓더벓뻐뚠
뽀덩벐멓뻐덕더벅
Hello, world! 아희 스펙에서 제공하는 기본 코드, 개발자인 Puzzlet Chung은 똑같은 출력을 위해 왼쪽의 64자가 아닌, 28자(86바이트)+2바이트로 작성했다는 기록이 있다[1] (2016년 기준, 최소 크기 코드)
발받악에 땀 망희 났어 15 네이버 웹툰, <공대생 너무만화> #15, vol.(?)으로 되어있는데, 옆 코드를 실행하면 15가 나온다. [2]
밥밖딱밙밗밚발딱뚝
뚝벌뻘벌벌떨떵떡벖
밦탁딱딱밝탕탕빡뭏
뿐덤떡떪떱벍벌범벓
맣밣받땅밣딱밣딱붐
두벍떠벌벌멓뻐터덩
맣밤밭밖딱딱받딱불
붐멓뻑터범덕떠범떠
밣딱밝밝밤당땉땅둣
출력리브레위키희멓
리브레 위키 한국어 출력을 위한 유니코드 참조, 맨 밑줄의 '출력리브레위키'는 아무런 영향을 미치지 않는다.
밯망희 '리' 입력시 : 47532 입력한 유니코드/UTF-8 문자에 해당하는 유니코드/UTF-8 수치값(10진수)을 보여준다. '리'는 유니코드 문자 U+B9AC에 해당되므로[3], 16진수 B9AC를 10진수로 변환하면 47532
반발따반발따따반불
분떠벌떠떠벌번떠떠
발따반발따따반발뚜
불번떠벌번더떠법떠
따따밥밪다따다반불
뭏더법더떠더벋벋떠
반발따반발따따반불
분떠법떠떠벌번떠떠
발따반발따따반발뚜
뚜벌번더떠더벋범떠
반발따따다반발따불
뭏더더더벅벝떠더벝
아희
헬로 이렇게 길게써서 두 문자만 출력도 가능하다.

구현체[편집 | 원본 편집]

바깥 링크[편집 | 원본 편집]

각주

  1. [1], 아희로 작성하기 순위표,
  2. http://comic.naver.com/webtoon/detail.nhn?titleId=678499&no=15
  3. Hangul Syllables The Unicode Standard, Version 9.0 , unicode.org