我对处理器如何处理指令有一个大致的了解,但我会花时间在大多数高级语言上工作。也许更接近铁杆的人可以提供一些有价值的见解。
假设编程语言基本上是处理器指令集的高级抽象,那么创建图灵完整机器所需的最基本指令集是什么?
注意:我对硬件体系结构的多样性一无所知,但是-为了简单起见-假设它是具有ALU(如有必要)和指令堆栈的典型处理器。*
我对处理器如何处理指令有一个大致的了解,但我会花时间在大多数高级语言上工作。也许更接近铁杆的人可以提供一些有价值的见解。
假设编程语言基本上是处理器指令集的高级抽象,那么创建图灵完整机器所需的最基本指令集是什么?
注意:我对硬件体系结构的多样性一无所知,但是-为了简单起见-假设它是具有ALU(如有必要)和指令堆栈的典型处理器。*
Answers:
原来,您只需要一条指令即可构建一台具有图灵计算能力的计算机。这类只有一条指令并且图灵完整的机器称为“ 一个指令集计算机”,或者也被戏称为“终极RISC”。
有许多方法可以实现可以在其中使用图灵机的功能。
当您查看处理器时,最适用的处理器可能是套准机模型。其中最简单的(就符号而言)是多带两个符号(mark
和blank
)。如果你去的东西不是很深奥的inc(r)
,dec(r)
和jz(r,z)
(跳跃如果寄存器r
是零指令z
)或clr(r)
(清晰r
), ,inc
(je(i,j,z)
跳如果寄存器i和j等于指令Z)。
我看过提到的注册机:
这也是完整的-它是一台Minsky寄存器机,尽管它对磁带中的数据有其他限制(它必须是存储状态的Gödel编号,而不是单独的寄存器)
而已。而已。
那么,为什么不使用这些超风险处理器呢?为他们编写编译器确实很痛苦,而您却放弃了处理器可以做的许多其他事情。有一个逐位的and
,这真的很好,add
而不是尝试通过递增寄存器和循环来完成所有事情。这就是名为“ Brainfuck ”的最受欢迎的编程语言的基础,该语言有8条指令。
>
递增数据指针<
递减数据指针+
在数据指针处增加数据-
在数据指针处递减数据.
在数据指针处输出数据,
读取输入,将数据存储在数据指针处[
如果指针处的数据为零,则不要将指令指针向前移动一,而是在匹配]
命令之后将其向前跳转到命令]
如果指针处的数据为非零,则不要向前移动指令指针,而是在匹配]
命令之后将其跳转回命令人们可以找到编译器来 Brainfuck,但它真的不好玩在它甚至做简单的事情。除非您享受无奈,这就是语言的目的。
相关阅读:
实作
该答案将集中在单指令集CPU,编译器和汇编器的有趣实现上。
动摇器
https://github.com/xoreaxeaxeax/movfuscator
仅使用mov
x86指令编译C代码,以非常具体的方式表明单个指令就足够了。
图灵的完整性似乎已经在一篇论文中得到了证明:https : //www.cl.cam.ac.uk/~sd601/papers/mov.pdf
子句
https://esolangs.org/wiki/Subleq:
也可以看看
构建图灵完整处理器所需的绝对最低限度的指令集是什么?
JörgW Mittag说:“一个”,但是零呢?
您为什么认为“处理器”必须具有“指令”?
图灵机是图灵完备的处理器,它本身不能在“指令”上运行。它具有规则,但是规则不是从随机存取存储器中获取的指令。
当艾伦·图灵(Alan Turing)想出自己的同名机器时,他正在寻找最简单的“计算”模型,以便他可以使用数学技术来回答“什么是可计算的”这个问题。
您将很难设计出比实际的图灵机更简单的图灵等效机。
FWIW,您正在考虑的一种处理器-一种从内存中获取指令,对其进行解码并执行它们,并对存储在同一内存系统中的数据进行操作的处理器-被称为冯·诺依曼架构