字节码是否是汇编代码和机器代码之间的中间形式?字节码与目标代码是否相同?
我认为应该是这样的 - 高级语言 -> 汇编语言 -> 机器代码/目标代码(0和1。对于不同的CPU是不同的)
是这样吗? 高级语言 -> 汇编语言 -> 字节码(将由虚拟机处理,将其转换成机器代码) -> 机器代码
我已经阅读过这篇文章 - SO- bytecode vs assembly language code,但需要更好地理解它。
字节码是否是汇编代码和机器代码之间的中间形式?字节码与目标代码是否相同?
我认为应该是这样的 - 高级语言 -> 汇编语言 -> 机器代码/目标代码(0和1。对于不同的CPU是不同的)
是这样吗? 高级语言 -> 汇编语言 -> 字节码(将由虚拟机处理,将其转换成机器代码) -> 机器代码
我已经阅读过这篇文章 - SO- bytecode vs assembly language code,但需要更好地理解它。
官方上来说,在Java中并不存在所谓的“字节码”(至少没有这个术语)——它只是“代码”。(在Java虚拟机规范中找不到“字节码”一词。)
但非正式地,它是应用于Java .class文件中Java方法定义的“Code”属性中的虚拟机“指令”的术语。该术语也被应用于几种其他语言(如C ++)的虚拟机指令(可能没有更多的“严格性”)。
虚拟机指令的概念通常认为起源于UCSD Pascal的“p-code”和几个相关的早期Pascal语言实现。基本上,它们是一种编译器“中间语言”,可以直接由“虚拟机”解释,而无需额外的编译步骤来转换为本机机器码。通常,虚拟机指令集被设计为尽可能“与机器无关”,而不特定于任何特定的操作系统或硬件指令集。
字节码指令通常是针对“堆栈架构”上的简单操作。堆栈架构非常方便,因为易于编译,允许“指令”非常简单,易于解释,并且是常规编译器场景中后续优化和代码生成步骤的方便“源”。(一个显著的例外是安卓Dalvik虚拟机,其指令集不是堆栈架构,而是基于寄存器的架构。)是的,Bytecode
是预先的机器码;然后由虚拟运行时处理并转换为机器码(0/1)。在 Java 中是 bytecode
,在 .NET 中是 IL/CIL
。
摘自这里
字节码,也称为 p-code(可移植代码),是一种指令集,旨在通过软件解释器进行高效执行。与人类可读的源代码不同,字节码是紧凑的数字代码、常量和引用(通常是数字地址),它们编码了对程序对象的类型、范围和嵌套深度进行解析和语义分析的结果。因此,它们比直接解释源代码具有更好的性能。