字节码和微码有什么区别



我在维基百科上读到了关于机器代码、微代码和字节码的文章
微码似乎比机器码更低级,而字节码似乎更高级
我真的不明白为什么有些东西会比机器代码更低级,更普遍地说,我不明白它们是如何与机器代码联系在一起的。

请参阅维基百科的网页,了解其中的任何一个术语,右栏显示:

  • 代码类型
    • 源代码(纯文本,人类可读性最高,机器可读性最低)
    • 目标代码(编译器的产品)字节码(为软件解释器高效执行而设计)
    • 机器代码(可由CPU直接执行的指令)
    • 微代码(在CPU内部,实现更高级别机器代码指令的硬件级指令)

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

"我真的不知道一些东西怎么会比机器代码更低级,更普遍地说,它们(字节码和微码)是如何与机器代码相关的。">

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

大约半个世纪前,我对英特尔8080了如指掌,它对一些人来说是可读的。现代处理器有一个更大的指令集,我认为可以公平地说,大多数人,甚至不是一些的人,都熟悉他们今天最喜欢的处理器的整个机器代码指令集。

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

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

以上是一个易于理解的解释,点击上面的链接可以提供更准确和深入的解释。

在这三种机器代码的上下文中,处理器运行的指令集、发布的指令以及我们中的一些人学习编程(在汇编语言中,汇编程序是将汇编转换为机器代码的工具)。

0:   66 b8 05 00             mov    ax,0x5

并不是所有的处理器都是微编码的,比你想象的要少,几乎没有。与其说是RISC,不如说是CISC,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到另一代x86,底层的微引擎已经发生了变化,也许是完全的替代,也许不是。

可以将其视为EBCDIC与ASCII与Unicode等。基本字母大写A-Z小写A-Z和0-9加上其他一些字母,我们可以使用不同的编码方案以数字方式表示它们,只有一些人需要知道该方案,而我们其他人只需将这些字符键入网页上的编辑框中,就不必知道它是如何工作的。

存活了几代的处理器可以很容易地重新设计,同时保持与过去的兼容性。如果你让100名程序员写一些编程问题的详细描述,你会得到1到100个不同的解决方案,它们都执行相同的任务。有些人可能比其他人更好。假设所有的都是无错误的,那么它们都是有效的解决方案。假设100名RTL工程师给他们一个指令集和处理器总线规范,你就会得到1到100种不同的解决方案,其中任何一种在技术上都可以用来实现该处理器。没有理由在几年后使用一种设计后,可能会使用一种全新的设计。或者你可以做intel的事情,团队A每隔一个处理器就构建一个,团队B每隔一个构建一个(他们现在可能这样做,也可能不这样做,但在一段时间内这样做了),所以每一个都可能基于对先前设计的改进,但下一个可能完全不同。这与微编码与否无关。

你当然可以制作一个没有微编码的x86,也可以制作一种有微编码的MIPS。查找LC-3,这是一个非常简单的指令集,可以在大约一页Verilog中实现,但大学创建者至少有一个巨大的微编码解决方案,用于演示和教育目的。从历史上看,和今天一样,制造一个芯片需要大量的工作,每一次旋转都要花费大量的成本(想想每次旋转1到数千万美元),因为获得可以出售的东西所需的旋转次数越少越好。如果我想制造一个洗衣机控制器,为了节省大规模生产成本,我想在控制器板上的一个芯片上尽可能多地使用。我可以选择让它全部是逻辑的,而不是可编程的。但是,如果在芯片生产后有任何缺陷或功能需要更改,那就是芯片旋转,我们会放弃用以前的芯片构建的电路板。如果我们让其中的一部分是可编程的,而另一部分则无法添加功能或修复错误,而不必召回或将产品扔到货架上的几率就会下降。有时生产成本甚至更低。可编程的解决方案并不总是比不可编程的方案大,这取决于所解决的问题。该领域的经验指导这些决定。要想为这样的产品制造自己的芯片获得回报,你必须获得批量回报——花费数十万至数百万美元来生产控制器芯片,这样每个芯片都比用微控制器和其他一些芯片制造电路板便宜几块钱。

像65028086和前代处理器这样的老一代处理器试图在每条指令上做更多的工作,如上所示。指令集已经发展起来了(或者他们看了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街机游戏上运行ARM程序,比如在基于手臂的手机或基于x86的笔记本电脑上运行Asteroids,只是字节码指令集在某种程度上是为模拟器/虚拟机设计的,不一定像真实的机器语言一样设计。

例如,JAVA字节码的实现方式是,您基本上可以为每个字节码指令建立一个查找表,并在本机指令中实现它(在可能的情况下,一些指令需要/想要系统调用,而您仍然可以在本机代码中执行)。这里再想想65028080/z8086,你有一个字节的操作码,字节本身不一定是逻辑映射的,你可以把它拆开,看到操作数,它是你在查找表中使用的一个字节。看看MIPS、ARM、RISC-V和其他没有操作码的指令(MIPS和riscv尝试过,但如果你真的发现它不完整),你会发现一个更大的指令,其中部分指令(更)直接地(理想地)驱动状态机。基于操作码的设计-操作码被查找或映射到一个表中,该表从操作码/指令的位间接驱动状态机。是的,RISC有一些操作码位,CISC可能有一些可以更直接使用的位之间存在一些模糊。

字节码的另一个用途是像LLVM这样的即时编译器。从一开始,编译器前端创建字节码,然后可以在该级别对字节码进行优化,最终无论是及时还是在构建项目时,都会将字节码编译为目标汇编语言或机器代码。字节码是所有可能的前端语言和所有实现的后端目标之间的一个很好的中间抽象层。

正如我所概括的RISC与CISC的比较一样,你当然可以将JAVA编译成目标代码,同样,你也可以制作一个C编译器/工具链,为其中一个虚拟机输出字节码。


机器代码,处理器在什么上操作,它们理解什么,告诉它们做某事的指令。

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

字节码,一种理想的通用指令集,可以在虚拟机中模拟,这样编译后的程序就可以在不兼容的系统上交付和使用。只需为VM开发一次程序并交付相同的二进制文件。不必为每个目标操作系统/指令集开发一个版本。该术语还用作从工具链中可能的目标后端抽象已编译语言前端的一种方式。

最新更新