맬볼지
Malbolge![]() 말벌게의 고양이 프로그램 | |
패러다임 | 난해한, 명령형, 스칼라, 가치 수준 |
---|---|
설계자 : | 벤 옴스테드[1] |
디벨로퍼 | 벤 옴스테드[1] |
첫 등장 | 1998 |
타이핑규율 | 미입력 |
파일 확장명 | .mal, .mb |
영향을 받음 | |
브레인퍽, 인터칼(Tri-INTERCAL), 비펑스 | |
영향받은 | |
디스, 말볼지 언패킹 |
말볼게(Malbolge)는 1998년 벤 올름스테드(Ben Olmstead)가 개발한 공용 영역 난해한 프로그래밍 언어로, 단테의 인페르노에서 지옥의 여덟 번째 원인 말볼게에서 이름을 따왔습니다.그것은 반직관적인 '크레이지 연산', 베이스-쓰리 산술, 그리고 자체 수정 코드를 통해, 사용이 거의 불가능하도록 특별히 설계되었습니다.[2]그것은 초기의 난해한 언어(예: 브레인퍽이나 비펑스)의 어려움을 기반으로 하지만, 컴퓨터 과학과 암호화의 얽힌 역사를 이용하여 이 측면을 극단적으로 과장합니다.이러한 설계에도 불구하고 유용한 말볼지 프로그램을 작성할 수 있습니다.
말벌게의 프로그래밍
말볼지는 도착했을 때 이해하기가 매우 어려웠습니다.최초의 말벌지 프로그램이 등장하기까지 2년이 걸렸습니다.작가 자신은 말벌지 프로그램을 쓴 적이 없습니다.[2]최초의 프로그램은 사람이 작성한 것이 아니라 앤드류 쿡이 설계한 빔 검색 알고리즘에 의해 생성되었으며 리스프에서 구현되었습니다.[3]
나중에 루 쉐퍼는 말볼지의 암호 분석을 게시하고 입력을 출력에 복사하는 프로그램을 제공했습니다.[4]그는 또한 원래 사이트가 작동을 멈춘 후 원래의 통역사와 사양을 저장하고, 말벌게에서 프로그램을 작성하는 일반적인 전략과 튜링의 완성도에 대한 몇 가지 생각을 제시했습니다.[5]
Olmstead는 Malbolge가 선형 경계 자동화라고 믿었습니다.Malbolge에서 합리적인 루프를 구현할 수 있는지에 대한 논의가 있습니다. 최초의 비종단 루프가 도입되기까지 여러 해가 걸렸습니다.단순하지 않은 루프와 조건을 다루는 정확한 99병 맥주 프로그램은 7년 동안 발표되지 않았습니다. 첫 번째 정확한 프로그램은 2005년 이자와 히사시에 의해 발표되었습니다.[6]Hisashi Iizawa et al. 는 또한 소프트웨어 보호를 위한 난독화를 목적으로 말벌게에서 프로그래밍을 위한 가이드를 제안했습니다.[7]
2020년, GitHub 사용자 kspalaiologos는 말볼지 언체일드에서 작동하는 리스프 인터프리터를 만들었습니다.[8]
예제 프로그램
안녕, 세상아!
이 프로그램에는 "Hello, World"가 표시됩니다.[9]
(=<'#9]~6ZY327Uv4-QsqpMn&+Ij'E%e{Ab~w=_:]Kw%o44Uqp0/Q?xNvL:'H%c#DD2^WV>gY;dts76qKJimZkj
cat
프로그램.
이 프로그램은 유닉스 명령줄 유틸리티와 유사하게 사용자로부터 문자열을 읽고 해당 문자열을 인쇄합니다.cat
.[10]
(=BA#9"=<;:3y7x54-21q/p-,+*")!h%B0/.~P<:(8&66#")!~} {zyxwvugJ%
설계.
Malbolge는 3원 가상 머신인 Malbolge 인터프리터를 위한 기계어입니다.
표준 통역사와 공식 사양이 완벽하게 일치하지 않습니다.[11]한 가지 차이점은 컴파일러가 33-126 범위 밖의 데이터로 실행을 중지한다는 것입니다.처음에는 컴파일러에서 버그로 간주되었지만 벤 옴스테드는 이를 의도한 것이며 실제로는 "스펙에 버그"가 있다고 말했습니다.[2]
레지스터
Malbolge에는 a, c, d의 3개의 레지스터가 있습니다.프로그램이 시작되면 레지스터 세 개의 값이 모두 0이 됩니다.
a는 'accumulator'의 약자로, 메모리의 모든 쓰기 작업에 의해 쓰여진 값으로 설정되며 표준 I/O에 사용되는 코드 포인터인 c는 특별합니다. c는 현재 명령어를 가리키며 d는 데이터 포인터입니다.[12]각 명령 후에 자동으로 증가하지만, 지시하는 위치가 데이터 조작 명령에 사용됩니다.
포인터 표기
d는 메모리 주소를 보유할 수 있습니다. [d]는 레지스터 간접입니다. 해당 주소에 저장된 값입니다.[c]비슷합니다.
기억
가상 시스템에는 각각 10자리 숫자를 유지할 수 있는 59,049개(3개10)의 메모리 위치가 있습니다.각 메모리 위치에는 0 ~ 59048의 주소가 있으며 0 ~ 59048의 값을 유지할 수 있습니다.이 제한을 초과하면 다시 0으로 돌아갑니다.
이 언어는 데이터와 명령 모두에 동일한 메모리 공간을 사용합니다.이것은 x86 아키텍처와 같은 하드웨어의 작동 방식에 영향을 받았습니다.[2]
Malbolge 프로그램이 시작되기 전에 메모리의 첫 부분이 프로그램으로 채워집니다.프로그램의 모든 빈 공간은 무시되며 프로그래밍을 더 어렵게 하려면 프로그램의 다른 모든 것은 아래 지침 중 하나로 시작해야 합니다.
나머지 메모리는 이전 두 주소([m] = crz [m - 2], [m - 1])에서 크레이지 연산(아래 참조)을 사용하여 채웁니다.이렇게 채워진 메모리는 12개의 주소마다 반복됩니다(개별 3진 숫자는 3~4개의 주소마다 반복되므로 3진 숫자 그룹은 12개마다 반복됩니다).
2007년, 외르잔 요한센은 임의의 메모리 제한이 없는 말볼게의 버전인 말볼게 Unshackled를 만들었습니다.희망은 가능한 한 말볼게의 정신을 지키면서 튜링을 완성하는 언어를 만드는 것이었습니다.다른 규칙은 변경되지 않으며 메모리 한계에 도달하지 않은 모든 Malbolge 프로그램은 완전히 작동합니다.[13]
지침들
말볼지는 8가지 지시사항이 있습니다.Malbolge는 [c] 값을 취하고 c의 값을 더하고 이것을 94로 나누었을 때 나머지를 가져감으로써 실행할 명령을 결정합니다.최종 결과는 인터프리터에게 다음과 같은 작업을 지시합니다.
의 가치 ([c] + c) % 94 | 설명 대표의 | 설명. |
---|---|---|
4 | jmp[d] | [d]에서 c로 값을 복사합니다.이 명령을 실행한 후에도 c는 계속 증가하므로 실행할 다음 명령은 [d] + 1(modulo 59049)에 있는 명령입니다. |
5 | 을 제외하고 | ASCII 문자인 a 값을 화면에 인쇄합니다. |
23 | 일순간에 | 문자를 ASCII 코드로 a에 입력합니다.새 라인 또는 라인 피드는 모두 코드 10입니다.파일 종료 조건은 코드 59048입니다. |
39 | 로트[드] mova, [d] | [d]에서 값을 오른쪽으로 세제곱 자리만큼 회전합니다(000211112는 200021111이 됩니다).결과를 [d] 및 a에 모두 저장합니다. |
40 | 이동, [d] | [d]에서 d로 값을 복사합니다. |
62 | crz [d], a mova, [d] | [d]의 값과 a의 값으로 crazy operation(아래 참조)을 수행합니다.결과를 [d] 및 a에 모두 저장합니다. |
68 | 아녜요 | 아무 것도 안 돼요. |
81 | 끝. | 말벌지 프로그램을 종료합니다. |
기타 값 | 68: nothing과 동일하게 수행합니다.이러한 다른 값은 프로그램이 로드되는 동안에는 허용되지 않지만 그 이후에는 허용됩니다. |
각 명령이 실행된 후에는 점프가 발생하지 않는 한 다음에 동일한 작업을 수행하지 않도록 암호화됩니다(아래 참조).점프 직후 말볼지는 명령어를 대신 점프하기 직전에 암호화합니다.그런 다음 c와 d의 값이 모두 1씩 증가하고 다음 명령을 실행합니다.
크레이지 오퍼레이션
두 입력의 각 3진 숫자에 대해 다음 표를 사용하여 결과의 3진 숫자를 구합니다.예를 들어 crz 0001112220, 0120120120은 1001022211을 제공합니다.
crz | 입력2 | |||
---|---|---|---|---|
0 | 1 | 2 | ||
입력1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 2 | |
2 | 2 | 2 | 1 |
암호화
명령이 실행된 후 [c]의 값이 (추가된 것 없이) 자체 mod 94로 바뀝니다.그런 다음 결과는 다음 두 가지 동등한 방법 중 하나로 암호화됩니다.
- 방법1
- 아래에서 결과를 찾으십시오.그 아래에 있는 문자의 ASCII 코드를 [c]에 저장합니다.
000000111111222222223333333333344444444445555556666666667777777788888889901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TVac'uY*MK'X~xDl}REOKN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8jsb
- 방법2
- 아래에서 결과를 찾으십시오.[c]에 암호화된 버전을 저장합니다.
결과 | 암호화된 | 결과 | 암호화된 | 결과 | 암호화된 | 결과 | 암호화된 | 결과 | 암호화된 |
---|---|---|---|---|---|---|---|---|---|
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의 Malbolge 암호 분석은 순열에서 6개의 다른 순환을 언급합니다.여기에 나열되어 있습니다.
- 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는 이 아이디어를 사용하여 사용자가 입력하는 모든 것을 반복하는 Malbolge 프로그램(아래 링크된 그의 암호 분석에 포함됨)을 만들었습니다.
변형
말볼지는 메모리 한계 때문에 튜링이 완전하지 않습니다.그러나 그렇지 않으면 순차적 실행, 반복 및 조건부 실행이 있습니다.튜링-완전 버전의 말볼게를 만들기 위한 몇 가지 시도가 있었습니다.
- 말볼지20은 말볼지의 확장된 워드 사이즈가 20트릿인 버전으로, 최대 3.4기가바이트의 크기로 프로그램을 작성할 수 있습니다.[14]
- Malbolge-T는 Malbolge의 이론적 버전으로, 끝에 도달하면 입출력 스트림을 재설정하여 무제한 프로그램을 허용합니다.Malbolge-T는 Malbolge와 하위 호환성이 있습니다.[4]
- Malbolge Unshackled는 튜링-완전 변형으로, 어떤 길이의 프로그램도 가능합니다.그러나 257 이상의 값을 허용하기 위한 명령 변형으로 인해 유효한 Malbolge 프로그램이 Malbolge Unshackled에서 반드시 올바르게 실행되지는 않습니다.[15]
대중문화
TV 시리즈 "The Leviathan"(시즌 1, 10화)에서 커피 주문서에 적힌 단서가 말볼게로 쓰여진 것으로 묘사됩니다.위에 나와 있는 좀 더 상세한 "Hello World" 예제를 약간 수정한 것으로 보입니다.[2][16]
드라마 종합병원에서는 KFC의 샌더스 대령이 게스트로 출연하는데, 이는 11가지 허브와 향신료의 비밀 레시피를 얻기 위해 누군가가 그를 죽이려 하기 때문입니다.그는 말볼지를 알고 파괴 서열을 무장해제 시킬 수 있습니다.[17][18]
레버리지에서: 리뎀션 에피소드 "The Golf Job" (시즌 1, 12화), SMS 자동 응답에는 "Breanna는 목요일부터 일요일까지 또는 Malbolge 코드를 마스터할 때까지 사용할 수 없습니다."
"The Limitless Shit"(시즌 5, 에피소드 7)에서 액스 캐피털의 프로그래머 분석가는 그가 "...맬볼지와 장난치곤 했습니다."
참고 항목
참고문헌
- ^ a b "Malbolge - Esolang". Retrieved 2022-08-27.
- ^ a b c d e f Temkin, Daniel (2014-11-03). "Interview with Ben Olmstead". esoteric.codes. Retrieved 2021-01-07.
- ^ Cooke, Andrew. "malbolge: hello world". Archived from the original on 2019-12-06. Retrieved 2021-01-08.
- ^ a b Scheffer, Lou (2015-04-17). "Introduction to Malbolge". Retrieved 2017-06-09.
- ^ Mykhailova, Mariya (2012-05-11). "Malbolge - Programming language". Progopedia. Retrieved 2017-06-09.
- ^ "Language Malbolge". 99 Bottles of Beer. 2005-12-29. Archived from the original on 2020-05-14. Retrieved 2020-11-19.
- ^ a b IIZAWA, Hisashi. "Programming Method in Obfuscated Language Malbolge" (PDF) (in Japanese). Nagoya University. Retrieved 2017-06-09.
- ^ Palaiologos (2021-03-04), kspalaiologos/malbolge-lisp, retrieved 2021-03-23
- ^ Palaiologos (2021-03-04), kspalaiologos/hello.mb, retrieved 2021-03-23
- ^ Lutter, Matthias. "Malbolge cat". lutter.cc. Retrieved 2022-08-28.
- ^ Green, Austin (2000-12-01). "Malbolge". Louisiana Tech University. Retrieved 2017-06-09.
- ^ Olmstead, Ben (1998). "Malbolge Specification". www.lscheffer.com. Retrieved 2017-06-09.
- ^ Johansen, Ørjan (2013-10-25). "An interpreter for the Malbolge Unshackled dialect" (Haskell). oerjan.nvg.org. Retrieved 2017-06-09.
- ^ "Malbolge20 - Esolang". esolangs.org. Retrieved 2022-12-12.
- ^ "Malbolge Unshackled". esolangs.org. 2017-04-14. Retrieved 2017-06-09.
- ^ "Leviathan". Elementary. Season 1. Episode 10. Manhattan. 2012-12-14. CBS.
- ^ General Hospital. Season 56. Episode 68. 2018-07-06. ABC.
- ^ "General Hospital Official Twitter Account". Twitter. Retrieved 2021-07-06.