您可以在互联网上看到汇编代码和汇编编码器,但字节码几乎没有。这是为什么 ?在汇编中编程的需求和优点也应该适用于字节码编程。
答案 0 :(得分:5)
大多数字节码(无论如何我都看过它们)被设计成一个容易编译的目标。使用x86(例如),您可以通过手写汇编获得相当数量,因为编译时会非常痛苦。编译Java字节代码要容易得多(例如),因此手工编写它们的收益往往相对较小。
.NET使得编写生成和使用IL的程序变得容易一些,所以它往往会在那里发生更多的事情,尽管在所有的诚实中我见过的大多数例子看起来都像我们差不多完成了因为它确实存在,因为它确实是必要的。
答案 1 :(得分:5)
字节码编程远不如汇编编程那么流行/普遍的另一个原因是字节码的通用性 - 它的简单性。
字节码指令集主要是“超RISC”,指令非常简单。设计用于两个目的,为虚拟机提供快速转换/映射到本机指令集的能力,并允许高级编译器轻松创建近原生字节码。
另一方面,汇编程序也有这样简单的通用部分 - 那些是字节码解释器/即时编译器实际用来实现字节码功能的部分。很少有人专门使用本机指令集的这些部分来编写汇编程序。 (即时)编译器为您做到了这一点 但汇编程序比更多,特别是SIMD /向量指令。这些指令对于非常特殊的工作负载而言是特殊用途和高效的(“数据流”,在最广泛的意义上 - 任何通过女性喉咙吸入数据的东西)。到目前为止,在某些情况下,一些人为干预可以超过编译器结果的数量级。这样做通常需要使用这样的向量指令,这种方式可能不会强制编译器为您做。
付出的代价是必须编写本地汇编函数。
字节码缺少这些特殊用途的指令扩展,并且像这样扩展字节码将首先放弃使用字节码的最大优势之一。这将使它在CPU类型之间不可移植 - 例如,x86 / x64(SSEx),ARM(Neon)或PowerPC(AltiVec)的向量扩展太不同,无法在顶部映射单个填充层。
就教学汇编级编程而言,人们不需要实际的CPU指令集; Donald Knuth在“计算机编程艺术”中使用了一个名为MIX / MMIX的“虚拟”汇编程序,使其早于“字节码”这个词存在了几十年。可以通过x86汇编语言教授的概念也可以通过.NET字节码进行教学。
但主要原因(超出学术界,请参阅上一段)为什么人们编写汇编语言 - 利用特殊指令集扩展所带来的平台特定优化 - 不是直接编写字节码的正当理由。
答案 2 :(得分:3)
我对你在集会中对程序设计普及的说法表示怀疑,但这不是重点。
答案很简单,“因为没有必要”。人工汇编语言旨在满足设计语言的需要,并与它们而不是硬件有非常密切的关系。用高级语言不能轻易实现的功能并不多。
答案 3 :(得分:3)
不适用于字节码的程序集流行的另一个原因是,有时你需要来使用程序集(例如:在编写OS的某些CPU相关部分时)。