当前位置:首页 » 编程语言 » java机器码

java机器码

发布时间: 2022-06-06 08:15:02

java语言源文件编译生成的字节码和机器码有什么区别

字节码要根据不同的操作系统来转换用机器码后再在本操作系统上运行。

② 什么是Java字节码

它是程序的一种低级表示,可以运行于Java虚拟机上。将程序抽象成字节码可以保证Java程序在各种设备上的运行
Java号称是一门“一次编译到处运行”的语言,从我们写的java文件到通过编译器编译成java字节码文件(.class文件),这个过程是java编译过程;而我们的java虚拟机执行的就是字节码文件。不论该字节码文件来自何方,由哪种编译器编译,甚至是手写字节码文件,只要符合java虚拟机的规范,那么它就能够执行该字节码文件。

JAVA程序的运行

因为Java具有跨平台特性,为了实现这个特性Java执行在一台虚拟机上,这台虚拟机也就是JVM,Java通过JVM屏蔽了不同平台之间的差异,从而做到一次编译到处执行。JVM位于Java编译器和OS平台之间,Java编译器只需面向JVM,生成JVM能理解的代码,这个代码即字节码,JVM再将字节码翻译成真实机器所能理解的二进制机器码。
字节码是怎么产生的?

我们所编写的程序都是.java格式,通常在执行的时候也许点击一下eclipse的运行键就可以在控制台看到运行结果,但是也可以更酷一些,如果你装了JDK,那就可以直接在以命令行的方式编译运行你的.java文件,编译后会形成.class文件,这个.class文件即字节码。
字节码怎么解读?

上图是编译好的字节码文件,即一堆16进制的字节,如果使用IDE去打开,也许看到的是已经被反编译的我们所熟悉的java代码,但这才是纯正的字节码

这里只介绍字节码由哪些部分组成, 具体的意思自行网络或者看文尾的连接, 有较为详细的讲解

上图即字节码文件的组成部分, Class文件的结构不像XML等描述语言那样松散自由。由于它没有任何分隔符号,

所以,以上数据项无论是顺序还是数量都是被严格限定的。哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变, 如上图左侧即每一部分规定的长度
魔数(Magic Number)

魔数是用来区分文件类型的一种标志,一般都是用文件的前几个字节来表示。
比如0XCAFE BABE表示的是class文件,那么有人会问,文件类型可以通过文件名后缀来判断啊?是的,但是文件名是可以修改的(包括后缀),那么为了保证文件的安全性,将文件类型写在文件内部来保证不被篡改。
至于为什么是CAFE BABE估计大家也能猜到, 程序员与咖啡的不解之缘
版本号(Version)
版本号含主版本号和次版本号,都是各占2个字节。在此Demo种为0X0000 0033。其中前面的0000是次版本号,后面的0033是主版本号。通过进制转换得到的是次版本号为0,主版本号为51。高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式未发生任何变化. 这就是target参数的用处,可以在使用JDK 1.7编译时指定-target 1.5
常量池(Constant Pool)
常量池是Class文件中的资源仓库, 量池中主要存储2大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。常量池是一个表结构,在表的内容前有一个类型的计数器,表示常量池的长度
上面的表中描述了11中数据类型的结构,其实在jdk1.7之后又增加了3种(CONSTANT_MethodHandle_info,CONSTANT_MethodType_info以及CONSTANT_InvokeDynamic_info)。这样算起来一共是14种
访问标志(Access_Flag)
访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final。通过上面的源代码,我们知道该文件是类并且是public。
0x 00 21:是0×0020和0×0001的并集。其中0×0020这个标志值涉及到字节码指令

类索引(This Class Name)
类索引用于确定类的全限定名
0×00 03 表示引用第3个常量,同时第3个常量引用第19个常量,查找得”com/demo/Demo”。#3.#19
父类索引(Super Class Name)
0×00 04 同理:#4.#20(java/lang/Object)
接口索引(Interfaces)
通过上边字节码图可以看到,这个接口有2+n个字节,前两个字节表示的是接口数量,后面跟着就是接口的表。我们这个类没有任何接口,所以应该是0000。果不其然,查找字节码文件得到的就是0000。
字段表集合(fields)
字段表用于描述类和接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量。接下来就是2+n个字段属性。我们只有一个属性a,所以应该是0001。查找文件果不其然是0001。
该区域含有字段的访问标志, 访问权限, 字段的名称索引, 字段的描述符索引, 属性表
描述符的作用就是用来描述字段的数据类型、方法的参数列表和返回值。而属性表就是为字段表和方法表提供额外信息的表结构。对于字段来说,此处如果将字段声明为一个static final msg = "aaa"的常量,则字段后就会跟着一个属性表,其中存在一项名为ConstantValue,指向常量池中的一个常量,值为的"aaa"。
方法(methods)
包含访问标志表, 方法名索引 , 方法描述符索引, 属性表数量,等
Attribute
0×0001 :同样的,表示有1个Attributes了。
0x000f : #15(“SourceFile”)
0×0000 0002 attribute_length=2
0×0010 : sourcefile_index = #16(“Demo.java”)
SourceFile属性用来记录生成该Class文件的源码文件名称。

③ java编译后产生 字节码,还是 机器码能不能简单解释一下

java虚拟机是可运行java字节码的假象计算机 java的跨平台性也是相对与其他编程语言而言的
先介绍一下c语言的编译过程吧
先是C语言源程序也就是。c的文件
经过C编译程序编译后生成windows可执行文件exe文件
然后在windows中执行。。
再介绍java的编译过程
先是java源程序 扩展名为。java的文件
由java编译程序将java字节码文件 就是class文件
然后在java虚拟机中执行。。

④ java语言为什么使用的java虚拟机而不是直接翻译成机器代码(即和C语言一样)

目前常用的系统或者平台其实没有几个,这种跨平台性,在我看来真的是浪费了。C/C++可以高效率运行是因为直接编译成机器码,按说Java语法的也可以的啊,只是它选择了虚拟机来搞快平台,用喜欢的语法,翻译成机器码,岂不是和C/C++一样的效率了。

⑤ java程序编译后会产生字节码还是机器码

Java编译后是字节码,C/C++以前全都是是机器码。
电脑只能运行机器码。Java在运行的时候把字节码变成机器码。
C/C++在编译的时候直接编译成机器码。

不过现在微软的Visual Studio C++ 2005以后的C++也可以编译成字节码,用CLR运行是转换成机器码(和Java差不多)。

⑥ 为什么要学习java

目前最火热的三种语言
1.python
凭借着人工智能的东风,python语言一路水涨船高,在2019年最新的计算机语言中排名第一。
2.C语言
对比C++,C语言是功能减少的简化版本,这使C语言能够在内存有限的大量硬件设备中运行。
3.Java语言
Java是目前最为广泛的网络编程语言。
为什么我们要学习Java?
1.Java的应用范围很广。
在近三年的计算机编程语言中,java分别在2017年、2018年排名第一,在2019年排名第三,是目前当之无愧的最流行的编程语言之一。
80%以上的高端企业级应用都使用JAVA平台。Java在通信及网络、金融、电子政务、手机游戏和嵌入式设备及消费类电子产品等领域受到企业青睐。
2.Java的跨平台性。
由于计算机只能识别机器码,因此高级语言源代码想要在计算机上运行需要被编译成机器码。而同样的语义在不同的计算机平台拥有不同的机器码,因此不同的平台需要特定的编译器。不同的编译器也导致同样功能的程序在不同的平台表达需要不同的源代码,这样就会导致企业的开发成本过高。
针对这种情况,Java创造了一种字节码文件,通过一种编译器将Java源代码编译成字节码文件,然后计算机平台特定的Java虚拟机(JVM)将字节码文件解释为机器码。如此就实现了Java的跨平台特性,大大降低了企业的开发成本。
3.Java语言简单易学。
Java是一门强类型语言,语言结构严谨,对于初学者来说十分友好。
4.基于面向对象编程更符合人类的思维方式,便于人类编写。
Java引入了类的概念,类是用来创建对象的模板,它包含被创建的对象的状态描述和方法的定义。
5.Java是一门很好的辅助性语言。
Java已经有超过十年的历史,许多编程语言都有借鉴它的编程思想和设计模式,当你精通Java语言之后,学习其他语言也会方便很多。

⑦ java虚拟机的机器码保存在什么文件中

.class为文件后缀名的文件。

⑧ “java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码”这种理解对吗

你的说法是正确的
java解释器就是java虚拟机,是jdk或jre目录下bin目录中的java.exe文件

⑨ JAVA源文件需要先解释成字节码文件,在编译成对应机器码并运行

为了保持它跨平台的特性,java源文件先编译成一种中间码,在运行的时候再实时编译成目标平台的机器码

热点内容
java位与运算 发布:2025-02-08 18:48:22 浏览:217
sift算法详解 发布:2025-02-08 18:35:23 浏览:580
linux标准错误的是 发布:2025-02-08 18:32:07 浏览:916
蛮多小说怎么缓存书架的小说 发布:2025-02-08 18:30:16 浏览:889
光遇花开脚本封号吗 发布:2025-02-08 18:23:15 浏览:535
怎么弄ld帐号和密码 发布:2025-02-08 18:11:42 浏览:629
新逍客20发动机压缩比 发布:2025-02-08 17:58:10 浏览:116
qq号和密码我都知道为什么登不上 发布:2025-02-08 17:52:21 浏览:873
宝塔服务器ip进不去 发布:2025-02-08 17:52:18 浏览:383
担保中介源码 发布:2025-02-08 17:14:37 浏览:413