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 레지스터는 현재 실행되는 명령을 가리키는 특수한 용도로 사용된다. 기본적으로 메모리는 삼진수 숫자로 저장되며, 메모리 공간은 310개인 59049개다. 이 각각의 공간에는 0부터 59048까지의 주소가 붙어있고, 0부터 59048까지의 값을 저장할 수 있다. 이 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
브레인퍽 이나 Ook!, 비펀지, 화이트스페이스와 같은 언어들의 경우 그래도 일단 기호가 어떤 역할을 하는지 익히고, 머리좀 싸맬 자신만 있다면 Hello,World! 출력과 같은 간단한 프로그램 정도는 어떻게 동작하는지 프로그램을 분석할 수 있지만.. 이놈은... 진짜 자신이 폰 노이만급으로 기계어의 코딩을 자유자재로 할 수 있는 괴수라거나 새디스트가 아닌 이상은 위 코드가 어떻게 Hello,World!란 문장을 출력하는지 알아보려 하지 않는게 좋다. 정말로.
Malbolge로 작성된 99병의 맥주 소스 코드.#

4. 기타


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

크리에이티브 커먼즈 라이선스

이 저작물은 CC BY-NC-SA 2.0 KR 에 따라 이용할 수 있습니다. (라이선스가 별도로 명시된 경우 제외)
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.