从理论上讲,单指令计算机是可能的。然而在真实的硬件上,你至少需要4个。假设是一个只存储器的体系结构(没有用户可访问的寄存器)。 MOV mem 1 mem 2-将内存位置mem 1的内容复制到内存位置mem 2,使mem 1保持不变 与非mem 1 mem 2至mem 3-在mem 1和mem 2处的数据之间执行逐位逻辑与非,并将结果写入mem 3 BITSHIFTR mem 1 mem 2 mem 3-将mem 1 mem 2位置的数据右移,并将输出写入mem 3 JMPcond mem 1 mem 2-测试mem 1的最低有效位,如果为真(1),则跳转到mem 2 现在它不会超级快,它会疯狂地消耗内存带宽,但它可以用来实现任何任意指令集的虚拟机。此外,还有一些编程限制,比如需要在所有启动数据中编程,或者至少是一个只有LSB设置为1的内存位置。硬件外设必须使用DMA进行I/O访问,如果在哈佛体系结构上实现,程序将不能直接访问指针之类的东西。
9条答案
按热度按时间qoefvg9y1#
控制结构包含了语言的基本特征,没有这些特征就没有语言。这意味着你的语言必须提供两个变量的算术运算;然后允许程序根据运算结果改变程序计数器--也就是说,到分支。通常,关键的运算是减法,从一个操作数减去另一个操作数。允许分支的条件是:
1.结果为零;
1.结果大于零;
1.结果小于零。
1.无条件,即分支无条件
您还需要指令来移动数据:比如说LOAD和STORE。
这三个条件及其相应的分支不仅如此,仅仅这三个简单的操作加上数据移动指令,就足以在程序中做除了I/O之外的任何事情。如果你愿意,并且有一个合作的内存组织,你可以重写Linux,只使用LOAD,STORE,ADD,NULL,和三个条件分支。
PDP-8是一台比这台强大得多的机器:它有一个rich set of eight instructions,包括I/O。
HTH
yqkkidmi2#
令人惊讶的是,有一个one instruction set computer这样的东西。
yruzcnhs3#
最少的指令集需要no instruction或zero instruction。我不知道它们是否已经进入真实的设备,但one instruction set computer (OISC)已经实现,并在carbon nanotubes computers和MAXQ上成功运行。
事实上,x86也可以用作OISC架构,因为 * 它可以用一个
mov
* 做任何事情,因为它已经是proved to be Turing-complete了。甚至还有一个名为movfuscator的编译器可以将有效的C代码编译成一个只有MOV的程序。(或仅XOR、XOR、ADD、XADD、ADC、SBB、AND/OR、PUSH/POP、1位移位或CMPXCHG/XCHG中的任一种)。参见Why is mov turing complete?然而,在我看来,一个架构 * 应该足够“快”*(或者与其他架构相比,一个任务不需要太多的指令,比如OISC)才能被认为是有用的。
计算机最基本的指令类型是数据移动,逻辑/算术运算和分支。对于算术运算,只需一个
add/subtract
就足够了。对于逻辑,我们可以计算任何函数,只需一个NOR
或NAND
,因此只需要一个。对于跳转,我们需要一个jump on "<="
或jump on "<"
指令。数据移动可以通过add/sub来模拟。这样,我们可以使用2位来编码3个操作码(add
,nand
,jump on "<="
),并留下一个用于将来的扩展。但由于这没有单独的 * 加载/存储指令 *,因此它必须直接对大型寄存器文件而不是内存进行操作,或者指令必须能够使用内存作为操作数。如果需要更快的速度,则可以添加更多的逻辑、分支指令以及可能的加载/存储,从而将操作码空间增加到3位。指令集可以是:
1.负载
1.店
1.添加
1.和
1.也不
1.跳上少于
1.等跳
add
可以实现左移,但右移比较复杂,因此您可能还希望添加右移,以简化一些常见操作7kqas0il4#
嗯,这是一个非常广泛的主题。我想你需要熟悉Random Access Machine。我不是Maven,但很难告诉这个非常基本的微处理器应该支持哪些指令。例如:减法和乘法可以通过加法运算来模拟。乘法是可能的,如果微处理器支持跳转和条件指令,减法是可能的,通过添加负数。
vecaoik15#
你可以用一个只包含
SOB:
减1和分支的最小指令集来生存,整个程序都可以用它来写。mm9b1k5b6#
查看商业实现
最好的答案可能是查看现有的商业实现。
任何没有商业销售的东西都可能没有用。
指令的定义是什么?
例如,我可以根据unzip的硬件实现,编写一条实现unzip算法的指令,这当然是解压缩最有效的机器。
然而,它在商业上有吸引力吗?不太可能,因为硬件可能过于专业化,不值得开发成本。
但还有比这个极端情况更微妙的情况,答案可能会随着现有竞争对手的技术和市场需求而变化,使情况变得更糟。
最后,“高效硬件”意味着:
非常小的图灵完备ISA可能效率低下的可能原因
OISC实现
分析这些问题以得到更具体的答案将是有趣的。
movfuscator
https://github.com/xoreaxeaxeax/movfuscator
Toy C compiler for x86,它只使用
mov
x86指令,以非常具体的方式表明单个指令就足够了。图灵完备性似乎已经在一篇论文中得到了证明:https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf
subleq
教育OSIC,以前在https://stackoverflow.com/a/9439153/895245中提到过,但没有名称:
标签:https://esolangs.org/wiki/Subleq
参见
https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501
ddhy6vgd7#
从理论上讲,单指令计算机是可能的。然而在真实的硬件上,你至少需要4个。假设是一个只存储器的体系结构(没有用户可访问的寄存器)。
MOV mem 1 mem 2-将内存位置mem 1的内容复制到内存位置mem 2,使mem 1保持不变
与非mem 1 mem 2至mem 3-在mem 1和mem 2处的数据之间执行逐位逻辑与非,并将结果写入mem 3
BITSHIFTR mem 1 mem 2 mem 3-将mem 1 mem 2位置的数据右移,并将输出写入mem 3
JMPcond mem 1 mem 2-测试mem 1的最低有效位,如果为真(1),则跳转到mem 2
现在它不会超级快,它会疯狂地消耗内存带宽,但它可以用来实现任何任意指令集的虚拟机。此外,还有一些编程限制,比如需要在所有启动数据中编程,或者至少是一个只有LSB设置为1的内存位置。硬件外设必须使用DMA进行I/O访问,如果在哈佛体系结构上实现,程序将不能直接访问指针之类的东西。
xcitsw888#
你可能还想看看图灵完备性。
http://en.wikipedia.org/wiki/Turing_completeness
http://c2.com/cgi/wiki?TuringComplete的
What is Turing Complete?的
这意味着一种语言足以计算任何可以计算的东西。
atmip9wb9#
实际上,你所需要的只是翻转一下然后跳跃。跳跃甚至不需要有条件。
FlipJump Language(esolangs page)是一种编程语言,它有一条指令,即:翻转一位,然后跳转。
指令
a;b
转换为not *a; jump b
。这可能会让你感到惊讶,但是使用这种语言,你可以实现任何东西。
完全披露,我早在2021年就创建了这门语言,当时的想法是创建最小的编程语言。从那以后,我一直支持它,并为该语言创建了一个经过充分测试的标准库,以及易于使用的汇编程序+解释器(github)。