Skip to content

Latest commit

 

History

History
154 lines (108 loc) · 13.3 KB

README.md

File metadata and controls

154 lines (108 loc) · 13.3 KB

아희아희 aheui.aheui

English

일찍이 세종대왕께서는 뭇 백성을 가엽게 여겨 과학적인 문자 한글을 창제하여 널리 쓰이도록 하였습니다. 이 훌륭한 전통을 이어내려, 지난 이천오년에 퍼즐릿 정의 주도로, 뭇 개발자들을 가엽게 여긴 뜻 있는 사람들이 모여 한글 프로그래밍 언어를 만들어 널리 쓰이도록 하였으니, 이것이 바로 아희입니다. 아마 많이 들어 보셨을 것입니다.

지난 열 해 동안 아희는 밯망희질을 하는데 널리 쓰이고 그 유용성을 인정받았으며, 뭇 학생들의 창의력을 증진시켰고, 아희의 우수성에 감화받은 노르웨이 개발자들은 헌정 음악을 지어 아희를 널리 알리기도 하였습니다. 그러나 이 모든 일에도 불구하고 아희는 그동안 다른 언어로 구현되어야만 했으며, 지난 열 해동안 많은 아희 개발자들의 아희질에도 불구하고 우리 글자로 우리 프로그래밍을 하려는 꿈은 이루어지지 못 했습니다.

그러나 그것도 이제 옛 말입니다. 국제 아희 개발자 기구는 오는 568½돌 한글날을 맞이하여 아희아희를 소개합니다.

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

놀랍게도, 아희 구현의 성능을 시험하는데 쓰이는 로고보다도 더 짧고 간명한 코드로 이제 아희를 아희로 돌릴 수 있습니다.

아희아희는 다음과 같은 쉽고 빠른 10단계를 거쳐 사용할 수 있습니다.

  1. 아희아희를 받습니다. https://raw.githubusercontent.com/aheui/aheui.aheui/master/aheui.aheui에서 받으면 됩니다. (위의 코드를 복사해서 붙여넣는 건 추천하지 않습니다. 아래 질문을 참고하세요.)
  2. 원하는 아희 구현체로 돌립니다. 입력으로 코드를 넣으면 됩니다.

더 나은 사용 경험을 위하여 알파희를 쓰는 것을 추천합니다. 알파이썬의 짓(JIT) 지원을 사용하여 현존하는 어느 아희 구현체보다 더 빠르게 아희를 돌릴 수 있습니다. (그리고 아래에서도 언급하겠지만, 사실 아희 구현체의 상태가 가히 좋진 않습니다.)

완벽함

아희아희는 널리 쓰이는 아희 테스트 수트를 완벽하게 통과합니다. 특히 개고생으로 알려진 40열 아희 콰인을 제대로 돌릴 수 있는 몇 안 되는 구현체입니다. 그 밖에도 아희아희는 다음과 같은 특징을 가지고 있습니다.

  • 확장 공간은 구현되어 있지 않으며 스택과 똑같이 취급됩니다.
  • 메모리 크기와 숫자의 제한은 구현체를 따릅니다. 단, 스택 등의 크기가 유한할 경우 사용할 수 있는 스택과 큐 공간의 은 구현체의 한 스택 크기의 반으로 제한됩니다.
  • 코드의 크기는 구현체 스택 하나의 크기로 제한됩니다. 구현체에 제한이 없으면 무한히 큰 코드도 처리할 수 있습니다.
  • 입출력의 인코딩과 숫자의 포맷 등등은 구현체를 따릅니다.
  • 입력이 끝났을 때는 -1을 넣습니다.
  • 가로로 움직일 때 가장자리는 각 줄 별로 크기가 다르며, 가로·세로 불문하고 일단 가장자리를 넘으면 항상 반대쪽의 첫 행과 칸으로 움직입니다.

아희아희 자신은 다음과 같은 구현체를 필요로 합니다.

  • 테스트 수트를 통과합니다.
  • 입력이 끝났을 때 -1을 넣습니다.

안타깝게도 현재 이 조건을 만족하는 구현체는 많지 않습니다. 이 때문에 아희아희는 알파희에서 동작할 것을 염두에 두고 만들어졌습니다. 뭐 어쩔 수 없죠, 아희아희의 존재가 더 좋은 아희 구현체를 만드는 채찍이 될 수 있길 바랄 뿐입니다.

느긋함

바쁜 현대인을 위해 프로그래밍 언어와 그 구현체들은 꾸준히 빨라져 왔습니다. 그 옛날 파이아희에서 돌리는 데만 두 시간이 소요되었던 로고조차 오늘날 알파희에서는 2초도 걸리지 않습니다. 아희아희는 이런 속도 경쟁에 물음표를 던집니다. 꼭 프로그래밍 언어가 빨라야 할까요? 컴파일 시간이 오래 걸리면 놀 시간이 생깁니다! 하물며 실행 시간이 오래 걸리면 얼마나 더 놀 수 있을지 생각해 보세요.

아희아희는 바쁜 일상의 작은 쉼표로서, 그리고 합법적으로 놀 수 있는 수단으로서 세상에서 가장 느긋한 아희 구현체를 목표로 만들어졌습니다. 다행 중 불행으로 알파희는 너무 빨라서 간단한 코드라면 아희아희로도 순식간에 실행되고 맙니다.

$ time $RPAHEUI/aheui-c aheui.aheui < $SNIPPETS/hello-world/hello.puzzlet.aheui
안녕하세요?

real    0m0.018s
user    0m0.016s
sys     0m0.000s

하지만 콰인으로 가면 뭔가 낌새가 보이기 시작하더니,

$ time $RPAHEUI/aheui-c aheui.aheui < $SNIPPETS/quine/quine.puzzlet.40col.aheui > /dev/null

real    0m5.560s
user    0m5.500s
sys     0m0.056s

로고는 전부 돌릴 수조차 없습니다. 성급한 현대인이 컨트롤-씨를 누지른 걸 확인할 수 있습니다.

$ time $RPAHEUI/aheui-c aheui.aheui < $SNIPPETS/logo/logo.aheui
P1 615 810 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ^C

real    0m35.243s
user    0m35.138s
sys     0m0.096s

픽셀 48개를 출력하는데 35초가 걸렸으므로, 50만 픽셀에 육박하는 전체 로고를 출력하는데는 36만초, 즉 대략 나흘이 걸릴 것으로 예상됩니다. 이 정도면 해외여행을 다녀 올 수도 있겠네요.

아흰셉션

하지만 국제 아희 개발자 기구는 여기에서 그치지 않았습니다. 비록 로고는 다 출력하진 못 했지만 헬로 월드 같은 짧은 프로그램은 아희아희로도 충분히 느리지 않습니다. 그러나 아희로 아희를 짰으면, 아희를 아희로 짠 걸 다시 아희로 돌리거나, 아희를 아희로 짠 걸 다시 아희로 돌리는 걸 또 다시 아희로 돌리면 더 느려지지 않을까요?

그래서 해 봤습니다! 아희아희로 돌린 아희아희, 즉 **아희아희아희**입니다. 아까 전에 본 링크 같다고요? 하하, 농담도 심하세요.

$ time cat aheui.aheui <(echo -ne '\0') $SNIPPETS/hello-world/hello.puzzlet.aheui | \
       $RPAHEUI/aheui-c aheui.aheui
안녕하세요?

real    0m7.909s
user    0m7.832s
sys     0m0.076s

$ time cat aheui.aheui <(echo -ne '\0') $SNIPPETS/quine/quine.puzzlet.aheui | \
       $RPAHEUI/aheui-c aheui.aheui | tail -1
봃더떠벓따뎌반발따뫃더떠
real    55m59.972s
user    55m57.222s
sys     0m1.636s

바쁜 현대인의 사정상 로고를 실행해 보진 않았지만, 알파희로 돌린 것보다 대략적으로 400배 느리기 때문에, 로고도 400배 느린 1700일이 걸릴 것이라는 계산이 나옵니다. 아무리 놀고 싶어도 4년 반동안 백수로 있고 싶진 않으므로 뒷일들은 후학들에게 맡깁니다.

  • proto.rs러스트로 만든 프로토타입입니다. 실제 아희아희 코드와 오류 처리를 빼고 같은 동작을 한다고 예상됩니다.
  • aheui.aheuis는 최종 코드를 만드는데 사용한 알파희 중간 어셈블리입니다.
  • test.sh는 프로토타입, 어셈블리, 그리고 최종 코드를 가지고 테스트 수트를 돌립니다. 어셈블리와 최종 코드를 돌리려면 알파희 경로를 $RPAHEUI 환경변수로 함께 줘야 합니다.

많이 받을 것만 같은 질문들

진짠가요? 글쎄요.

어떻게 만든 거에요? 글쎄요...

아흰셉션을 그대로 따라했는데 안 되는데요. 아희아희는 섬세해서 개행문자에 신경을 많이 씁니다. 특히 아희아희 코드 뒤에 개행문자가 붙어 있으면 빈 줄이 하나 더 생겨서 잘못된 코드를 읽어들이게 됩니다. 아희아희 코드가 개행문자 없이 정확히 3249바이트인지 확인해 주세요.

코드가 입력을 받을 때는 어떻게 해야 하나요? 코드를 먼저 쓰고, 널문자(\0)를 넣은 뒤 입력을 넣으면 널문자 뒤로는 그 코드의 입력으로 인식합니다. 널문자가 없으면 입력이 종료되는 대로 코드를 실행하는데, 이 경우 구현체에 따라서는 그 뒤에 따르는 입력을 읽어들이지 못할 수도 있으므로 주의가 필요합니다. 위에서 잠깐 언급되었듯 유닉스 셸이라면 이렇게 실행하면 됩니다.

cat 아희코드 <(echo -ne '\0') 입력 | 아희구현체 aheui.aheui

아희아희아희아희도 가능한가요? 안 해 봤어요. 해 보고 알려 주세요.

저작권은 어떻게 되나요? 한글로 하는 프로그래밍을 널리 퍼뜨리고자 하는 거국적 결단에 따라, 아희아희는 어떤 목적이든 누구나 널리 쓸 수 있습니다. 자세한 것은 LICENSE.txt 파일을 참고하세요.

뭔가 좀 아쉬운데요. 코드에 숨겨져 있는 비밀을 찾아내시면 오는 한글날에 있을 국제 아희 개발자 대회에서 발표할 수 있는 권리를 드립니다.