当前位置: 首页 > 知识库问答 >
问题:

字节码和汇编语言是一回事吗?

蒙墨竹
2023-03-14

这个问题可能看起来很奇怪,但我仍在努力理解虚拟机的概念。我已经阅读了几个答案,但我仍然不明白Java字节码(以及MSIL)是否与汇编语言相同。据我所知,字节码和汇编都被编译为机器代码,所以从抽象的角度来说,它们处于同一水平,即比机器代码高出一步。那么字节码只是一种汇编语言,即人类可读的机器代码形式吗?如果是,那么为什么还使用汇编语言?为什么不用字节码(可在不同机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢

共有3个答案

琴俊人
2023-03-14

字节码和汇编语言不是一回事,但它们是紧密相关的。

字节码是一种简化的二进制语言,类似于机器代码。字节码规范描述了程序应该如何编码,以确保虚拟机能够正确理解和执行它。同样,处理器规范描述了所谓的指令集(ISA),它显示了程序应该如何在二进制机器代码中编码,以确保处理器能够正确理解和执行它。因此,字节码是以位序列的形式对程序进行机器友好的表示。

字节码的问题是,虽然它在极为方便机器处理的同时,也极不方便人工处理。汇编语言提供了一种基于文本的、因而人性化的字节码等价物。实际上,汇编语言在二进制字节码指令和它们的文本等价物之间建立了1对1的映射,为程序员以特定字节码(针对特定处理器或虚拟机)读取、理解和编写程序提供了方便的方法。换句话说,字节码和汇编语言都在相同的抽象级别上描述程序,但用不同的术语描述。

汇编语言中字节码指令和语句之间严格的1对1映射允许程序从二进制形式轻松而明确地转换为文本形式,反之亦然。正如您所注意到的,有一堆反汇编程序允许工程师通过将它们从字节码二进制文件转换为汇编语言文本来查看已经编译的应用程序的底层。

将程序集文本转换为字节码需要编译。但与高级编程语言相比,汇编文本的编译非常简单。汇编程序以语句方式逐个使用语句中的程序文本。通常,汇编语言指定每个语句必须放在一行单独的程序文本中,因此,汇编程序逐行使用该文本。它从每一行中提取一个忽略注释的单词和标点符号序列,并将该组单词用作映射表中的键,以查找表示相同指令的等效二进制字节序列。字节序列被放入程序的字节码中。实际上,为了消除与文本解析相关的开销,Java使用字节码,而不是在JIT期间直接从程序集文本编译机器代码。

此外,与高级语言相比,从汇编语言编译字节码不需要复杂的语法(构建抽象语法树)和语义分析,也不需要对生成的字节码进行优化。与现代编译器相比,汇编程序非常简单。与高级编程语言相比,汇编语言总是与特定的字节码相关联,从而与特定的处理器或虚拟机相关联。高级语言最初是作为程序可移植性的一种手段引入的,因此它们被设计为具有足够的通用性。相比之下,汇编语言中的程序是不可移植的,但另一方面,它们为程序员提供了对各自处理器或虚拟机的所有功能的完全访问权限,同时其中许多功能在高级语言中是无法访问的。

像Java和C#这样的编程语言所采用的思想是保持高级语言的可移植性,但最大限度地减少执行程序所需的解释/编译开销。因此,他们使用虚拟机和字节码。

请注意,多个汇编语言可以支持相同的字节码,因为相同的字节码指令与对应的不同文本字符串之间可能存在多个1对1映射的字典。每种汇编语言都可以提供自己的单词序列变体,以二进制形式描述相同的指令。例如,看看x86汇编程序。Intel使用一种表示法,Microsoft使用另一种表示法,最后GNU汇编器完全使用另一种表示法。但它们都编译成相同的机器代码。

谢财
2023-03-14

汇编语言是一种人类可读的文本语言,被设计成二进制。每个源代码行直接映射到一个二进制输出块(例如,一条可变长度x86指令),而不依赖于前面的行。(我不确定Java字节码asm是否对上下文敏感;我没有使用它)。

e、 g.mov-eax,1234汇编为相同的5个字节,而不考虑它周围的其他源代码行。(当然,忽略命名常量和汇编器宏)。

“汇编语言”(描述为汇编标签wiki的语言)的默认含义是CPU机器代码汇编语言,其中组装到输出文件中的字节是某种CPU/微处理器的本机可执行文件的指令和数据。

还有其他类型的汇编语言,如java字节码汇编,其中汇编到输出文件中的字节是在java中的。类,并且可以由JVM运行。(@Ped7g的回答进一步阐述了这一点,即JVM如何在将Java字节码转换为本机代码时进行优化。这个过程绝对不像组装。)

所有这些都只是文本语言,使汇编程序将字节汇编到输出文件中。

您可以使用汇编语言来处理任何类型的二进制文件格式,甚至是不可执行的格式。一个简单的示例:位图静态图像文件格式的汇编语言,其中可以为每个像素使用命名颜色(如午夜蓝)。汇编程序会将位(而不是像普通汇编语言那样仅整字节)组装到输出文件中。

在更复杂的情况下,您可以想象一种H.264汇编语言,其中您使用文本语法来描述标头和每个宏块的编码。

在本例中,您将设计汇编器,以将组装的宏块数据最终压缩为位流,而不是将其作为汇编语言的一部分进行描述。这就像一个产生gzip二进制文件的x86汇编程序:组装成一个deflate流。

汇编语言的一个关键特性是,它与机器代码格式非常接近,因此反汇编程序可以将二进制文件转换回asm,看起来就像最初组装的一样(当然,没有任何注释、标签名或宏)。

这就是为什么C和Java被认为是比其编译器作为输出生成的二进制/汇编更高级的语言。

盖和洽
2023-03-14

Java字节码是二进制编程语言,不是“人类可读的形式”,除非您认为一堆数字是可读的,或者您使用反汇编程序将其转换为字节码文本助记符,或者最终转换为Java源代码形式本身。

汇编通常是目标机器实际指令的文本助记符,相互1:1映射,因此汇编源代码中的一条指令将直接转换为一条机器代码指令(尽管某些CPU和汇编程序存在一些例外,例如许多RISC汇编程序会根据需要将“具有即时值的加载寄存器”转换为多条指令-加载任何即时值,而本机机器代码只能加载特定位,您必须由多条指令组成整个值)。

Java字节码与大多数CPU机器代码相比是相当高级的抽象语言,指令和内存模型的重叠非常小。唯一的相似之处是,该字节码以二进制形式存储,就像机器代码一样。

编辑:

JVM原则上是解释器,即它动态地将字节码翻译成机器代码。这就是编译器在编译时用其他语言完成的事情。

现代JVM不是经典的纯解释器,而是使用“JIT”(实时)编译器在执行之前将少量java字节码编译成本机代码,使用缓存避免对已知字节码进行第二次编译。类文件,并使用性能数据的运行时跟踪更好地指导JIT编译器,哪些字节码应该进行大量优化(经常运行或内部循环),哪些应该尽快编译,而不需要关注性能。

因此,对于现代JVM,很难谈论解释器,这是一个非常复杂的解决方案。C#往往更进一步,有时会将部分二进制文件预编译成通用平台的机器代码(字节码形式仅作为不常见平台的后备)。

所有这些(甚至不相似)都不会发生在机器代码中。它只是在CPU上执行。

 类似资料:
  • 本文向大家介绍什么是汇编语言,包括了什么是汇编语言的使用技巧和注意事项,需要的朋友参考一下  汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器

  • 机器语言 机器语言是指令的集合。 汇编语言 汇编语言的主体是汇编指令。 存储器 随机存储器RAM,可读可写,必须带电存储,关机后存储的内容丢失 只读存储器ROM,只读,关机后其中的内容不丢失 装有 BIOS (基本输入输出设备)的ROM 接口卡上的RAM:显存 外存(storage,磁盘)和内存(memory,主存,高速缓存) 内存地址空间 存储单元:1个字节(byte) 总线 地址总线:CPU是

  • 第12章 汇编语言和C语言 C/C++语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:寄存器变量、位操作等。所以,C语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前主要的C语言程序开发环境,如:Turbo C/C++、Borland C/C++等,也都提供了很好的混合编程手段。 本章主要介绍汇编语言和C语言的混合编程和调用方法。虽然其它高级

  • 程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranlation)的步骤。如今使用的计算机语言有几百种,可以分为三大类: 机器语言 汇编语言 高级语言 任何计算机只能直接理解本身酌机器语言(machine language)。机器语言是特定计算机的自然语言,由计算机的硬件设计定义。机器语言通常由一系列数字组成(最终简化0和1),让计算机一次一个地执行最基本的操作。机器

  • 问题内容: 我知道供应商有自己的原始SQL语言子集,这些子集用C(类似于Postgre SQL)或MS-SQL Server(C ++)等编写。 那么,原始的SQL是用C编写的,还是在Assembly中创建的呢?我真的找不到关于其原始语言根源的明确答案(除了历史等) 问题答案: 在Oracle上进行的快速历史搜索得出: 在70年代后期,Ingres刚开始在加州大学伯克利分校工作时,三个从事CIA合

  • 《汇编语言》(Assembly Language)是计算机专业中一门重要的基础课程,是一种面向机器的低级语言。它依赖于硬件,能通过巧妙的程序设计充分发挥硬件的潜力。汇编语言程序产生的代码运行效率高。因此,到目前为止,许多软件系统(例如操作系统等)的核心部分仍然用汇编语言来编写。