📜  如何在 Malboge 中打印 Hello World (1)

📅  最后修改于: 2023-12-03 15:08:42.877000             🧑  作者: Mango

在 Malboge 中打印 "Hello World"

介绍

Malboge 是一个极其具有挑战性的编程语言,设计初衷是为了防止人类使用它。它是一门基于Brainfuck的反-汇编语言,被认为是最难于使用的编程语言之一。 Malboge程序通常很难编写和调试,因此它通常被用作编程挑战的一部分。

在这篇文章中,我们将展示如何在 Malboge 中打印 "Hello World" 。

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语言格式标明.