为什么字节码编程不像汇编编程那样流行或普遍?

Sye*_*tan 3 assembly bytecode

你可以在整个互联网上看到汇编代码和汇编编码器,但字节码几乎没有.这是为什么 ?在汇编中编程的需求和优点也应该适用于字节码编程.

Jer*_*fin 5

大多数字节码(无论如何我都看过它们)被设计成一个容易编译的目标.使用x86(例如),您可以通过手写汇编获得相当数量,因为编译时会非常痛苦.编译Java字节代码要容易得多(例如),因此手工编写它们的收益往往相对较小.

.NET使得编写生成和使用IL的程序变得容易一些,所以它往往会在那里发生更多的事情,尽管说实话我看到的大部分例子看起来像是因为它们几乎完成了它就在那里,因为它确实是必要的.


Fra*_*kH. 5

字节码编程远不如汇编编程那么流行/普遍的另一个原因是字节码的通用性 - 它的简单性.

字节码指令集主要是"超RISC",指令非常简单.设计用于两个目的,为虚拟机提供快速转换/映射到本机指令集的能力,并允许高级编译器轻松创建近原生字节码.

另一方面,汇编程序也有这样简单的通用部分 - 那些是字节码解释器/即时编译器实际用于实现字节码功能的部分.很少有人专门使用本机指令集的这些部分来编写汇编程序.(即时)编译器为您做到了这一点.
但汇编程序不止于此,尤其是SIMD /向量指令.这些指令对于非常特殊的工作负载而言是特殊用途和高效的("数据流",在最广泛的意义上 - 任何通过女性喉咙吸入数据的东西).到目前为止,在某些情况下,一些人为干预可以超过编译器结果的数量级.这样做通常需要使用这样的向量指令,这种方式可能不会强制编译器为您执行此操作.

付出的代价是必须编写本地汇编函数.

字节码缺少这些特殊用途的指令扩展,并且像这样扩展字节码将首先放弃使用字节码的最大优点之一.这将使它在CPU类型之间不可移植 - 例如,x86/x64(SSEx),ARM(Neon)或PowerPC(AltiVec)的向量扩展太不同,无法在顶部映射单个填充层.

教学汇编级编程而言,人们不需要实际的CPU指令集; Donald Knuth在"计算机编程艺术"中使用了一个名为MIX/MMIX的"虚拟"汇编程序,使其早于"字节码"这个词存在了几十年.可以通过x86汇编语言教授的概念也可以通过.NET字节码进行教学.

但主要原因(超出学术界,参见上一段)为什么人们编写汇编语言 - 利用特殊指令集扩展实现特定于平台的优化 - 不是直接编写字节码的正当理由.