말레볼제

**말레볼제**(Malbolge)는 벤 올름스테드(Ben Olemstead)가 1998년에 만든 난해한 프로그래밍 언어로, 그 이름은 단테의 신곡에 나오는 지옥 중 제8옥인 말레볼제에서 왔다. 말레볼제의 특징은 존재할 수 있는 가장 최악의 (가장 어렵고 난해한) 프로그래밍 언어로 설계되었다는 것이다. 하지만 이해를 어렵게 만들기 위해 사용된 방법 중 몇몇은 단순화할 수 있다.
# 역사
말레볼제가 처음 발표되었을 때 매우 이해하기 어려웠기 때문에, 첫 말레볼제 프로그램이 만들어질 때까지는 2년이 걸렸다. 이 프로그램은 사람의 손으로 쓰여진 것이 아니다. 이 프로그램은 앤드루 쿡(Andrew Cooke)이 디자인하고 리스프로 구현된 빔 탐색 알고리즘을 통해서 만들어졌다. 2000년 8월 24일에, Anthony Youhas는 자신의 블로그에 "말레볼제의 신비를 벗겨냈다"고 소개하면서 그 증거로 여러 문장을 출력하는 세 개의 말레볼제 프로그램을 제시하였다. 하지만 그는 그 프로그램을 만드는 방법에 대해서는 언급하지 않았다. 그 뒤, Lou Scheffer가 말레볼제의 암호학적 분석을 하고 입력을 출력으로 되돌리는 프로그램을 공개했다. 올름스테드는 말레볼제가 튜링 완전하다고 생각하였으나, 말레볼제 프로그램이 접근할 수 있는 메모리 공간의 한계 때문에, 말레볼제의 상태 모델은 유한하며 따라서 말레볼제는 튜링 완전하지 않다. 또 다른 흥미로운 제안은 말레볼제로 실용적인 루프를 구현할 수 있느냐는 것인데 이는 7년 만에 가능한 것으로 밝혀졌다. 2004년 8월 19일에, Tomasz Wegrzanowski는 임의의 문자열을 출력하는 말레볼제 프로그램을 생성하는 생성기를 만들었다. 그에 따르면, 이 생성기는 이동 명령을 무시하고, D 레지스터를 메모리의 맨 처음을 가리키게 한 후, A 레지스터가 필요한 값이 될 때까지 NOP, ROT, 그리고 Crazy 연산을 반복하여 원하는 값을 만들어 낸다. 이 방법으로 만들어진 프로그램은 Anthony의 프로그램보다 훨씬 더 크다. 2005년에 이자와 히사시(飯澤 恒)는 〈난해한 프로그래밍 언어 말레볼제의 프로그래밍 방법(難読プログラミング言語Malbolgeにおけるプログラム構成手法〉이라는 논문을 통해 말레볼제에서 반복문을 구현하는 방법을 보였으며, 그 예제로 "99 bottles of beer" 프로그램을 만들었다.url=https://web.archive.org/web/20170623131043/http://www.sakabe.i.is.nagoya-u.ac.jp/~nishida/DB/pdf/iizawa05ss2005-22.pdf 그는 Crazy 연산의 조합으로 덧셈 등의 연산을 구현하고, 일정한 횟수만큼 메모리를 접근해서 원하는 값을 만들어 내는 방법을 사용하였다.
# 말레볼제로 만든 "Hello, world" 프로그램
다음 프로그램은 "Hello, world."라는 문장을 출력한다. (=U!pJS72FhOA1CB6v^=I_0/8|jsb
### 둘째 방법
다음 표에서 결과값을 찾은 후 대응되는 저장할 값을 ***[c***에 저장한다. {| class="wikitable" |- | **0** || 57 || **19** || 108 || **38** || 113 || **57** || 91 || **76** || 79 |- | **1** || 109 || **20** || 125 || **39** || 116 || **58** || 37 || **77** || 65 |- | **2** || 60 || **21** || 82 || **40** || 121 || **59** || 92 || **78** || 49 |- | **3** || 46 || **22** || 69 || **41** || 102 || **60** || 51 || **79** || 67 |- | **4** || 84 || **23** || 111 || **42** || 114 || **61** || 100 || **80** || 66 |- | **5** || 86 || **24** || 107 || **43** || 36 || **62** || 76 || **81** || 54 |- | **6** || 97 || **25** || 78 || **44** || 40 || **63** || 43 || **82** || 118 |- | **7** || 99 || **26** || 58 || **45** || 119 || **64** || 81 || **83** || 94 |- | **8** || 96 || **27** || 35 || **46** || 101 || **65** || 59 || **84** || 61 |- | **9** || 117 || **28** || 63 || **47** || 52 || **66** || 62 || **85** || 73 |- | **10** || 89 || **29** || 71 || **48** || 123 || **67** || 85 || **86** || 95 |- | **11** || 42 || **30** || 34 || **49** || 87 || **68** || 33 || **87** || 48 |- | **12** || 77 || **31** || 105 || **50** || 80 || **69** || 112 || **88** || 47 |- | **13** || 75 || **32** || 64 || **51** || 41 || **70** || 74 || **89** || 56 |- | **14** || 39 || **33** || 53 || **52** || 72 || **71** || 83 || **90** || 124 |- | **15** || 88 || **34** || 122 || **53** || 45 || **72** || 55 || **91** || 106 |- | **16** || 126 || **35** || 93 || **54** || 90 || **73** || 50 || **92** || 115 |- | **17** || 120 || **36** || 38 || **55** || 110 || **74** || 70 || **93** || 98 |- | **18** || 68 || **37** || 103 || **56** || 44 || **75** || 104 |}
### 암호화 과정에서의 사이클
Lou Scheffer의 말레볼제를 암호학적으로 분석한 결과에서는 암호화 과정에서의 다음과 같은 여섯 개의 사이클을 언급하고 있다: * 33 ⇒ 53 ⇒ 45 ⇒ 119 ⇒ 78 ⇒ 49 ⇒ 87 ⇒ 48 ⇒ 123 ⇒ 71 ⇒ 83 ⇒ 94 ⇒ 57 ⇒ 91 ⇒ 106 ⇒ 77 ⇒ 65 ⇒ 59 ⇒ 92 ⇒ 115 ⇒ 82 ⇒ 118 ⇒ 107 ⇒ 75 ⇒ 104 ⇒ 89 ⇒ 56 ⇒ 44 ⇒ 40 ⇒ 121 ⇒ 35 ⇒ 93 ⇒ 98 ⇒ 84 ⇒ 61 ⇒ 100 ⇒ 97 ⇒ 46 ⇒ 101 ⇒ 99 ⇒ 86 ⇒ 95 ⇒ 109 ⇒ 88 ⇒ 47 ⇒ 52 ⇒ 72 ⇒ 55 ⇒ 110 ⇒ 126 ⇒ 64 ⇒ 81 ⇒ 54 ⇒ 90 ⇒ 124 ⇒ 34 ⇒ 122 ⇒ 63 ⇒ 43 ⇒ 36 ⇒ 38 ⇒ 113 ⇒ 108 ⇒ 39 ⇒ 116 ⇒ 69 ⇒ 112 ⇒ 68 ⇒ 33 ... * 37 ⇒ 103 ⇒ 117 ⇒ 111 ⇒ 120 ⇒ 58 ⇒ 37 ... * 41 ⇒ 102 ⇒ 96 ⇒ 60 ⇒ 51 ⇒ 41 ... * 42 ⇒ 114 ⇒ 125 ⇒ 105 ⇒ 42 ... * 50 ⇒ 80 ⇒ 66 ⇒ 62 ⇒ 76 ⇒ 79 ⇒ 67 ⇒ 85 ⇒ 73 ⇒ 50 ... * 70 ⇒ 74 ⇒ 70 ... 이 사이클들은 각각의 시간에 각각의 일을 한 다음 다시 돌아와서 반복되는 루프를 만드는 데 사용할 수 있다. Lou Scheffer는 이 아이디어를 (아래에 링크된 그의 분석 결과에 포함되어 있는) 사용자의 입력을 모두 출력으로 되돌리는 말레볼제 프로그램을 만드는 데 사용했다.