【问题标题】:Minimal instruction set to solve any problem with a computer program解决计算机程序任何问题的最小指令集
【发布时间】:2026-01-10 03:45:01
【问题描述】:

几年前,我听说有人要证明每个计算机程序都可以通过三个指令来解决:

  • 作业
  • 有条件的
  • 循环

我想听听您的意见。我的意思是将任何算法表示为计算机程序。你同意吗?

【问题讨论】:

  • 条件是什么意思?我假设分配处理整数?我想如果你有循环,你真的不需要条件,因为条件只是循环的一个特例。
  • 至少你还需要inc之类的东西。
  • @sepp2k 你真的不知道。你可以想出一个像if (a == 1) a = 2 elseif (a == 2) a = 3 elseif (a == 3) a = 4 这样的结构。这只是条件和赋值。
  • @Tyler:我假设没有整数文字,因为它们不在列表中(尽管考虑一下,整数不是这样的指令,所以它们可能没有t 属于列表)。
  • 好吧,更严格地说,如果您愿意浪费一点内存和时间,您不需要整数文字。设置您的输入,使第一个内存位置代表 0,第二个位置代表 1,然后将所有其他数字表示为带有这些符号的单元格字符串。该语言可以引用前两个单元格的内容并对输入中的其他数字进行按位加法/减法/任何操作,而无需数学指令或文字(只需比较/分配/分支)。效率低很多,但可能。

标签: algorithm programming-languages


【解决方案1】:

不需要。最小的理论计算机只需要一条指令。他们被称为One Instruction Set Computers (OISC for short, kinda like the ultimate RISC)

有两种类型。第一个是理论上“纯”的单指令机,其中指令真正像普通 CPU 中的常规指令一样工作。指令通常是:

subtract and branch if less than zero

或其变体。 wikipedia article 提供了如何使用这条指令编写模拟其他指令的代码的示例。

第二种在理论上是纯的。它是transfer triggered architecture(又是*,抱歉)。这一系列架构也被称为移动机器,我自己设计并构建了一些。

有些人认为移动机器作弊,因为机器实际上拥有所有常规指令,只是它们是内存映射的,而不是操作码的一部分。但是移动机器不仅仅是理论上的,它们是实用的(就像我说的,我自己建造了一些)。甚至还有一个由 Maxim 制造的商用 CPU 系列:MAXQ。如果你看一下 MAXQ 指令集(他们称之为传输集,因为实际上只有一条指令,我通常称之为寄存器集)你会发现 MAXQ 汇编看起来很像一个基于标准累加器的架构。

【讨论】:

  • 虽然它是一条指令,但在语义和算法上它仍然是 3 种操作:赋值、分支操作和条件。
  • @Vivin 我不同意。这是一条指令。类似地,加法是一个单一的操作,即使它有多个部分(求和匹配位、进位、重复直到完成)。许多操作可以被认为是由多个较小的操作组成的,但这在这里无关紧要。这不像是有一个减法运算和一个单独的分支运算。它们必须一起执行。
  • 薇薇安和史翠兰,我觉得这有点像鸡蛋和母鸡的故事。我理解你们两个,谢谢你们的cmets。
  • 我认为 OP 是在一般算法的背景下谈论这个的。在这种情况下,它将是 3 个单独的指令(语义上)。您可以将一堆指令组合成一条指令,因此在汇编代码级别是的,它只是一条指令。但是,如果您将算法作为一个整体来看 IMO,那将是 3 条指令
  • @VivinPaliath:不过,这取决于你如何定义“算法”。
【解决方案2】:

最小集是单个命令,但您必须选择一个合适的命令,例如 - One instruction set computer

在我学习的时候,我们用这样一台“计算机”来计算阶乘,只用了一条指令:

SBN - 如果为负,则减并分支: SBN A, B, C

意思:

if((Memory[A] -= Memory[B]) < 0) goto C  
// (Wikipedia has a slightly different definition)

【讨论】:

【解决方案3】:

这是Turing Completeness 的结果,这是几十年前建立的东西。

著名的计算机科学家艾伦·图灵证明了任何可计算的函数都可以使用Turing Machine 来计算。图灵机是一个非常简单的理论设备,它只能做一些事情。它可以读取和写入磁带(即内存),保持一个内部状态,该状态会被从内存中读取的内容改变,并使用内部状态和最后读取的存储单元来确定在读取下一个之前移动磁带的方向记忆细胞。

赋值、条件和循环的操作足以模拟图灵机。读写内存和维护状态需要赋值。根据状态和内存内容改变磁带的方向需要条件和循环。实际上,“循环”比实际需要的要高级一些。真正需要的是程序流可以以某种方式向后跳转。这意味着您可以根据需要创建循环,但该语言不需要具有显式循环构造。

由于这三个操作允许模拟图灵机,并且图灵机已被证明能够计算任何可计算函数,因此任何提供这些操作的语言也能够计算任何可计算函数。

编辑:而且,正如其他回答者指出的那样,这些操作不需要是离散的。您可以制作一条指令来完成所有这三件事(分配、比较和分支),这样它就可以自己模拟图灵机。

【讨论】:

    【解决方案4】:

    1964 年,Bohm 和 Jacopini 发表了一篇paper,他们在其中证明了所有程序都可以仅根据三种控制结构来编写: 序列结构, 选择结构 和重复结构。

    【讨论】:

      【解决方案5】:

      值得注意的单指令集计算机 (OSIC) 实现

      这个答案将关注单指令集 CPU、编译器和汇编器的有趣实现。

      movfuscator

      https://github.com/xoreaxeaxeax/movfuscator

      仅使用 mov x86 指令编译 C 代码,以非常具体的方式表明单条指令就足够了。

      图灵完备性似乎已经在一篇论文中得到证明:https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

      subleq

      https://esolangs.org/wiki/Subleq:

      另请参阅

      【讨论】:

        【解决方案6】:

        使用 Haskell 的程序员可能会争辩说您只需要 Contional 和 Loop,因为 Haskell 中不存在赋值和可变状态。

        【讨论】:

        • Haskell 中也不存在循环。在 lambda 演算中,条件也不存在。 Lambda-calculus 只有函数抽象和函数应用。
        最近更新 更多