아희

1 개요

오직 한글 프로그래밍 언어로, 거기에다 한글로 된 프로그래밍 언어 중에서 유일한 난해한 프로그래밍 언어다. 난해한 프로그래밍 언어의 제작 이유 중에서는 '어떤 개념의 증명' 정도가 적당할 것이다. 아희는 한글 낱자의 디자인을 살릴 수 있는 프로그래밍 언어라는 목적을 가지고 고안되었다. 다만 한글의 디자인을 살릴 뿐이지 한글 베이직인 마냥 한국어로 프로그래밍 하는 게 아니므로 모르고 본다면 외계어가 따로 없다. 제작자는 한국어 위키백과의 관리자이자 엔하위키 미러 운영자불로소득자 Puzzlet Chung.

어원은 '아이'를 뜻하는 옛 국어 낱말인 '아희'. 13인의 아희가 도로로 질주하오
'아희' 자체가 유효한 아희 코드이기도 하며, 실행하면 아무 동작 없이 종료된다.

2 동작

아희의 기본 개념은 비펀지와 비슷하다. '화살표' 명령을 사용해서 명령의 흐름을 이리저리 조종하는 것으로, 비펀지와 다른 점은 그 화살표를 포함해서 모든 명령이 순 한글이라는 것이다. 한글 낱자는 초성, 중성, 종성으로 나눌 수 있는데, 이때 중성은 커서가 이동할 방향을 지정하고, 초성은 수행할 명령을 지정한다. 종성은 초성의 명령을 보조하는 인자로서, 예를 들자면 저장공간을 선택하거나, 숫자를 결정하거나 하는 일이다.

그 외에 코드 공간의 맨 첫 줄 첫번째 칸에서 시작하는 것은 비펀지와 동일하나, 기본 방향은 아랫쪽으로 이동하는 것이 비펀지(오른쪽)와 다른 점이다. 그 외에 코드 공간의 한쪽 끝에 다다르면 커서가 반대편 끝으로 이동하는 점은 Funge-98[1]과 동일하다.

2.1 자료구조

기본적으로 저장공간은 26개[2]스택가 하나[3] 있는 방식. 그 외에 외부 확장기능과 데이터를 주고 받을 수 있는 '통로'[4]라는 것이 있는데, 아직 미구현이다. 아희 개발이 사실상 없으니 앞으로도 구현된 것을 볼 일은 없을 듯 하다.

2.2 문법

  • 초성
    • ㅇ 묶음
      • ㅇ: 아무 일도 하지 않는다.
      • ㅎ: 프로그램을 종료한다. 종료 시 선택된 저장 공간에 값이 하나 이상 남아 있다면 하나만 뽑아내 운영체제에 반환하고 비어있다면 0을 반환한다.
    • ㄷ 묶음 - 셈
      • ㄷ, ㄸ, ㅌ, ㄴ, ㄹ: 각각 덧셈, 곱셈, 뺄셈, 나눗셈, 나머지 연산.
      • 모두 공통적으로 저장공간에서 두 값을 뽑아낸 다음 둘을 연산한 값을 저장공간에 저장한다. 순서가 있는 연산자의 경우 나중에 꺼낸 값이 연산자의 왼쪽에 온다.
    • ㅁ 묶음 - 저장공간
      • ㅁ: 뽑기. 지금 저장공간에서 자료 구조의 형태에 맞게 하나 꺼내온다. 종성으로 ㅇ이 오면 숫자로, ㅎ이 오면 문자로 출력하고 나머지 종성이면 뽑아내서 그냥 버린다.
      • ㅂ: 집어넣기. 지금 저장공간에 값을 하나 넣는다. 종성이 ㅇ,ㅎ이면 각각 숫자와 문자로 사용자에게 입력을 받고, 나머지는 글자의 선의 수가 집어넣을 값이 된다. ㅅ->2, ㄹ->5,... 이런 식으로. 1을 곧바로 넣을 수가 없는데, 3 - 2(받반타, 밬밧타 등)를 하면 된다.
      • ㅃ: 중복. 지금 저장공간이 스택이라면 맨 위의 값을 그 값 위에 하나 더 집어넣고, 큐라면 맨 앞의 값을 앞에 하나 더 덧붙인다. 통로라면 아까 보낸 값을 한 번 더 보낸다.
      • ㅍ: 바꿔치기. 지금 저장공간이 스택이라면 맨 위 값과 그 바로 아래 값을, 큐라면 맨 앞의 값과 그 바로 뒤 값을 바꾼다. 통로일 때의 동작은 미정.
  • ㅅ 묶음 - 제어, 저장공간 확장
    • ㅅ: 선택. 종성을 통해 상술한 자료구조에서 선택 가능.
    • ㅆ: 이동. 지금 저장공간에서 값 하나를 뽑아내서 받침이 나타내는 저장공간에 그 값을 집어넣는다.
    • ㅈ: 비교. 저장공간에서 값 두 개를 뽑아 내서 비교한다. 나중에 뽑아낸 값이 더 크거나 같으면 1을, 아니면 0을 지금 저장공간에 집어넣는다.
    • ㅊ:조건. 저장공간에서 값 하나를 뽑아내서 그 값이 0이 아니면 진행해야 할 방향대로, 0이면 그 반대 방향대로 간다.
  • 중성
    • ㅏ,ㅓ,ㅗ,ㅜ: 중성의 방향이 커서의 방향이 된다. 각각 우,좌,상,하.
    • ㅑ,ㅕ,ㅛ,ㅠ: 위와 같으나 2칸 옮긴다.
    • ㅣ,ㅡ,ㅢ:ㅣ는 커서가 세로 방향으로 들어오면 그대로 통과, 가로로 돌아오면 전 자리로 옮기고 방향을 뒤집는다. ㅡ도 가로가 통과이고 세로가 뒤집을 뿐이지 ㅣ와 같다. ㅢ는 어느 방향으로 들어오든 방향을 뒤집는다.
  • 이외의 종성은 기능 없음.
  • 한글이 아닌 모든 글자는 빈칸으로 처리된다. 즉 무시된다.

3 예제

3.1 "Hello, world!"

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

(...)

다음은 같은 기능의 프로그램을 1차원으로 만든 것. 반드시 한 줄에 붙여 써야 한다.
밤밣따빠밣밟따빠맣받밪밬따딴박다닥빠맣밠당빠빱맣맣받닫빠맣파빨받밤따다맣맣빠빠밣다맣맣빠밬다맣밬탕빠맣밣타맣발다밤타맣박발땋맣희

3.2 구구단

숛숛멍빠빠싼싼산뱐뺘뉴뭏
벊뿌따또볔번벐석떠쇇볏
숟멓묳쑤써순떠뿌처모두샊
빠뿌몽쉐쎼뿌솨쀄토더북무
쑦써뫃멍솎써쏘썪밣봇투무
삭빠쒺섈뷐벳타대뽀숟슏셜
무차쇡뼤썎살밪박토받반투
희토되벅뱷쐬쏶뺴뺴뻐번뎌

3.3 1부터 입력값까지 더하기

붕빠쑥여처삭더북
반또박타뽀희멍너

3.4 밑이 2인 로그의 근사값 구하기

육체는 단명하고
근성은 영원한것
방산반밧나뿌서어뎐근성
대류…분선창사반나산분
폭룡이탄뭉폭룡의뇨시볏
최고다아하#김끼룩제작

보면 알겠지만 폭룡의 시를 접목시켰다.(...) 위 코드에서 실제로 실행되는 부분만 뽑아내면 다음과 같다(상술했듯 한글 외는 다 빈칸 취급이다).

육#######
########
방산반밧나뿌서어뎐##
###분선창사반나산분
###탄뭉###뇨#볏
####하######

3.5 문자의 UTF-8코드 출력

밯망히
딱히 크게 대단한 코드는 아니지만, 제대로 작동하는 코드 주제에 적절한 발음을 가져 꽤나 유명하다.

3.6 99병의 맥주

산발발밥따따빠빠빠빠빠빠빠빠빠뿌
쑱썴썳썲썱썰썯썮썭뻐뻐뻐뻐뻐뻐뻐
쌆쌇쌈쌉쌊쌋쌌쌎반타삱발밦다다숞
뚜벌벋섥더너벅벅설더벓섣더떠벆벆
다삶박다삷밝반따다삸발반따다삹불
숨더더벋떠범범섫더범섪터떠번더벖
받타삽밞밪따반다타삿밪발따반다두
쑼뻐떠범더벐범섳더벑섲더떠벋벍섰
샄반다샅밣밨따수박지민제작붸에엙
아아아아아아유붊다뚜샤먕뿌아아아아아
뿌섢멓뻐섡빠몋발봆숙오뽀처삭뿌뚫맣숮
빠맣맣삳뿌손야몋우바오ㅇㅇ숥차숤뽀뿌
뿌서멓뻐맣셜뷁뽀섵모오ㅇㅇ빠뭏뻐솥뭏
싺삮반반나타우쀼오속여ㅇㅇ어삱빠뫃숝
숢멓뻐섡멓우차솕훍ㅇ요ㅇㅇ오멓뭏뻐뿌
뿌빠맣순뽀섵어멓슓오ㅇ어ㅇㅇ뽀설솗멓
맣솥먛뻐살빠빠맣뫃ㅇ오ㅇㅇㅇㅇ어지민
뉴번번섞썪뻐석멓뻐맣숨오ㅇㅇㅇㅇㅇ어
뺘섵맣삱빠맣삸빠뭏뽀뿌ㅇㅇㅇ맣ㅇ불오
타초숦멓뻐섢멓뻐섵솛뭏ㅇ숙멓뽀ㅇ뿌초
뿌섴빠맣살빠맣샅빠뫃삳빠뽜뫃솤ㅇ두회
맣발반따맣삭마반수아숯어바타초ㅇ뭏툐
숱멓뻐섡멓섭차붌뼈ㅇ뿌노번번머ㅇ수소
빠맣삲빠뭏뚜떠반볎ㅇ맣샅빠맣아오뿌쏘
뿌섵멓뻐섡맣삼빠뭏ㅇㅇㅇㅇㅇㅇㅇ숨도
맣삵빠맣숞숛썫뻐섪오ㅇㅇㅇㅇㅇ어빠본
뭏뻐섡멓뻐받다맣술맣술맣불맣숝오ㅇ어ㅇㅇㅇㅇㅇㅇㅇㅇ어
삷빠맣살뿌뿌섵멓뻐뽀뿌뽀뿌또뿌맣숪토맣사마밡밡반다따오
숨멓뻐섵멓맣삱빠맣솘맣솥밤또뭏뽀뿌노뽀설멓뻐섧멓뻐섡멓
빠맣삸빠뭏숨멓뻐섵멓뻐섨멓뻐섫솘뭏뽀맣살빠맣샅빠맣샂뽀
뿌섵멓뻐섮빠맣삸빠맣발빠밤따뚜뫃사본뽀섲멓뻐섡멓뻐섥멓
맣산빠맣숫숨멓더번뻐섨멓뻐섵멓뽀섯멓뻐섡멓뻐섧멓뻐섬뽀
멓뻐섰멓뻐빠맣삵빠빠맣맣샅빠맣삾빠발다맣삲빠맣샅빠뫃솥

?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

3.7 A+B

방방다망해
5글자로 이루어지는 아주 짧은 소스다. 바리에이션으로 방방타망해(A-B), 방방따망해(A*B), 방방나망해(A÷B)가 있다.
방방다망해 = 방다망희 로 표현 가능하다.

3.8 아희아희

밯빪반발땊툼바품맔부삿붏웈찴뿞붛첦붖부쌵쎨뱌분쌵쳔얌부않모버윲옆엄엺퓴옆헐였촎몄썭엸억
쏭벗썽버멒찲뽂잢촢쑹봆술밤얎뱚얖졾얌쌸온춢뱌셙앾솔얂았욚푼츌덠턒뾸첚맞촒앖얒뭀싽보바쏝
똝둥벉떷벒벎벓벓벓부볶붒밦죢뷼봀뼠볾챂뵳분옦엌헐춦묦뼠섯찮반퍚볶뻖춀쟐다옴욘첞땋쏝쏝욯
둅딳땃땇턁부뻢땈뿒쑹손붏퉀벎잪춘톨욢헐볎살츎춠뵨셙춨댜벐됺볐뵨뻦처몪쓜쌀벼챯서싽바쏝옫
뵭벛먹찫뺛젻밣볹뚮부보뚶뾰촢젔뺨볾밦죢촠팠쌵셔솑붏뻐앞쌰챲샤뱐푾슈앖얒먁첣욯쏘뻗섯바쏝
됻뱕촉뚥졏떷벍턹벝쌍숙반툰빮뵨잚초욮버별얖윢았욨툸뚆않춮옾반셜부툔벞쌀바쑬몭척뭏총쏝뵤
똗봅뻛랑빥밟쟑뿕찫붍뵤뱐쁎분헐봂쁖뼐럸죢뗞벐벆멀챂빤뷴반삱촊썰풐벗강성훈맓욧옷엹푩농촟
똙뿓척뮻졋벅뻟첩뮧탉뿕푥벅분쟔벌앾욦츆헐숄수밬밮딸툘숄차숁쌀보붑댥뿋첧먑륝촍뚳벑욡룛펁
똣밫쟟뮳창빷밙줍뷱버붋뵥촣북붙뻤천봉빴뵳쏠펌뽘뻠넒떴붆뽔뿓턱덟벍봅희뱕벇똙폃툩욙춥푫묱
볽벍맛뷰챻뿕뿏쳧븉못쥭솑멏숭쟙뾻첰뵨옲만뱛뱜퍘뱛타슈뚢솟밣턓쁋첯먏몱첟폅뺟뮥찿뵫뮽춧춣
볽밝뚣볏좁벍밣쥻툹벋밟탃쁓뿗맟밭뷹탹먚춢맚몲맢밣푼뵭탇촑뱍쁕떵양뾹얏량얇뱍얓뷷욯푧엿엷
뱍뵻벋엋옅덝엻텁영헉촛부멑쓔충땇뉽탑춛빩밮탈춪풍턱볻서뭃압먑챷촓옫수써뻡섯몽뗡벅박욣욯
뵧턑보옱밣봁멹찱맟뵷뿝뱟춥뷵빡붃뗝뵫뻡툿벍붆뻣밣팗탏폯붗룥슛뱏펗뱕툽뚕브맑수탏퐃맋뷰촛
묯첯몳젿툡벗눁벼뵤먹찻뿑뿑사뿉뵭뿕뵥쟗뼡촐앞턌묟챃맟욟밝똛싾숫펋썮뻣브쌙촙빷바잗춛묩멁
뵫뵥버볽밗줓뼙첥뭇졁븉볃북뜏몫퍿받붉뿚텈뺠뿐첪맞맠먁복법쑤뻕뺥숞찭숞쌙춝샬브븃숫썻픁욡
쁏첡몷뽛욙쳕뵷묫볏맟보챣적쀿축춭뼢뚦뵲봃먖뱦먐투밦밤욮버사툝뱍붓샬뿍춗엯죥쌜뱓뻟튳탇퓵
욣졽엯엏옷엳엱엵뗣영볓역버톃풄앞퐂룺잘촢모불뻚첲맢묶봆바붐몉촏섡풏버삲욣보춥섡쓚퓳톁툥
뷹뿟잡쳣줏먍볍볻뼉톹쳡젓몿볔묺욮뻪쑨봃빺춮턐뭌찼먖먖욤뵴여헐쌚숝잛챹뷱앛뽇샪뎙벅촕뵶볻
욛뵶볹뻙첫맏바받밝똩상썅텰뺦변싸소산뽒뱐뻢튦먘먚먆먈뵸반봈묦브뱐뵤샬솒첧쌙비뿕쑩멽뽇펁
쟏뭅착뿙튵벅첟맓삭팖빶싸팚송빪쑹챶썽뻢성써맊맘맊밣밨욢멆첰몾부썭뽐섢텳볃붓쎥챯벼수쑩톧
욯벅줋벑빹쌍쳫상쑹싸수뼜쑤뻨순찮사뱐송덨뽖춨탺묜찺빪뱞얎톮얀쌵초싽뱌수쌵쎨욿버쎥엱벼똝
보멋첡뭅송뺝뾲쏘셔뮶앢속슈톸뿘빠쑹상쁐뎒속빮봄푾벓뿌섯헐뼈찼얒쌸윮뱌엮쑬며얿벼첛팛툓봆
툫벋수벼삭폴버숙처속졒촌젒봎쑥옦첢운찬수촞텆벘튲퐂쌰퍐쇼뱌옼슈뱌뭎썭뱌썰쏠닰탸몳챃빣볻
팣먅쟘퍘촊욜먺엺폂벼셕썩보돊석촖썽뻐쏭뵨삭푸퍚벓톲폂본첰싸샤뷰펔윤댶춀퉆뱒볾튶웄첬싹삭
뺮셔쑈쎠샥뼞묬텪범덜석펌썩뻞펐선샹써뽈텸번뻞뾲선맔손열옺엸묚분쑍밦봀몮참뽚봃뻒얆존샥벼

아희로 짜여진 아희 인터프리터다. 네이밍은 파이썬 인터프리터 PyPy로부터 영감을 받은 듯하다. 작성자는 강성훈씨. 깃허브 페이지에 가보면 느리다는 점을 자랑하고 있다...

4 기타

  • 사실 기본 개념만 알면 그다지 그렇게 어려운 언어는 아니다. 물론 문법이 쉽다는 거지 구조상 조금만 프로그램이 커져도 골치아프다.
  • 아희 코드를 트위터에 쓰면 아희 계정이 사찰을 돈다는 설이 있는데, 정말이다! 쓸데없이 Hello, World를 써주시는 자상함을 지니고 있다.[5][6]
  • 공개 10년만에 국제 아희 컨퍼런스가 열렸다! [1]
  • 2016년 8월 12일자 웹툰 공대생 너무만화의 타이틀 컷에 아희 언어가 등장했다. [2] 코드는 '발받악에땀망희났어'. 참고로 실행하면 15가 나온다.

5 외부 링크

  • [3] - 아희 소개 페이지
  • [4] - 자바스크립트 버전
  • [5] - 아스키 to 아희 변환기
  • [6] 아희켐(AheuiChem)
  • [7] - 알파희 아희 JIT 인터프리터
  1. 비펀지의 일종. 업그레이드판이라고 볼 수 있다.
  2. ㅇ과 ㅎ을 제외한 쌍자음을 포함한 종성 낱자 14자에 ㄾ같이 합용 병서된 종성 11자, 종성 없을 때의 한 가지까지 총 26개.
  3. ㅇ이 큐이다.
  4. ㅎ으로 저장공간 고르듯이 쓸 수 있다.
  5. Hello, World가 아니어도 아희로 작성된 문장이면 실행된 결과를 써준다.
  6. 트윗들을 살펴보면 하는말도 여러모로 사차원(?)적인 말들이 많고, 빈창으로 답변을 보내는 일도 허다하다. 공식봇인지 아닌지, 혹은 진짜 사람(...)인지는 불분명하지만 아희 관련 언어들에 다 답글을 달아주고, 유일한 팔로잉이 위에도 언급했다시피 창조자인 Puzzlet Chung이기 때문에 어느 정도 신뢰는 간다(...) 그렇다고 너무 빠지진 말고