컴퓨터가 가장 잘 이해할 수 있는 언어는 물론 기계어입니다. 영화 같은 데서 0과 1의 조합으로 표현되는 게 바로 이거죠. 하지만 0과 1만으로 프로그램을 짜야 했다면 소프트웨어 개발자들의 원성이 드높았을 것입니다. 그래서 실제로는 기계어 대신, 사람의 언어에 가까운 '프로그래밍 언어'라는 것으로 우선 코드를 작성한 후 나중에 '컴파일러'라는 번역기를 이용하여 기계어로 자동 변환합니다.
프로그래밍 언어는 사람이 사용하는 언어이므로 대체로 읽고 쓰기 쉬울 것을 목표로 합니다. 다음은 대표적인 프로그래밍 언어들의 예제 코드입니다:
----
파이선:
print("안녕, 세상아!")
러스트:
fn main() {
println!("안녕, 세상아!");
}
하스켈:
main = putStrLn "안녕, 세상아!"
----
위에서 나열한 코드는 '안녕, 세상아!'(또는, 'Hello, world!')를 화면에 출력하는 프로그램을 언어별로 작성한 것입니다. 'Hello, world!'는 어떤 프로그래밍 언어에 새로 입문하는 사람에게 이 언어가 어떻게 생겼는지 간략하게나마 소개할 목적으로 자주 이용되는 예제입니다.
보다시피 꽤나 다르긴 하지만, 대체로 로마자 및 영어 표현, 그리고 기호로 이루어져 있습니다. 훈련된 프로그래머는 이러한 코드를 보고 이것이 어떤 일을 하는 프로그램인지 알 수 있습니다. 설계도를 보는 것과 비슷합니다.
하지만 할 일 없는 사람은 어디에나 존재하기 마련입니다. 어떤 프로그래머들은 프로그래밍 언어란 기묘하면 기묘할수록 재밌다고 생각했습니다. 그래서 평범한 방식과 다르게, 재미를 목적으로 일부러 특이한 언어들을 만들어 냈습니다. 이것을 'esoteric programming language'라고 합니다.
다음은 제가 지금까지 본 esoteric 언어들 중에 특기할 만한 것들입니다:
----
* Whitespace
이 언어는 '스페이스'와 '탭', '엔터'만으로 이루어져 있습니다. 다음은 이 언어로 작성한 'Hello, world!'를 출력하는 프로그램입니다:
"
"
보다시피 아무 것도 안 보입니다. 워드프로세서에 붙여 넣고 스페이스를 빨간색으로, 탭을 파란색으로 칠하면 비로소 윤곽이 드러납니다.
원리는 간단합니다. 스페이스가 0이고 탭이 1입니다. 0과 1만 있으면 모든 숫자를 표현할 수 있고, 각 숫자를 각 문자에 대응시킬 수 있으니까, 화이트스페이스도 모든 글자를 표현할 수 있는 거죠. 모스 부호를 아시는 분이라면 그것과도 비슷하다고 할 수 있겠습니다.
----
* Velato
이 언어는 코드를 악보로 나타냅니다. 두 말 할 필요 없이 그림으로 설명 가능합니다:
이렇게 만들어진 악보는 실제로 연주할 수도 있습니다. 언어를 만든 사람의 말에 따르면 재즈 음악처럼 들리는 것을 목표로 만들었다고 합니다. 한번 들어 보시죠:
http://abyrne.me/files/HelloVelato.mp3
----
* Piet
이 언어는 추상화처럼 보이는 것을 목표로 하고 만들었습니다.
이미 '언어'라고 하기에는 좀 멀리 간 것 같지만, 어쨌든 이것도 프로그램이며 컴파일러만 설치하면 완벽하게 동작합니다.
----
* 2014
이 언어는 프로그래머가 입력한 코드가 무엇이든 상관 없이 동일한 동작을 합니다. 이 언어로 작성된 모든 프로그램은 2014년 한 해 동안에는
무조건 "Hello, world!"를 출력하게 됩니다. 그러나 2014년 이후에는 그저 오류를 내뿜습니다.
이 언어가 발표된 시점은 2014년 12월 31일 20시 9분이었습니다. 그리하여 올해가 가기 전까지 이 언어로 무언가를 만들어 보려는 경주가 있었고, 20분 후인 20시 30분에 이 언어를 해석할 수 있는 첫 컴파일러가 탄생했습니다. 그리고 4시간 후에 이 언어는 영영 못 쓰게 되었습니다.
----
* HQ9+
딱 네 가지 일만 할 수 있는 프로그래밍 언어입니다. 'H'는 'hello, world'를 출력하고, Q는 소스 코드를 표시하고, 9는 '99병의 맥주'라는 노래의 가사를 출력합니다.
이 프로그램으로 'Hello, world!'를 짜면 다음과 같습니다:
H
아마 이 세상에서 가장 짧은 코드로 'Hello, world!'를 출력할 수 있는 언어일 것입니다.
----
* Chef
요리 레시피처럼 보이게 할 목적으로 만든 프로그래밍 언어입니다. 다음은 'Hello, world!'를 출력하는 코드입니다:
Hello World Cake with Chocolate sauce.
This prints hello world, while being tastier than Hello World Souffle. The main
chef makes a " world!" cake, which he puts in the baking dish. When he gets the
sous chef to make the "Hello" chocolate sauce, it gets put into the baking dish
and then the whole thing is printed when he refrigerates the sauce. When
actually cooking, I'm interpreting the chocolate sauce baking dish to be
separate from the cake one and Liquify to mean either melt or blend depending on
context.
Ingredients.
33 g chocolate chips
100 g butter
54 ml double cream
2 pinches baking powder
114 g sugar
111 ml beaten eggs
119 g flour
32 g cocoa powder
0 g cake mixture
Cooking time: 25 minutes.
Pre-heat oven to 180 degrees Celsius.
Method.
Put chocolate chips into the mixing bowl.
Put butter into the mixing bowl.
Put sugar into the mixing bowl.
Put beaten eggs into the mixing bowl.
Put flour into the mixing bowl.
Put baking powder into the mixing bowl.
Put cocoa powder into the mixing bowl.
Stir the mixing bowl for 1 minute.
Combine double cream into the mixing bowl.
Stir the mixing bowl for 4 minutes.
Liquify the contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.
bake the cake mixture.
Wait until baked.
Serve with chocolate sauce.
chocolate sauce.
Ingredients.
111 g sugar
108 ml hot water
108 ml heated double cream
101 g dark chocolate
72 g milk chocolate
Method.
Clean the mixing bowl.
Put sugar into the mixing bowl.
Put hot water into the mixing bowl.
Put heated double cream into the mixing bowl.
dissolve the sugar.
agitate the sugar until dissolved.
Liquify the dark chocolate.
Put dark chocolate into the mixing bowl.
Liquify the milk chocolate.
Put milk chocolate into the mixing bowl.
Liquify contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.
Refrigerate for 1 hour.
이대로 요리를 만들면 와갤 요리가 되겠죠.
----
* 아희
한글로 만들어진 최초의 (아마 유일한?) esoteric 언어입니다. 다음은 'Hello, world!'를 출력하는 코드입니다:
밤밣따빠밣밟따뿌
빠맣파빨받밤뚜뭏
돋밬탕빠맣붏두붇
볻뫃박발뚷투뭏붖
뫃도뫃희멓뭏뭏붘
뫃봌토범더벌뿌뚜
뽑뽀멓멓더벓뻐뚠
뽀덩벐멓뻐덕더벅
이 코드를 해석하는 방법은 이렇습니다. 일종의 보드 게임이라고 생각하시면 됩니다. 가로 세로 일정한 크기의 맵이 있고, 맨 위 맨 왼쪽에서 시작합니다. 각 위치에 있는 글자들("밤", "밣", "따")는 특정 기능을 수행하는 명령어들입니다. 이때 모음이 다음 위치를 나타냅니다. 즉,
ㅏ -> 오른쪽으로 가시오
ㅓ -> 왼쪽으로 가시오
ㅗ -> 윗쪽으로 가시오
ㅜ -> 아랫쪽으로 가시오
그래서 첫 줄을 보면 마지막 글자 빼고 모두 ㅏ인 것을 알 수 있습니다. 첫 줄 마지막 칸에 도달하면, ㅜ 때문에 아래 방향으로 진행하게 됩니다. 그리고 그 아래쪽으로 있는 칸들 역시 마지막 칸 빼고 모두 ㅜ죠. 그리하여 맨 아래 맨 오른쪽 칸에 도달하면 '벅', 즉 'ㅓ'이기 때문에 왼쪽으로 진행하게 됩니다. 이를 반복하면 나선 모양으로 코드를 수행하게 되죠. 이렇게요.
개인적으로 아주 창의적인 방식이라고 생각합니다.
아희로 작성된 코드를 더 살펴보죠:
육체는 단명하고
근성은 영원한것
방산반밧나뿌서어뎐근성
대류…분선창사반나산분
폭룡이탄뭉폭룡의뇨시볏
최고다아하#김끼룩제작
산발발밥따따빠빠빠빠빠빠빠빠빠뿌
쑱썴썳썲썱썰썯썮썭뻐뻐뻐뻐뻐뻐뻐
쌆쌇쌈쌉쌊쌋쌌쌎반타삱발밦다다숞
뚜벌벋섥더너벅벅설더벓섣더떠벆벆
다삶박다삷밝반따다삸발반따다삹불
숨더더벋떠범범섫더범섪터떠번더벖
받타삽밞밪따반다타삿밪발따반다두
쑼뻐떠범더벐범섳더벑섲더떠벋벍섰
샄반다샅밣밨따수박지민제작붸에엙
아아아아아아유붊다뚜샤먕뿌아아아아아
뿌섢멓뻐섡빠몋발봆숙오뽀처삭뿌뚫맣숮
빠맣맣삳뿌손야몋우바오아아숥차숤뽀뿌
뿌서멓뻐맣셜뷁뽀섵모오아아빠뭏뻐솥뭏
싺삮반반나타우쀼오속여아아어삱빠뫃숝
숢멓뻐섡멓우차솕훍아요아아오멓뭏뻐뿌
뿌빠맣순뽀섵어멓슓오아어아아뽀설솗멓
맣솥먛뻐살빠빠맣뫃아오아아아아어지민
뉴번번섞썪뻐석멓뻐맣숨오아아아아아어
뺘섵맣삱빠맣삸빠뭏뽀뿌아아아맣아불오
타초숦멓뻐섢멓뻐섵솛뭏아숙멓뽀아뿌초
뿌섴빠맣살빠맣샅빠뫃삳빠뽜뫃솤아두회
맣발반따맣삭마반수아숯어바타초아뭏툐
숱멓뻐섡멓섭차붌뼈아뿌노번번머아수소
빠맣삲빠뭏뚜떠반볎아맣샅빠맣아오뿌쏘
뿌섵멓뻐섡맣삼빠뭏아아아아아아아숨도
맣삵빠맣숞숛썫뻐섪오아아아아아어빠본
뭏뻐섡멓뻐받다맣술맣술맣불맣숝오아어아아아아아아아아어
삷빠맣살뿌뿌섵멓뻐뽀뿌뽀뿌또뿌맣숪토맣사마밡밡반다따오
숨멓뻐섵멓맣삱빠맣솘맣솥밤또뭏뽀뿌노뽀설멓뻐섧멓뻐섡멓
빠맣삸빠뭏숨멓뻐섵멓뻐섨멓뻐섫솘뭏뽀맣살빠맣샅빠맣샂뽀
뿌섵멓뻐섮빠맣삸빠맣발빠밤따뚜뫃사본뽀섲멓뻐섡멓뻐섥멓
맣산빠맣숫숨멓더번뻐섨멓뻐섵멓뽀섯멓뻐섡멓뻐섧멓뻐섬뽀
멓뻐섰멓뻐빠맣삵빠빠맣맣샅빠맣삾빠발다맣삲빠맣샅빠뫃솥
밯망히
----
* 호무호무
'호무'만으로 이루어진 프로그래밍 언어입니다. 다음은 'Hello, world!'
호무
호무 호무 호무호무호무호무 호무 호무호무호무호무호무호무 호무호무호무호무호무 호무 호무호무호무호무호무 호무호무호무호무
호무호무호무호무 호무호무호무 호무호무 호무 호무호무 호무호무호무호무호무호무 호무호무호무호무 호무 호무호무
호무 호무호무 호무 호무 호무호무
호무호무 호무호무 호무
호무 호무호무호무 호무호무 호무호무호무호무호무 호무호무호무 호무 호무호무 호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무 호무 호무호무호무호무 호무 호무호무호무호무호무 호무 호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무 호무 호무 호무 호무 호무호무호무 호무호무 호무호무호무호무 호무호무호무호무호무호무호무 호무호무호무호무호무 호무호무호무호무호무호무호무 호무호무호무호무호무호무 호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무 호무호무 호무호무호무호무호무호무 호무호무호무 호무호무호무호무호무호무 호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무 호무호무 호무호무호무호무 호무호무호무 호무호무호무호무 호무호무호무호무 호무 호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무 호무 호무 호무호무호무 호무호무 호무 호무호무호무 호무 호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무 호무호무 호무호무호무호무호무호무호무호무호무호무호무 호무호무호무 호무호무호무호무호무호무호무 호무호무호무호무 호무 호무호무호무호무호무 호무호무호무호무호무호무호무호무 호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무호무호무 호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무 호무호무호무호무호무호무호무호무 호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무 호무호무호무호무호무호무 호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무호무
(원문은 일본어입니다. 출처:
http://yuroyoro.hatenablog.com/entry/20110601/1306908421 )
자세한 설명은 호무호무.
----
* Folders
코드를 작성하려면 파일을 만들어야 한다는 상식을 단호히 거부하는 언어입니다. 다음은 Folders로 짠 'Hello, world!'입니다.
파일은 전혀 없고, 폴더 이름만 가지고 코드를 작성합니다. 가장 최근에 나온 esoteric 언어인데, 꽤나 유쾌했습니다.
평범한 폴더처럼 보이기 위해 'Setup', 'Images', 'Downloads', 'New Folder' 같은 것들을 폴더 이름으로 사용합니다.
----
결론: 공돌이 유머는 역시 재밌다.