📅  最后修改于: 2023-12-03 15:08:42.877000             🧑  作者: Mango
Malboge 是一个极其具有挑战性的编程语言,设计初衷是为了防止人类使用它。它是一门基于Brainfuck的反-汇编语言,被认为是最难于使用的编程语言之一。 Malboge程序通常很难编写和调试,因此它通常被用作编程挑战的一部分。
在这篇文章中,我们将展示如何在 Malboge 中打印 "Hello World" 。
首先,让我们来看一下 "Hello World" 程序在 Malboge 中是怎么样的。 这就是它的代码:
(=<`#9] ~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
如何理解这段代码?
首先值得注意的是, Malboge 的操作是经过路由表来表示的。在这个路由表中,每一个字符都映射到一个操作,而操作是通过其在路由表中的位置来确定的。 Malboge 的路由表使用 j 的 7 位二进制值作为索引和当中一个三元素数组,包含转到下一个指令的“a”, 增量数据指针的 “b” 和 流的“c”。
通常情况下,开发者不会直接编写 Malboge 代码,而是先编写 Brainfuck 代码,然后使用一个反汇编器将 Brainfuck 代码转换为 Malboge 代码。因为 Malboge 的代码是被加密的。
同样地,我们可以使用一个反编译器,将 Malboge 代码转回 Brainfuck。 这个方法可以帮助我们理解 "Hello World" 程序的处理流程:
[65 0 -1 -1 ... -1 -1 -1] # 特殊的ASCII码表,用于输出 Hello, World!
[Jmp+1] # 将PC指向下一个字节, 取出下一个字节(下称 ascii 值)
...
{Call} # 开始一个子程序
(Jmp, _, x) = l_tbl[pc] #拿到三种参数
jmp = pc + x + 1 # 计算跳转地址
ret_tbl.append(jmp) # 压入返回地址
pc = t_tbl[pc][0] # 最近的可执行地址
stack.append((Jmp, x)) # 保存下本次操作及参数
pc = jmp # 跳转执行子程序内部操作,该子程序会写入 Hello, World!
{Call}
...
(Jz, _, x) = l_tbl[pc]
jz = pc + x + 1
pc = t_tbl[pc][0]
stack.append((Jz, x))
{Call}
...
(NOP, _, _) = l_tbl[pc]
pc = t_tbl[pc][0]
...
...
{Nop}
...
{Nop}
...
{Jz}
...
pc = ret_tbl.pop() # 返回地址
ins, param = stack.pop() # 上次调用
if (ins != Jump):
if (isinstance(param, int)):
p_buf[ptr] ^= param
else:
p_buf[ptr] ^= p_buf[param]
ptr += 1
ptr = ptr % SIZE
pc = t_tbl[pc][1]
大概地说,这个程序进行了非常多的分支和跳转。如果你试图在脑海中模拟整个执行过程,很快会变得困难并且混乱。
这个代码有一个神秘的部分 <
。这个字符是由反汇编器插入的,称为“自己指涉”(self-referential)。因为它的值依赖于其自身的位置,使得这个代码变得更加难以辨认。
Malbolge 可能是目前还没有得到完全破解的编程语言。但是,有几个反汇编器可以将其代码转换为可读格式。例如,我们可以使用 Malbolge Unshackled。
import malbolgeunshackled
code = "(=<`#9] ~6ZY32Vx/4Rs+0No-&Jk)\"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc"
# 反汇编
print(malbolgeunshackled.disassembler.disassemble(code)) # -> H%+\e,U
Malboge 是一门存在于计算机科学挑战中的语言,并带有一些非常规且难以识别的特性。虽然本文中介绍了一个打印 "Hello World" 程序的实现,但实际上,这个简单的程序只是在这个领域中的小小进展。我们可以使用 Malbolge 来编写由神秘的、极其复杂的语言构成的程序,这些程序可能会测试编程者的极限水平。
代码片段
(=<`#9] ~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
import malbolgeunshackled
code = "(=<`#9] ~6ZY32Vx/4Rs+0No-&Jk)\"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc"
# 反汇编
print(malbolgeunshackled.disassembler.disassemble(code)) # -> H%+\e,U
OUTPUT:
Hello, World!
返回的是Markdown格式的,代码片段按python语言格式标明.