字节码跨平台性与执行细节举例.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
字节码跨平台性与执⾏细节举例 概念简述 Java 语⾔:跨平台的语⾔( write once, run anywhere ) 当Java源代码成功编译成字节码后,如果想在不同的平台上⾯运⾏,则⽆须再次编 这个优势不再那么吸引⼈了。Python、PHP、 Perl、Ruby、 Lisp等有强⼤的解释器。 跨平台似乎已经快成为⼀门语⾔必选的特性。 Java虚拟机:跨语⾔的平台 Java虚拟机不和包括Java在内的任何语⾔绑定,它只与“Class⽂件”这种特定的⼆进制⽂件格式所关联。⽆论使⽤何种语⾔进⾏软件开发,只要能将源⽂件编译为正确的Class⽂ 件,那么这种语⾔就可以在Java虚拟机上执⾏。可以说,统⼀⽽强⼤的Class⽂件结构,就是Java虚拟机的基⽯、桥梁。 所有的JVM全部遵守Java虚拟机规范,也就是说所有的JVM环境都是⼀样的,这样⼀来字节码⽂件可以在各种JVM运⾏。 想要让⼀个 Java程序正确地运⾏在 JVM 中,Java 源码就必须要被编译为符合 JVM规范的字节码。 前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVM规范的字节码⽂件。 javac 是⼀种能够将Java源码编译为字节码的前端编译器。 Javac编译器在将Java源码编译为⼀个有效的字节码⽂件过程中经历了4个步骤,分别是词法解析、语法解析、语义解析以及⽣成字节码。 Oracle的JDK软件包括两部分内容: ⼀部分是将Java源代码编译成Java虚拟机的指令集的编译器 另⼀部分是⽤于实现Java虚拟爱的运⾏时环境 Java的前端编译器 Java源代码的编译结果是字节码,那么肯定需要有⼀种编译器能够将Java源码编译为字节码,承担这个重要责任的就是配置在path环境变量中的javac 编译器。javac 是⼀种能够 将Java源码编译为字节码的前端编译器。 HotSpot VM并没有强制要求前端编译器只能使⽤javac 来编译字节码,其实只要编译结果符合JVM规范都可以被JVM所识别即可。 在Java的前端编译器领域,除了javac 之外,还有⼀种被⼤家经常⽤到的前端编译器,那就是内置在Eclipse 中的ECJ (Eclipse Compiler for Java)编译器。和Javac的全量式编 译不同,ECJ是⼀种增量式编译器。 在Eclipse 中,当开发⼈员编写完代码后,使⽤“Ctrl+s”快捷键时,ECJ编译器所采取的编译⽅案是把未编译部分的源码逐⾏进⾏编译,⽽⾮每次都全量编译。因此ECJ的编 译效率会⽐javac 更加迅速和⾼效,当然编译质量和javac 相⽐⼤致还是⼀样的。 ECJ不仅是Eclipse的默认内置前端编译器,在Tomcat中同样也是使⽤ECJ编译器来编译jsp⽂件。由于ECJ编译器是采⽤GPLv2的开源协议进⾏源代码公开,所以,⼤家可 以登录eclipse 官⽹下载ECJ编译器的源码进⾏⼆次开发。·默认情况下,Intellij IDEA使⽤javac 编译器。(还可以⾃⼰设置为Aspect]编译器ajc) 前端编译器并不会直接涉及编译优化等⽅⾯的技术,⽽是将这些具体优化细节移交给HotSpot的JIT编译器负责。 透过字节码指令看代码细节 问题 1. 类⽂件结构有⼏个部分? 2. 知道字节码吗?字节码都有哪些?Integer x=5; int y=5;⽐较x == y都经过哪些步骤? 代码1 Integer有⼀个缓存,范围为-128~127,Integer i1 = 10,在字节码中实质是调⽤了Integer.valueOf,在此范围内返回的就是IntergerCache中的Integer对象,否则会返回新的 Integer对象 public class IntegerTest { public static void main(String[] args) { /* Integer x = 5 ;调⽤了调⽤Integer.valueOf 从数组中返⼀个Integer对象 y 是基本数据类型的5 x y 的⽐较虽然表⾯看是引⽤类型和基本类型的⽐较,但是x会⾃动拆箱为基本数据类型,最终的⽐较就是x和y 的值进⾏的⽐较,显然相等,true */ Integer x = 5; int y = 5; System.out.pri

文档评论(0)

139****1921 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档