최근 수정 시각 : 2024-03-20 19:51:43

Malbolge


1. 개요2. 상세3. 이 언어로 쓰인 프로그램
3.1. 실행기3.2. 예제
4. 기타

1. 개요

벤 올름스테드(Ben Olemstead)가 1998년에 만든 난해한 프로그래밍 언어. 이름은 단테신곡 지옥편에 나오는 지옥 중 제8옥인 말레볼제(Malebolge)에서 왔다.

이름부터가 개념인 이 언어의 가장 큰 특징은, 현존하는 모든 언어중 가장 난해한 프로그래밍 언어라는 것이다. 실제로 벤 올름스테드는 Malbolge외에도 Gis라는 난해한 프로그래밍 언어를 만들거나, Esoteric Awards이라는 난해한 프로그래밍 언어 대회 따위를 만들거나 했다.

기본적으로 정말 더럽고 어렵고 복잡해서 첫 Malbolge 프로그램이 만들어지기까지 장장 2년이라는 세월이 걸렸다. 그것도 사람의 손으로 쓰인 것이 아니라, LISP로 구현된 빔 탐색 알고리즘을 통해서 만들어진 것.#

그 후에도 프로그램이 매우 간간이 제작되었는데, 예를 들자면 Malbolge를 통한 민감한 루프는 Malbolge가 나온 지 7년만에 구현되었다. 사실 이것도 처음에는 구현이 가능한지 논란이 있었다.

2. 상세

Malbolge는 3진법 가상 머신인 Malbolge 인터프리터의 기계어다. a, c, d의 세 레지스터를 사용하는데, 그 중 c 레지스터는 현재 실행되는 명령을 가리키는 특수한 용도로 사용된다. 기본적으로 메모리는 3진수 숫자로 저장되며, 메모리 공간은 310개인 59049개다. 이 각각의 공간에는 0부터 59048까지의 주소가 붙어 있고, 0부터 59048까지의 값을 저장할 수 있다.[1] 이 Malbolge 프로그램이 시작되기 전에, 메모리의 앞부분이 프로그램으로 채워진다. 프로그램에 들어 있는 모든 공백문자는 사라지고, 더욱 더 사용자들을 엿먹이기 위해 공백 문자를 제외한 프로그램은 특정한 명령 중 하나로 시작되어야 한다.
나머지 메모리 공간은 Crazy 연산이라는, 이름부터 간지가 넘치는 연산으로 계산한 값으로 채워진다. 이 Crazy 연산의 식은 [m]=crz[m-2], [m-1]으로 나타내어지는데, 두 숫자의 각각의 3진법 자리마다 다음의 표를 적용해서 결과를 얻는다. 예를 들자면 crz 0001112220, 0120120120의 결과는 1001022211이 되는 식. 한번 계산해보자.
crz Input 2
0 1 2
input 1 0 1 0 0
1 1 0 2
2 2 2 1

명령도 골때리는데, Malbolge에 존재하는 여덟 개의 명령은 [c]값에 c를 더하고, 그 값을 94로 나눈 나머지에 따라 어떤 명령을 실행할지 결정한다. 이때 c는 레지스터 값의 메모리 주소, [c]는 그 주소에 저장된 값이다. 여덟 개의 명령에 속하지 않는 모든 값은 그냥 아무것도 하지 않는다.

명령이 실행된 후에, 해당 명령은 또 암호화가 되어서, 이동 명령이 실행되지 않으면 다음에 실행됐을 때 같은 역할을 하지 않는다! 이동 명령이 실행되면 이동된 위치 바로 앞에 있는 명령이 암호화된다. 암호화 과정도 황당한데, 일단 [c]의 값이 94보다 작을 때까지 94를 빼고, 특수한 표에서 결과값을 찾은 후 그 값을 [c]에 저장하는 방식. 그런 다음에는 c와 d의 값이 1씩 증가하고 다음 명령이 실행된다.

3. 이 언어로 쓰인 프로그램

3.1. 실행기

Malbolge 코드를 실행하기 위한 인터프리터는 다음 주소에서 구할 수 있다:
인터프리터
벤 올름스테드가 C언어로 구현한 버전이다.
이곳에서 파이썬으로 작성된 버전도 실행해 볼 수 있다.

3.2. 예제

다음은 Malbolge의 Hello, world! 프로그램이다.

Hello, world.를 출력하는 버전.
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**
hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<


HEllO WORld를 출력하는 버전.
(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm


브레인퍽이나 Ook!, 비펀지, 화이트스페이스와 같은 언어들의 경우 그래도 일단 기호가 어떤 역할을 하는지 익히고, 머리좀 싸맬 자신만 있다면 Hello,World! 출력과 같은 간단한 프로그램 정도는 어떻게 동작하는지 프로그램을 분석할 수 있지만... 이놈은... 진짜 자신이 폰 노이만급으로 기계어 코딩을 자유자재로 할 수 있는 괴수라거나 새디스트가 아닌 이상은 위 코드가 어떻게 Hello,World!란 문장을 출력하는지 알아보려 하지 않는게 좋다. 정말로.

Malbolge로 작성된 99병의 맥주 소스 코드.# 굉장히 길어서 분석이 불가능에 가까울 정도이며, 이 때문에 루프문을 구현하지 않고 그냥 문장 출력을 99개 늘어놓은 하드코딩 아니냐는 의혹이 돌아서 작성자가 부정할 정도. 얼핏 봤을때 뭔가 반복되는 듯한 모습이 보이기는 하는데 작성자 발언을 참고하면 인터프리터에 들어가면 없어지는 부분인 듯. 댓글중에 기어이 분석해낸 댓글이 있으니 정 궁금한 사람은 참고해볼만 하다.

4. 기타

파일:malebolge.png
[2]
몇 가지 프로그래밍 언어의 난해한 정도를 비교한 xkcd 편집짤도 있다.[3] 위 만화에서 Malbolge 왼쪽에 있는 Haskell도 순수 함수형 언어라는 특성상 정상적인 프로그래밍 언어 중에서는 어렵고 비실용적인 것으로 유명하며, 학술 목적으로 만들어진 만큼 대부분의 프로그래머들은 쓸 일이 없다. 그래도 수리논리학 전공자들은 만져볼 기회가 있기에 아예 실용성이 전무한 Malbolge와는 비교가 불가능하다.

파생언어로 Malbolge Unshackled가 존재한다. 자체적으로 정의된 메모리 용량 한계를 없앰으로써 튜링 완전하게 만드려고 시도한 언어.

네이버 웹툰 꿈의 기업에는 인공지능을 Malbolge로 작성하는 천재 프로그래머가 등장한다.[4]


[1] 여담으로 언어 자체적으로 정의된 이 메모리 용량의 한계때문에 이 언어는 튜링 완전하지 않다고 한다.[2] "난이도에 따라 나열된 언어들"이라는 제목 아래에 오른쪽으로 갈수록 기본적인 회화에 쓰는 언어부터 오른쪽으로 갈수록 Python, C, 리스프, 하스켈의 순서대로 난이도가 높아지더니 그 끝에서 말레볼제가 "오, 안녕. 거기 너희들이 도통 보이질 않아."라며 여태 나열된 언어들을 쳐다보고 있다.[3] 원본은 학문의 "순수성"을 비교한 만화다.[4] 물론 픽션이니까 가능한것이다. 현실은 BrainFuck조차 해당 프로그램 선에서 구현한 가장 복잡한 프로그램이 만델브로 집합, 하노이의 탑(이상 둘은 아스키 아트로 구현), 콘웨이의 생명 게임 정도다. 그리고 99병의 맥주 같은 간단한 코드도 저 지경으로 길게 늘어지니 용량이나 유지보수 문제도 생길 것이다. Unshackled라면 몰라도 오리지널은 물리적으로 불가능한게 당장 99병의 맥주 소스코드마저도 자체 메모리 한계를 겨우 충족해냈다.