맨위로가기

말레볼제

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

말레볼제는 1998년에 만들어진 난해한 프로그래밍 언어이다. 최초의 말레볼제 프로그램은 2년 후에 등장했으며, 앤드루 쿡이 설계하고 리스프로 구현된 빔 탐색 알고리즘을 통해 생성되었다. 말레볼제는 튜링 완전성을 갖추지 못했지만, 2000년대 초반부터 암호학적 분석과 튜링 완전성을 위한 시도가 이루어졌다. 2020년에는 리스프 인터프리터가 발표되었고, C 언어 서브셋을 말레볼제 프로그램으로 컴파일하는 기술도 개발되었다. 말레볼제는 세 개의 레지스터와 메모리를 사용하며, 8개의 명령어를 가지고 있다. 또한, Crazy 연산과 암호화 과정을 통해 난해성을 더한다. 말레볼제의 변형으로 Malbolge20, Malbolge-T, Malbolge Unshackled 등이 있으며, "Hello, world" 프로그램과 cat 프로그램의 예시가 있다.

더 읽어볼만한 페이지

  • 영어 기반이 아닌 프로그래밍 언어 - 두리틀 (프로그래밍 언어)
    두리틀은 다국어 지원, 터틀 그래픽스 기반 직관적인 프로그래밍, 충돌 감지, 음악 지원, 프로토타입 기반 객체 지향 특징을 갖춘, 레고 조립 방식의 쉬운 프로그래밍 언어로서 다양한 운영체제와 웹 브라우저를 지원한다.
  • 영어 기반이 아닌 프로그래밍 언어 - 비펀지
    비펀지는 1993년 크리스 프레시에가 만든 자기 수정 능력을 강조하는 2차원 격자 구조의 스택 기반 난해한 프로그래밍 언어이다.
  • 난해한 프로그래밍 언어 - HQ9+
    HQ9+는 간단한 인터프리터 구현이 가능한 난해한 프로그래밍 언어로, 'Hello, world!' 출력, 소스 코드 출력, "99 Bottles of Beer" 가사 출력, 누산기 값 증가의 네 가지 명령을 제공한다.
  • 난해한 프로그래밍 언어 - FRACTRAN
    FRACTRAN은 정수의 소인수 지수를 레지스터로 활용하여 분수 목록을 곱하는 과정을 반복하며 다양한 계산을 수행하는 계산 모델이다.
말레볼제 - [IT 관련 정보]에 관한 문서
개요
유형난해한 프로그래밍 언어, 명령형 프로그래밍, 스칼라, 값-레벨
설계자벤 올름스테드
개발자벤 올름스테드
발표일1998년
영향 받은 언어Brainfuck, INTERCAL (Tri-INTERCAL), Befunge
영향을 준 언어Dis, Malbolge Unshackled
파일 확장자.mal, .mb
타이핑타입 없음
특징
패러다임난해한 프로그래밍 언어

2. 역사

말레볼제는 1998년 벤 올름스테드(Ben Olmstead)가 개발한 난해한 프로그래밍 언어이다. 이름은 단테의 《신곡》 〈지옥편〉에 등장하는 여덟 번째 지옥 고리 '말레볼제'에서 따왔으며, 의도적으로 프로그래밍을 어렵고 혼란스럽게 만든 것으로 유명하다.[13]

언어 발표 초기에는 극심한 난해함으로 인해 첫 프로그램이 등장하기까지 2년이 걸렸고, 개발자 본인조차 직접 프로그램을 작성한 적이 없다고 알려져 있다.[13] 최초의 프로그램은 사람이 아닌, 앤드루 쿡(Andrew Cooke)이 리스프로 구현한 빔 탐색 알고리즘을 통해 자동으로 생성되었다.[2]

이후 여러 연구자들이 말레볼제의 난해함을 극복하려 시도했다. 2000년 앤서니 유하스(Anthony Youhas)는 몇 가지 프로그램을 공개하며 해독의 실마리를 제시했다고 주장했고,[21] 루 셰퍼(Lou Scheffer)는 말레볼제를 암호 시스템으로 분석하여 입력을 출력으로 복사하는 프로그램을 만들었다.[16][22]

올름스테드는 말레볼제가 튜링 완전하지 않고 선형 경계 오토마톤에 해당한다고 보았다.[3] 특히 실용적인 루프 구현은 매우 어려운 과제로 여겨졌으나, 언어 발표 7년 만인 2005년 이자와 히사시(飯澤 恒|이자와 히사시일본어)가 반복문 구현 방법을 제시하고 "99 병의 맥주" 프로그램을 작성하며 가능성을 입증했다.[4]

그 외에도 토마시 베그자노프스키(Tomasz Wegrzanowski)의 프로그램 생성기 개발, 나고야 대학 연구팀의 C 언어 일부 기능 컴파일 연구[23][24][25], 카밀라 세브치크(Kamila Szewczyk)의 리스프 인터프리터 개발[5][6] 등 말레볼제를 다루기 위한 다양한 도구와 연구가 진행되었다. 이러한 노력에도 불구하고 말레볼제는 여전히 가장 이해하고 사용하기 어려운 프로그래밍 언어 중 하나로 평가받는다.

2. 1. 초기 개발

말레볼제는 처음 발표되었을 때 매우 이해하기 어려웠기 때문에, 첫 말레볼제 프로그램이 만들어지기까지 2년이 걸렸다. 심지어 언어의 창시자인 벤 올름스테드(Ben Olmstead) 본인도 말레볼제 프로그램을 작성한 적이 없다.[13] 최초의 프로그램은 사람이 직접 작성한 것이 아니라, 앤드루 쿡(Andrew Cooke)이 설계하고 리스프로 구현한 빔 탐색 알고리즘을 통해 생성되었다.[2]

2000년 8월 24일, 앤서니 유하스(Anthony Youhas)는 자신의 블로그를 통해 "말레볼제의 신비를 벗겨냈다"고 주장하며 여러 문장을 출력하는 세 개의 말레볼제 프로그램을 공개했다.[21] 하지만 그는 프로그램 생성 방법에 대해서는 구체적으로 설명하지 않았다.

이후 루 셰퍼(Lou Scheffer)는 말레볼제에 대한 암호 해독 분석을 발표하고, 입력을 그대로 출력으로 복사하는 간단한 프로그램을 공개했다.[16] 그는 말레볼제를 프로그래밍 언어보다는 암호 시스템으로 간주해야 하며, 몇 가지 취약점이 존재한다고 지적했다.[22] 또한, 그는 원본 인터프리터와 사양을 보존했으며, 말레볼제 프로그래밍 전략과 튜링 완전성에 대한 자신의 견해를 제시했다.[3]

올름스테드는 말레볼제가 튜링 완전하지 않다고 생각했다. 말레볼제 프로그램이 접근할 수 있는 메모리 공간의 한계 때문에 상태 모델이 유한하며, 따라서 선형 경계 오토마톤에 해당한다고 보았다. 말레볼제에서 실용적인 루프를 구현할 수 있는지에 대한 논의가 있었는데, 이는 매우 어려운 과제로 여겨졌으나 발표 후 7년 만인 2005년에 가능한 것으로 밝혀졌다. 최초의 제대로 된 루프와 조건을 포함하는 99 병의 맥주 프로그램은 이자와 히사시(Hisashi Iizawa)에 의해 작성되었다.[4]

2004년 8월 19일, 토마시 베그자노프스키(Tomasz Wegrzanowski)는 임의의 문자열을 출력하는 말레볼제 프로그램을 생성하는 생성기를 만들었다. 이 생성기는 특정 연산(NOP, ROT, Crazy)을 반복하여 원하는 값을 만들어내는 방식으로 작동하며, 이 방식으로 생성된 프로그램은 앤서니 유하스의 프로그램보다 크기가 훨씬 컸다.

2005년, 飯澤 恒|이자와 히사시일본어는 〈難読プログラミング言語Malbolgeにおけるプログラム構成手法|난도쿠 프로그래밍구 겐고 마루보루제 니 오케루 프로구라무 코세이 슈호일본어[4]이라는 논문을 통해 말레볼제에서 반복문을 구현하는 구체적인 방법을 제시했다. 그는 Crazy 연산의 조합으로 덧셈과 같은 기본적인 연산을 구현하고, 메모리 접근을 통해 원하는 값을 얻는 방식을 사용했다. 이후 이자와 등은 말레볼제를 소프트웨어 보호를 위한 난독화 목적으로 활용하는 방안을 연구하기도 했다.[14]

나고야 대학의 酒井 政彦|사카이 마사히코일본어 등은 말레볼제의 프로그램 난독화 가능성에 주목하여, 3단계의 중간 언어와 SAT 솔버를 이용해 말레볼제 프로그램을 생성하는 기법을 제안했다.[23][24] 이 연구를 통해 while 문, 배열, 재귀 함수 등을 포함하는 C 언어의 일부 기능을 말레볼제 프로그램으로 컴파일하는 것이 가능해졌다.[25]

2020년에는 카밀라 세브치크(Kamila Szewczyk)가 말레볼제 언섕클드(Malbolge Unshackled)라는 변형된 말레볼제로 작성된 리스프 인터프리터를 발표하며 언어의 가능성을 더욱 확장했다.[5][6]

2. 2. 난해성 극복

말레볼제는 처음 발표되었을 때 이해하기 매우 어려웠기 때문에, 첫 말레볼제 프로그램이 만들어지기까지 2년이 걸렸다. 심지어 언어 개발자인 벤 올름스테드 본인도 말레볼제 프로그램을 작성한 적이 없다.[13] 최초의 프로그램은 사람이 직접 작성한 것이 아니라, 앤드루 쿡(Andrew Cooke)이 설계하고 리스프로 구현한 빔 탐색 알고리즘을 통해 생성되었다.[2]

2000년 8월 24일, Anthony Youhas는 [https://web.archive.org/web/20071013071419/http://www.antwon.com/index.php?p=234 자신의 블로그]에 "말레볼제의 신비를 벗겨냈다"고 선언하며, 여러 문장을 출력하는 세 개의 말레볼제 프로그램을 증거로 제시하였다.[21] 하지만 그는 프로그램을 만드는 구체적인 방법에 대해서는 언급하지 않았다.

이후 Lou Scheffer는 말레볼제에 대한 암호 해독 분석을 발표하고, 입력을 그대로 출력으로 복사하는 프로그램을 공개했다.[16] 그는 말레볼제를 프로그래밍 언어보다는 암호 시스템으로 간주해야 하며, 몇 가지 취약점이 존재한다고 지적했다.[22] 또한, 그는 말레볼제 프로그램을 작성하는 일반적인 전략과 튜링 완전성에 대한 자신의 생각을 제시하기도 했다.[3]

올름스테드는 말레볼제가 튜링 완전하다고 생각했으나[3], 프로그램이 접근할 수 있는 메모리 공간의 한계 때문에 실제로는 선형 경계 오토마톤에 해당하며 튜링 완전하지 않다는 분석이 있다. 말레볼제에서 의미 있는 루프를 구현할 수 있는지에 대한 논의가 있었는데, 최초의 비종료 루프가 등장하기까지 여러 해가 걸렸으며, 실용적인 루프 구현은 7년 만에 가능한 것으로 밝혀졌다. 복잡한 루프와 조건을 처리하는 99 병의 맥주 프로그램은 2005년 이자와 히사시(飯澤 恒|이자와 히사시일본어)에 의해 작성되었다.[4]

2004년 8월 19일, Tomasz Wegrzanowski는 임의의 문자열을 출력하는 말레볼제 프로그램 생성기를 만들었다. 이 생성기는 특정 연산(NOP, ROT, Crazy)을 반복하여 원하는 값을 만들어내는 방식을 사용하며, 이렇게 만들어진 프로그램은 Anthony Youhas의 프로그램보다 크기가 훨씬 크다.

2005년, 이자와 히사시는 〈난해한 프로그래밍 언어 말레볼제의 프로그래밍 방법(難読プログラミング言語Malbolgeにおけるプログラム構成手法|난도쿠 프로그래밍 겐고 마루보루제 니 오케루 프로그라무 고세이 슈호일본어)〉이라는 논문을 통해 말레볼제에서 반복문을 구현하는 방법을 제시했으며, 그 예제로 "99 병의 맥주" 프로그램을 만들었다.[http://www.sakabe.i.is.nagoya-u.ac.jp/~nishida/DB/pdf/iizawa05ss2005-22.pdf] 그는 Crazy 연산의 조합으로 덧셈 등의 연산을 구현하고, 일정한 횟수만큼 메모리를 접근하여 원하는 값을 만들어 내는 방법을 사용했다. 이자와 등은 소프트웨어 보호를 위한 코드 난독화 목적으로 말레볼제 프로그래밍 가이드를 제안하기도 했다.[14][23][24]

말레볼제의 코드 난독화 응용 가능성에 주목한 나고야 대학의 사카이 마사히코(坂井 正彦) 등은 3단계의 중간 언어와 SAT 솔버를 이용하여 말레볼제 프로그램을 생성하는 기법을 제안했다.[23][24] 이 연구를 통해 while 문, 배열, 재귀 함수 등을 포함하는 C 언어의 일부 기능을 말레볼제 프로그램으로 컴파일하는 것이 가능해졌다.[25]

2020년, 카밀라 세브치크(Kamila Szewczyk)는 말레볼제 언섕클드(Malbolge Unshackled)로 작성된 리스프 인터프리터를 발표했다.[5][6]

2. 3. 튜링 완전성 논쟁과 발전

말레볼제가 처음 발표되었을 때 이해하기 매우 어려웠기 때문에, 첫 말레볼제 프로그램이 만들어지기까지 2년이 걸렸다. 심지어 언어의 창시자인 벤 올름스테드(Ben Olmstead) 본인도 말레볼제 프로그램을 작성한 적이 없다.[13] 최초의 프로그램은 사람이 직접 작성한 것이 아니라, 앤드루 쿡(Andrew Cooke)이 리스프로 구현한 빔 서치 알고리즘을 통해 생성되었다.[2]

2000년 8월 24일, Anthony Youhas는 자신의 블로그에서 말레볼제를 격파하고 해결의 열쇠를 찾았다고 주장하며, 여러 문장을 출력하는 세 개의 말레볼제 프로그램을 증거로 제시했다.[21] 하지만 그는 프로그램을 만드는 구체적인 방법에 대해서는 밝히지 않았다.

이후 루 셰퍼(Lou Scheffer)는 말레볼제를 프로그래밍 언어라기보다는 암호 시스템으로 간주해야 하며, 몇 가지 취약점이 존재한다고 지적했다.[22] 그는 말레볼제에 대한 암호 해독 분석을 게시하고, 이러한 취약점을 이용해 입력된 문자를 그대로 출력하는 프로그램을 공개했다.[16] 또한, 그는 원래 사이트가 사라진 후에도 인터프리터와 사양을 보존했으며, 말레볼제 프로그램 작성 전략과 튜링 완전성에 대한 자신의 견해를 제시했다.[3]

올름스테드는 말레볼제가 튜링 완전하다고 생각했으나, 프로그램이 접근할 수 있는 메모리 공간의 한계 때문에 실제로는 유한 상태 모델이며 따라서 튜링 기계의 정의에 따른 완전성은 가지지 않는다고 보았다. 그는 말레볼제를 선형 경계 오토마톤으로 간주했다. 말레볼제에서 의미 있는 루프를 구현할 수 있는지에 대한 논의가 있었는데, 이는 난제로 여겨졌으나 결국 7년 만에 가능한 것으로 밝혀졌다.[4] 최초의 비종료 루프가 등장하기까지는 여러 해가 걸렸다.

2004년 8월 19일, Tomasz Wegrzanowski는 임의의 문자열을 출력하는 말레볼제 프로그램을 생성하는 생성기를 만들었다. 이 생성기는 특정 연산을 반복하여 원하는 값을 만들어내는 방식으로 작동하며, 이 방식으로 만들어진 프로그램은 Anthony Youhas의 프로그램보다 크기가 훨씬 컸다.

2005년, 이자와 히사시(飯澤 恒|이자와 히사시일본어)는 〈難読プログラミング言語Malbolgeにおけるプログラム構成手法|난해한 프로그래밍 언어 말레볼제에서의 프로그래밍 기법일본어〉이라는 논문을 통해 말레볼제에서 반복문을 구현하는 방법을 제시했다. 그는 이 방법의 예시로 복잡한 루프와 조건 처리가 필요한 "99 병의 맥주" 프로그램을 성공적으로 작성했다.[4] 이는 말레볼제가 발표된 지 7년 만에 등장한 제대로 된 프로그램으로 평가받는다. 그는 Crazy 연산의 조합으로 덧셈과 같은 기본적인 연산을 구현하고, 메모리 접근을 통해 원하는 값을 만들어내는 기법을 사용했다. 이자와 등은 이후 말레볼제를 소프트웨어 보호를 위한 코드 난독화 목적으로 활용하는 방안을 제안하기도 했다.[14]

나고야 대학의 사카이 마사히코 등은 말레볼제의 코드 난독화 응용 가능성에 주목하여, 3단계 중간 언어와 SAT 솔버를 이용해 말레볼제 프로그램을 생성하는 기법을 제안했다.[23][24] 이 연구를 통해 while 문, 배열, 재귀 함수 등을 포함하는 C 언어의 일부 기능을 말레볼제 프로그램으로 컴파일하는 것이 가능해졌다.[25]

2020년에는 카밀라 세브치크(Kamila Szewczyk)가 말레볼제 언섕클드(Malbolge Unshackled)라는 변형 언어로 작성된 리스프 인터프리터를 발표하며 말레볼제 연구의 새로운 가능성을 열었다.[5][6]

3. 구성

말레볼제는 삼진법 가상 머신, 즉 말레볼제 인터프리터를 위한 기계어이다.[9] 이 언어는 특유의 복잡성과 난해함으로 잘 알려져 있다.

표준 인터프리터와 공식 사양 사이에는 약간의 차이가 존재한다.[9] 예를 들어, 표준 컴파일러는 ASCII 코드 33부터 126까지의 범위를 벗어나는 데이터가 입력될 경우 실행을 중단하도록 설계되었다. 이는 초기에 버그로 간주되었으나, 개발자 벤 올름스테드(Ben Olmstead)는 이를 의도된 사양이며, 오히려 기존 공식 사양에 오류가 있었다고 밝혔다.[13] 말레볼제의 구체적인 작동 방식은 레지스터, 메모리 구조, 명령어 세트 등을 통해 정의된다.

3. 1. 레지스터

말레볼제에는 다른 프로그래밍 언어의 변수와 유사한 역할을 하는 세 개의 레지스터, 즉 '''''a''''', '''''c''''', '''''d'''''가 있다. 프로그램이 실행될 때 이 세 레지스터의 값은 모두 0으로 초기화된다.

  • '''''a''''' 레지스터는 '누산기'(Accumulator) 역할을 한다. 메모리에 값을 쓰는 연산의 결과가 이 레지스터에 저장되며, 입출력 작업에도 사용된다.
  • '''''c''''' 레지스터는 '코드 포인터'(Code Pointer)로, 현재 실행해야 할 명령어가 있는 메모리 위치를 가리키는 특별한 프로그램 카운터이다.[10][27]
  • '''''d''''' 레지스터는 '데이터 포인터'(Data Pointer)이다. 데이터 조작 명령어가 사용할 메모리 주소를 가리키며, 명령어가 하나 실행될 때마다 자동으로 값이 1씩 증가한다.


코드 설명 등에서 '''''[d]'''''라는 표기는 '''''d''''' 레지스터가 저장하고 있는 메모리 주소에 실제로 들어있는 값을 의미한다. 이는 레지스터 간접 주소 지정 방식과 유사하다. '''''[c]'''''도 같은 방식으로 이해할 수 있다.

3. 2. 메모리

가상 머신은 59,049 (310) 개의 메모리 공간을 가지며, 각각 10자리의 삼진수를 저장할 수 있다. 각 메모리 공간에는 0부터 59048까지의 메모리 주소가 할당되며, 0부터 59048까지의 값을 가질 수 있다. 이 상한을 초과하여 증가시키면 0으로 돌아간다.

이 언어는 데이터와 명령어를 위해 동일한 메모리 공간을 사용한다. 이는 x86 아키텍처와 같은 하드웨어의 작동 방식에 영향을 받았다.[29][13]

말레볼제 프로그램이 시작되기 전에, 메모리의 첫 번째 부분은 프로그램으로 채워진다. 프로그램에 포함된 모든 공백 문자는 무시되며, 프로그래밍을 더 어렵게 만들기 위해 프로그램의 나머지 부분은 아래에 설명된 명령어 중 하나로 시작해야 한다.

메모리의 나머지 공간은 이전 두 메모리 주소에 대한 ''crazy'' 연산(아래 참조)을 사용하여 채워진다 ('''[m] = crz [m - 2], [m - 1]'''). 이 방식으로 채워진 메모리는 12개의 주소마다 값이 반복되는 패턴을 보인다.

공식 사양은 ''crazy'' 연산을 사용하여 두 번째 메모리 위치를 채우려고 할 때 '''[m - 2]'''가 프로그램 메모리 영역 외부를 가리키는 1-명령어 프로그램의 예외적인 경우를 다루지 않는다. 참조 구현 역시 이 경우를 명시적으로 고려하지 않아 정의되지 않은 동작이 발생할 수 있다.[11]

2007년, Ørjan Johansen은 임의의 메모리 제한이 없는 Malbolge Unshackled 버전을 만들었다. 이는 Malbolge의 기본 정신을 최대한 유지하면서 튜링 완전한 언어를 만들려는 시도였다. 다른 규칙은 변경되지 않았으며, 메모리 제한에 도달하지 않는 모든 기존 Malbolge 프로그램은 이 버전에서도 완전히 작동한다.[28][12]

3. 3. 포인터 표기법

말레볼제에는 다른 언어들의 변수와 유사한 역할을 하는 세 개의 레지스터, 즉 '''''a''''', '''''c''''', '''''d'''''가 있다. 프로그램이 시작될 때 이 세 레지스터의 값은 모두 0이다.

  • '''''a'''''는 어큐뮬레이터(Accumulator)의 약자로, 메모리 쓰기 명령이나 표준 입출력에 사용된다.
  • '''''c'''''는 코드(Code) 포인터로, 현재 실행 중인 명령을 가리키는 프로그램 카운터 역할을 한다.[27]
  • '''''d'''''는 데이터(Data) 포인터이다. 이 레지스터는 각 명령이 실행된 후 자동으로 증가하며, 가리키는 메모리 주소는 데이터 조작 명령에 사용된다.


포인터 표기법에서 '''''[d]'''''는 '''''d''''' 레지스터에 저장된 값을 메모리 주소로 사용하여, 해당 주소에 저장된 실제 값을 의미한다. 이는 레지스터 간접 주소 지정 방식이다. '''''[c]''''' 역시 동일한 방식으로 '''''c''''' 레지스터가 가리키는 주소의 값을 나타낸다.

3. 4. 명령어

mov a, [d][d]의 값을 1자리 회전시킨다 (예: 00021111122000211111가 된다). 결과를 [d]a에 대입한다.40mov d, [d][d]의 값을 d에 대입한다.62crz [d], a
mov a, [d][d]의 값과 a의 값의 crazy 연산 (후술)을 한다. 결과를 [d]a에 대입한다.68nop아무것도 하지 않는다.81end말볼제 프로그램을 종료한다.(상기 이외)68과 같다 (아무것도 하지 않는다). 상기 이외의 값은 프로그램 로드 직후에는 허용되지 않지만, 실행 중에는 허용된다.



각 명령어가 실행된 후, '''[c]'''를 암호화 (후술) 한다. 이로 인해 암호화되는 명령어는, 점프 명령어가 실행된 경우에는 점프 대상의 명령어, 그렇지 않은 경우에는 실행된 명령어이다. 암호화에 의해, 다음에 같은 번지로 처리가 돌아와도 다른 처리가 실행된다. 암호화 후, '''c'''와 '''d'''가 1씩 증가하고, 다음 명령어가 실행된다.

3. 5. Crazy 연산

두 숫자를 3진법으로 표현했을 때, 각 자릿수에 대해 아래 표의 규칙을 적용하여 새로운 숫자를 얻는 연산이다.[13][14][29][30] 예를 들어, '''crz 0001112220, 0120120120'''의 결과는 1001022211이다.

''Crazy'' 연산
crz입력 2
012
입력 10100
1102
2221


3. 6. 암호화

명령 실행 후, 포인터 ''c''가 가리키는 주소(''\'[c]''\')의 값은 94로 모듈로 연산한 값으로 대체된다. 즉, `[c] = [c] % 94` 연산이 이루어진다. 그 후, 이 결과값은 다음 두 가지 동등한 방법 중 하나를 통해 암호화되어 다시 ''\'[c]''\'에 저장된다.

; 방법 1: 아래 문자열에서 결과값에 해당하는 인덱스의 문자를 찾는다. 해당 문자의 ASCII 코드를 ''\'[c]''\'에 저장한다.

```text

0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999

0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb

```

; 방법 2: 아래 표에서 결과값에 해당하는 '암호화된 값'을 찾아 ''\'[c]''\'에 저장한다.

결과값암호화된 값결과값암호화된 값결과값암호화된 값결과값암호화된 값결과값암호화된 값
057191083811357917679
1109201253911658377765
26021824012159927849
34622694110260517967
4842311142114611008066
58624107433662768154
69725784440634382118
79926584511964818394
89627354610165598461
91172863475266628573
108929714812367858695
11423034498768338748
1277311055080691128847
13753264514170748956
143933535272718390124
1588341225345725591106
1612635935490735092115
1712036385511074709398
186837103564475104



Lou Scheffer는 말레볼제 암호화 과정의 순열에서 6개의 서로 다른 사이클(주기)이 존재함을 분석했다. 각 사이클은 다음과 같다.



이러한 사이클들은 특정 작업을 반복적으로 수행하는 루프를 만드는 데 사용될 수 있다. Lou Scheffer는 이 원리를 이용하여 사용자의 입력을 그대로 출력하는 말레볼제 프로그램을 작성하기도 했다.

4. 예제 프로그램

말레볼제 언어로 작성된 몇 가지 예제 프로그램이 있다. 대표적으로 "Hello, world."를 출력하는 프로그램과 유닉스의 cat 명령어처럼 동작하는 프로그램이 있다. 각 프로그램의 상세 내용과 코드는 하위 섹션에서 확인할 수 있다.

4. 1. Hello, world 프로그램

다음 말레볼제 프로그램은 "Hello, world"를 출력한다.



(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**

hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<


4. 2. cat 프로그램

이 프로그램은 사용자로부터 문자열을 읽어들여 유닉스 cat 명령줄 유틸리티와 유사하게 해당 문자열을 출력한다.[8]

```text



(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/.

~P<

<:(8&

66#"!~}|{zyxwvu

gJ%


5. 변형

말볼제는 메모리 제한으로 인해 튜링 완전 언어가 아니다. 그러나 순차적 실행, 반복, 조건부 실행을 지원한다. 튜링 완전한 버전의 말볼제를 만들기 위한 몇 가지 시도가 있었다.

6. 난독화 및 응용

말볼제(Malbolge)는 처음 등장했을 때 이해하기 매우 어려워서, 첫 번째 말볼제 프로그램이 세상에 나오기까지 2년이라는 시간이 걸렸다. 심지어 말볼제를 만든 벤 올름스테드 본인조차 말볼제 프로그램을 직접 작성한 적이 없다고 알려져 있다.[13] 최초의 프로그램은 사람이 직접 짠 것이 아니라, 앤드루 쿡(Andrew Cooke)이 설계하고 리스프(LISP)로 구현한 빔 서치 알고리즘을 통해 자동으로 생성된 것이었다.[2]

2000년 8월 24일, 앤서니 유하스(Anthony Youhas)는 자신의 블로그를 통해 말볼제를 분석하여 해결의 실마리를 찾았다고 주장하며, 여러 문구를 출력하는 3개의 말볼제 프로그램 코드를 그 증거로 제시했다.[21] 하지만 그가 사용한 구체적인 방법은 공개되지 않았다.

이후 루 셰퍼(Lou Scheffer)는 말볼제에 대한 암호 해독 결과를 발표하며, 입력을 그대로 출력으로 복사하는 프로그램을 예시로 제공했다.[16] 그는 말볼제를 단순한 프로그래밍 언어라기보다는 일종의 암호 시스템으로 봐야 한다고 주장하며, 이 관점에서 말볼제가 가진 몇 가지 취약점을 지적했다.[22] 또한 그는 이러한 취약점을 이용하면 말볼제 프로그램을 작성하는 것이 가능하다고 설명했다. 셰퍼는 말볼제 원본 사이트가 사라진 후에도 원래의 인터프리터와 사양 문서를 보존했으며, 말볼제 프로그래밍의 일반적인 전략과 튜링 완전성에 대한 자신의 생각을 제시하기도 했다.[3]

한편, 올름스테드는 말볼제를 선형 경계 오토마톤의 일종으로 생각했다. 말볼제에서 의미 있는 반복문(루프)을 구현하는 것이 가능한지에 대한 논의가 있었는데, 실제로 최초의 무한 루프가 아닌 제대로 작동하는 루프가 등장하기까지는 여러 해가 걸렸다. 복잡한 루프와 조건 처리가 필요한 99 병의 맥주 문제를 해결하는 프로그램은 말볼제가 발표된 지 7년이 지난 2005년에야 히사시 이자와(Hisashi Iizawa)에 의해 처음으로 작성되었다.[4]

말볼제의 극단적인 난해함은 오히려 프로그램 난독화에 응용될 가능성을 보여주었다. 히사시 이자와 등은 소프트웨어 보호를 위한 난독화 기법으로 말볼제를 활용하는 프로그래밍 가이드를 제안하기도 했다.[14] 나고야 대학의 사카이 마사히코 연구팀은 말볼제의 난독화 가능성에 주목하여, 3단계의 중간 언어와 SAT 솔버를 이용해 말볼제 프로그램을 자동으로 생성하는 기법을 개발했다.[23][24] 이 연구를 통해 while 문, 배열, 재귀 함수 등을 포함하는 C 언어의 일부 기능을 말볼제 코드로 컴파일하는 것이 가능해졌다.[25]

가장 최근인 2020년에는 카밀라 세브치크(Kamila Szewczyk)가 말볼제 언섕클드(Malbolge Unshackled)라는 이름으로 작성된 리스프 인터프리터를 발표하기도 했다.[5][6]

참조

[1] 웹사이트 Malbolge - Esolang https://esolangs.org[...] 2022-08-27
[2] 웹사이트 malbolge: hello world https://www.acooke.o[...] 2021-01-08
[3] 웹사이트 Malbolge - Programming language http://progopedia.co[...] Progopedia 2012-05-11
[4] 웹사이트 Language Malbolge http://www.99-bottle[...] 99 Bottles of Beer 2005-12-29
[5] 간행물 kspalaiologos/malbolge-lisp https://github.com/k[...] 2021-03-23
[6] 웹사이트 Malbolge (a second look) https://oklo.org/202[...] 2023-10-24
[7] 간행물 kspalaiologos/hello.mb https://gist.github.[...] 2021-03-23
[8] 웹사이트 Malbolge cat https://lutter.cc/ma[...] 2022-08-28
[9] 웹사이트 Malbolge http://www2.latech.e[...] 2017-06-09
[10] 웹사이트 Malbolge Specification http://www.lscheffer[...] 2017-06-09
[11] 웹사이트 Malbolge reference interpreter https://www.lscheffe[...] 2024-09-27
[12] 웹사이트 An interpreter for the Malbolge Unshackled dialect http://oerjan.nvg.or[...] 2017-06-09
[13] 웹사이트 Interview with Ben Olmstead https://esoteric.cod[...] 2021-01-07
[14] 웹사이트 Programming Method in Obfuscated Language Malbolge http://www.sakabe.i.[...] Nagoya University 2017-06-09
[15] 웹사이트 Malbolge20 - Esolang https://esolangs.org[...] 2022-12-12
[16] 웹사이트 Introduction to Malbolge http://www.lscheffer[...] 2017-06-09
[17] 웹사이트 Malbolge Unshackled https://esolangs.org[...] 2024-12-03
[18] 문서 正確には、Malbolgeは言語仕様によりメモリが有限に制限されているため弱チューリング完全である。
[19] 논문 難解言語Malbolgeのチューリング完全性について 一般社団法人電子情報通信学会 2010-10
[20] Wayback The Random Programming Languages List http://www.mines.edu[...] 2004-04-04
[21] Wayback Antwon, Malbolge guru http://www.antwon.co[...] 2007-10-13
[22] URL http://www.lscheffer[...]
[23] 논문 Malbolgeの高級アセンブリ言語への配列機能の追加 一般社団法人電子情報通信学会 2012-05
[24] 논문 Malbolge低級アセンブリプログラミングにおける制御命令の配置設計のためのSATソルバの利用 一般社団法人電子情報通信学会 2013-01
[25] 논문 再帰呼び出しを持つC言語サブセットからMalbolgeへのコンパイラ 一般社団法人電子情報通信学会 2017-07
[26] 웹사이트 Malbolge http://www2.latech.e[...] 2017-06-09
[27] 웹사이트 Malbolge Specification http://www.lscheffer[...] 2017-06-09
[28] 웹사이트 An interpreter for the Malbolge Unshackled dialect http://oerjan.nvg.or[...] 2017-06-09
[29] 웹사이트 Interview with Ben Olmstead https://esoteric.cod[...] 2021-01-07
[30] 웹사이트 難読プログラミング言語Malbolgeにおけるプログラム構成手法 http://www.sakabe.i.[...] 名古屋大学 2017-06-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com