最小指令集,用于解决计算机程序的任何问题

时间:2010-09-14 17:38:05

标签: algorithm programming-languages

多年前,我听说有人要证明每个计算机程序只需要三个指令即可解决:

  • 作业
  • 条件
  • 循环

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

6 个答案:

答案 0 :(得分:20)

没有必要。最小的理论计算机只需要一条指令。它们被称为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汇编看起来更像是基于标准累加器的架构。

答案 1 :(得分:5)

这是Turing Completeness的结果,这是几十年前建立起来的。

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

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

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

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

答案 2 :(得分:3)

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

当我学习时,我们使用这样的“计算机”来计算阶乘,只需使用一条指令:

SBN - Subtract and Branch if Negative:
SBN A, B, C

含义:

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

答案 3 :(得分:2)

值得注意的一个指令集计算机(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

另见

答案 4 :(得分:0)

1964年,Bohm和Jacopini发表了paper,其中他们证明了所有程序都只能用三种控制结构来编写: 序列结构, 选择结构 和重复结构。

答案 5 :(得分:0)

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