字节码和微码有什么区别?

时间:2017-02-13 10:29:37

标签: bytecode machine-code instruction-set microcoding

我正在维基百科上阅读有关机器代码,微代码和字节码的信息 微代码似乎比机器代码更低级,而字节代码似乎更高级 我没有真正了解某些东西可能比机器代码更低级,更一般地说,它们如何与机器代码相关。

2 个答案:

答案 0 :(得分:0)

请参阅Wikipedia的网页以了解其中的任何条款,

  

源代码是使用人类可读的编程语言(通常为纯文本)编写的任何代码集合,可能带有注释。微码将机器指令,状态机数据或其他输入转换为详细的电路级操作序列。它将机器指令与底层电子设备分开,以便可以更自由地设计和更改指令。

  

“我不是真的不知道如何将某些东西比机器代码更底层,更普遍地说,它们(字节码和微码)两者都与机器代码之间有何关系。”

一个类比是机器代码告诉CPU使用哪个微代码(子例程)。

大约半个世纪前,我从内心深处知道Intel 8080,它对于某些人来说是可读的。现代处理器的指令集要大得多,我可以公平地说,大多数人,甚至不是某些人,都熟悉当今他们最喜欢的处理器的整个机器代码指令集。

对于特定的处理器体系结构,任何处理器的机器代码通常都是重叠的,例如,您可以在AMD处理器上运行大多数英特尔优化的机器代码(反之亦然),但是每个的微代码都不交叉兼容。

个程序,这些程序依赖于特定的处理器,并且没有钩子来允许根据所使用的处理器来选择不同的子例程,通常是驱动程序或高度优化的程序,旨在尽可能快地执行(或占用最少的内存或其他折衷方案)-这些程序(或驱动程序)通常具有多个版本,以适应制造商的特定版本的CPU,这是特别常见的使用ARM CPUs时,每个内核都支持一组不同的指令,并且内存受到限制(因此,容纳各种各样的处理器是不切实际的,并且在嵌入式系统中毫无意义)。

以上内容旨在为您提供一个易于理解的解释,单击上面的链接将提供更准确,更深入的解释。

答案 1 :(得分:0)

在这三个机器代码的上下文中,

是处理器运行的指令集,已发布的指令以及我们中的一些人学会编程(以汇编语言,其中汇编程序是将汇编转换为机器代码的工具) 。

   0:   66 b8 05 00             mov    ax,0x5

并非所有处理器都经过微编码,比您想象的要少,几乎没有。它比risc东西更像是顺便的东西,AFAIK已经使用了一些risc的东西。当您想到微码时,基本上会想到x86。

诸如将立即数移入通用寄存器之类的问题似乎并不成问题,但请查看一些其他指令,这些指令可让您拥有诸如

之类的内存操作数。
   0:   66 b8 05 00             mov    ax,0x5
   4:   66 67 8b 07             mov    ax,WORD PTR [bx]
   8:   66 67 8b 47 05          mov    ax,WORD PTR [bx+0x5]

拿第三个

从寄存器文件中读取bx的内容 给该值加5 使用该地址从内存执行字大小的加载 将该值保存在寄存器文件的ax中

在一堆简单的存储和存储机器上将使用更多步骤完成一堆步骤 指令,一些伪代码

add r3,r2,#5
load r4,[r3]
mov r1,r4

底层处理器(如果有的话)可能是字节片或vliw(很长的指令字)或为任务创建的东西。

没有理由期望,我们可以肯定的是,从一代x86到另一一代,底层的微引擎已经发生了变化,也许是完全的替代,也许没有。

将其想象为EBCDIC,ASCII和Unicode等。基本字母大写AZ小写字母az和0-9以及其他一些字母,我们可以使用不同的编码方案以数字方式表示它们,只有一些人必须知道该方案。我们其余的人只需将这些字符输入网页上的编辑框中,而不必知道其工作原理。

在保留了与过去的兼容性的同时,可以轻松地重新设计经过多代生存的处理器。如果您让100位程序员写了一个编程问题的详细说明,您将获得1到100个都执行相同任务的不同解决方案。有些可能比其他更好。假设所有程序都没有错误,那么它们都是有效的解决方案。以100位RTL工程师为他们提供指令集和处理器总线规范,您将获得1到100种不同的解决方案,从技术上讲,任何一种都可以用来实现该处理器。几年后无理由使用一种设计,可能不希望使用全新的设计。或者,您可以执行intel的工作,A团队会每隔一个处理器构建一次,B团队则每隔一个构建一次(他们可能现在也可能不这样做,但是一段时间了),因此其他每个都可能基于对先前设计的改进,但是底下可能完全不同。这与微码无关。

您当然可以制作未进行微码处理的x86,也可以制作未进行微码处理的MIPS。查找LC-3是一种非常简单的指令集,可以在一页Verilog上实现,但是大学创建者至少有一个微码解决方案,它出于演示和教育目的而非常庞大。从历史上到今天,构建芯片都需要大量的工作,每次旋转都要花费很多(想想每次旋转要花费数千万美元),而要获得更好的东西就需要花费更少的旋转。如果我想说一台洗衣机控制器,并且为了节省大量生产成本,我想尽可能多地获得控制器板上的一个芯片。我可以选择全部逻辑化,而不是可编程的。但是,如果在芯片生产后有任何错误或功能需要更改,则它会进行芯片旋转,我们将使用先前芯片构建的电路板扔掉。如果我们使它的某个百分比可编程,那么增加功能或修复错误,不必召回或扔掉货架上的产品的可能性就会降低。有时其生产成本甚至更低。可编程解决方案不一定总要比非可编程解决方案大,这取决于要解决的问题。该领域的经验将指导这些决策。为了获得回报,需要为自己的产品生产类似的芯片,就必须获得成千上万的批量回报,而要花费数十万到数百万美元来生产控制器芯片,这样每个芯片要比用一块板子建造一块板便宜几美元。微控制器和其他一些芯片。

如上所示,诸如6502、8086和其前身之类的较早处理器试图对每个指令执行更多操作。指令集已经发展(或者他们看了pdp8并考虑了您的问题以及CISC,RISC等),因此您获得了微编码,可以平衡获得无需过多芯片旋转就能出售的产品,而却拥有所有这些功能是一个有效的折衷方案。但是随后您开始看到RISC,VLIW和其他解决方案,在这里您并没有真正查看用作通用处理器的微引擎,而是查看使用了更多指令的设计,但是这些指令更易于实现并且可以更快地执行。因此,存在一个设计选择,利弊,并且众所周知,这两种解决方案都能够进行通用计算或专用计算。这些设计和公司中的某些不一定是由于其指令集的好坏而定,有些是市场营销,有些是在正确的时间在正确的位置接管市场并控制它,以至于其他人无法渗透进来,等等。我们已经看到其中一些幸存了几代人。

转到visual6502页面,然后在此看到他们谈论的一些内容。处理器是围绕rom设计的,将其视为基于rom的状态机,您的操作码本质上是指向rom的指针,rom包含驱动状态机或微引擎的子命令。也许将微代码和将机器代码指令分解为更小的步骤将是有意义的。 AMD拥有一个称为AMD 29000的处理器,在某种程度上,该处理器成为了第一个/早期AMD x86克隆产品背后的微型引擎。 Transmeta采用了另一种方法,运行时将x86代码转换为VLIW代码,为什么他们不只是将其作为我不知道的VLIW处理器出售...他们的目标是制造x86克隆,而不是我猜想的一些新处理器...

像C这样的语言应该解决的问题是,在arpanet上使各种基于处理器的系统能够相互通信。每次在每一所大学都必须重新编写通信代码(并从头开始编写它到规范),以便他们能够交谈。如果您可以将后端实现为高级语言,但可以在每个目标上运行高级程序,该怎么办。虽然C出于明显的原因仍然非常相关,但是Pascal,Java,Python和其他一些具有更有趣概念的想法出现了,将高级语言将其编译为机器代码,但是您随后编写了特定于目标的机器代码虚拟机。通常,这是一个基于堆栈的解决方案,大多数处理器可以轻松实施(不一定高效),但有很大的机会成功为每个目标平台创建虚拟机。如果您不想再携带源代码,则可以携带字节码。已经编译。与指令集模拟器的区别不大,因此您可以在基于x86或6502的街机游戏(如基于小臂的手机或基于x86的笔记本电脑上的小行星)上运行ARM程序,只是字节码指令集是为该模拟器/虚拟设计的。机器,不一定设计得像真正的机器语言。

例如,完成JAVA字节码的方式是,您基本上可以为每个字节码指令构建一个查找表,并在本机指令中实现该查询表(可能的话,某些指令需要/希望您仍然可以进行系统调用确保使用本机代码)。再次考虑一下6502、8080 / z80、8086,您所拥有的操作码是一个字节,而字节本身并不一定按照可以将其拆开并查看操作数的方式进行逻辑映射,这是一个用于查找表的字节。您查看了MIPS,ARM,RISC-V和其他您实际上没有操作码的代码(mips和riscv试试,但是如果您真的看不到它的不完整),则您有一条更大的指令,其中该指令的一部分驱动状态机(更多)直接(理想情况下)。基于操作码的设计将操作码查找或映射到一个表中,该表从操作码/指令的位间接驱动状态机。是的,在那些RISC之间有一些模糊,有一些操作码位,CISC可能有一些位可以更直接地使用。

我们看到的字节码的另一种用途是及时编译器,例如LLVM。编译器前端开始并仍将其用作其主干,编译器前端创建字节码,然后可以在该级别优化字节码,然后最终在时间上或在构建项目时将字节码编译(如果您要进入目标)汇编语言或机器代码。字节码是所有可能的前端语言和所有已实现的后端目标之间的一个很好的中间抽象层。

就像我要概括的RISC vs CISC比较一样,您当然可以将JAVA编译为目标代码,同样,您可以制作一个C编译器/工具链,为这些虚拟机之一输出字节码。


机器代码,处理器在什么操作系统上运行,他们了解什么以及告诉他们执行某些操作的指令。

微代码,一些处理器设计通过使用另一个理想上更简单的指令集来基本模拟机器代码指令,从而实现机器代码。在微引擎上运行的微代码。

字节码,一种理想的通用指令集,可以在虚拟机中进行仿真,以便可以在不兼容的系统上传递和使用已编译的程序。只需为VM开发一次程序,然后以相同的二进制文件交付即可。不必为每个目标操作系统/指令集开发一个版本。该术语还用作从工具链中可能的目标后端提取编译语言前端的一种方法。