您好,欢迎来到聚文网。
登录
免费注册
网站首页
|
搜索
热搜:
磁力片
|
漫画
|
购物车
0
我的订单
商品分类
首页
幼儿
文学
社科
教辅
生活
销量榜
自己动手写Java虚拟机
装帧: 平装
出版社: 机械工业出版社
作者: 张秀宏 著
出版日期: 2016-05-01
商品条码: 9787111534136
版次: 1
开本: 16开
页数: 267
出版年份: 2016
定价:
¥69
销售价:
登录后查看价格
¥{{selectedSku?.salePrice}}
库存:
{{selectedSku?.stock}}
库存充足
{{item.title}}:
{{its.name}}
加入购物车
立即购买
加入书单
收藏
精选
¥5.83
世界图书名著昆虫记绿野仙踪木偶奇遇记儿童书籍彩图注音版
¥5.39
正版世界名著文学小说名家名译中学生课外阅读书籍图书批发 70册
¥8.58
简笔画10000例加厚版2-6岁幼儿童涂色本涂鸦本绘画本填色书正版
¥5.83
世界文学名著全49册中小学生青少年课外书籍文学小说批发正版
¥4.95
全优冲刺100分测试卷一二三四五六年级上下册语文数学英语模拟卷
¥8.69
父与子彩图注音完整版小学生图书批发儿童课外阅读书籍正版1册
¥24.2
好玩的洞洞拉拉书0-3岁宝宝早教益智游戏书机关立体翻翻书4册
¥7.15
幼儿认字识字大王3000字幼儿园中班大班学前班宝宝早教启蒙书
¥11.55
用思维导图读懂儿童心理学培养情绪管理与性格培养故事指导书
¥19.8
少年读漫画鬼谷子全6册在漫画中学国学小学生课外阅读书籍正版
¥64
科学真好玩
¥12.7
一年级下4册·读读童谣和儿歌
¥38.4
原生态新生代(传统木版年画的当代传承国际研讨会论文集)
¥11.14
法国经典中篇小说
¥11.32
上海的狐步舞--穆时英(中国现代文学馆馆藏初版本经典)
¥21.56
猫的摇篮(精)
¥30.72
幼儿园特色课程实施方案/幼儿园生命成长启蒙教育课程丛书
¥24.94
旧时风物(精)
¥12.04
三希堂三帖/墨林珍赏
¥6.88
寒山子庞居士诗帖/墨林珍赏
¥6.88
苕溪帖/墨林珍赏
¥6.88
楷书王维诗卷/墨林珍赏
¥9.46
兰亭序/墨林珍赏
¥7.74
祭侄文稿/墨林珍赏
¥7.74
蜀素帖/墨林珍赏
¥12.04
真草千字文/墨林珍赏
¥114.4
进宴仪轨(精)/中国古代舞乐域外图书
¥24.94
舞蹈音乐的基础理论与应用
内容简介
本书将带领读者使用Go语言,从零开始打找造属于我们自己的Java虚拟机实现。全书共分11章,从代码和实战的角度对class文件格式、运行时数据区域、指令集和解释器、类和对象内部结构、方法调用和返回、异常处理等Java虚拟机核心概念进行了详细讨论。本书循序渐进,每一章都有可以独立编译和运行的代码。通过实践的方式,相信读者可以更深刻地领悟Java虚拟机的工作原理。
作者简介
张秀宏,资历Java服务器开发工程师,有多年的Java开发、游戏服务器开发和架构经验,对Java虚拟机有很好深入的研究。曾在EA、华娱无线等游戏公司担任不错服务器工程师职位,现任乐元素Lead软件工程师。
目录
前言
第1章命令行工具1
1.1准备工作1
1.1.1安装JDK1
1.1.2安装Go2
1.1.3创建目录结构3
1.2java命令4
1.3编写命令行工具5
1.4测试本章代码7
1.5本章小结8
第2章搜索class文件9
2.1类路径9
2.2准备工作10
2.3实现类路径11
2.3.1Entry接口12
2.3.2DirEntry13
2.3.3ZipEntry14
2.3.4CompositeEntry15
2.3.5WildcardEntry17
2.3.6Classpath17
2.4测试本章代码20
2.5本章小结21
第3章解析class文件23
3.1class文件24
3.2解析class文件25
3.2.1读取数据26
3.2.2整体结构27
3.2.3魔数30
3.2.4版本号31
3.2.5类访问标志32
3.2.6类和超类索引32
3.2.7接口索引表33
3.2.8字段和方法表33
3.3解析常量池35
3.3.1ConstantPool结构体35
3.3.2ConstantInfo接口37
3.3.3CONSTANT_Integer_info39
3.3.4CONSTANT_Float_info40
3.3.5CONSTANT_Long_info40
3.3.6CONSTANT_Double_info41
3.3.7CONSTANT_Utf8_info42
3.3.8CONSTANT_String_info43
3.3.9CONSTANT_Class_info45
3.3.10CONSTANT_NameAnd-Type_info46
3.3.11CONSTANT_Fieldref_info、
CONSTANT_Methodref_info和CONSTANT_Interface-Methodref_info47
3.3.12常量池小结49
3.4解析属性表50
3.4.1AttributeInfo接口50
3.4.2Deprecated和Synthetic属性53
3.4.3SourceFile属性54
3.4.4ConstantValue属性55
3.4.5Code属性56
3.4.6Exceptions属性58
3.4.7LineNumberTable和
LocalVariableTable属性59
3.5测试本章代码61
3.6本章小结63
第4章运行时数据区65
4.1运行时数据区概述66
4.2数据类型67
4.3实现运行时数据区68
4.3.1线程68
4.3.2Java虚拟机栈69
4.3.3帧71
4.3.4局部变量表72
4.3.5操作数栈74
4.3.6局部变量表和操作数栈实例分析76
4.4测试本章代码81
4.5本章小结83
第5章指令集和解释器85
5.1字节码和指令集86
5.2指令和指令解码88
5.2.1Instruction接口89
5.2.2BytecodeReader91
5.3常量指令92
5.3.1nop指令92
5.3.2const系列指令93
5.3.3bipush和sipush指令94
5.4加载指令94
5.5存储指令95
5.6栈指令96
5.6.1pop和pop2指令96
5.6.2dup指令97
5.6.3swap指令98
5.7数学指令98
5.7.1算术指令98
5.7.2位移指令99
5.7.3布尔运算指令101
5.7.4iinc指令102
5.8类型转换指令102
5.9比较指令103
5.9.1lcmp指令103
5.9.2fcmp和dcmp指令104
5.9.3if指令105
5.9.4if_icmp指令106
5.9.5if_acmp指令107
5.10控制指令108
5.10.1goto指令108
5.10.2tableswitch指令108
5.10.3lookupswitch指令110
5.11扩展指令111
5.11.1wide指令111
5.11.2ifnull和ifnonnull指令113
5.11.3goto_w指令113
5.12解释器114
5.13测试本章代码118
5.14本章小结120
第6章类和对象121
6.1方法区122
6.1.1类信息122
6.1.2字段信息124
6.1.3方法信息125
6.1.4其他信息127
6.2运行时常量池127
6.2.1类符号引用129
6.2.2字段符号引用130
6.2.3方法符号引用132
6.2.4接口方法符号引用132
6.3类加载器133
6.3.1readClass()134
6.3.2defineClass()135
6.3.3link()136
6.4对象、实例变量和类变量136
6.5类和字段符号引用解析141
6.5.1类符号引用解析141
6.5.2字段符号引用解析142
6.6类和对象相关指令144
6.6.1new指令144
6.6.2putstatic和getstatic指令146
6.6.3putfield和getfield指令148
6.6.4instanceof和checkcast指令150
6.6.5ldc指令154
6.7测试本章代码156
6.8本章小结160
第7章方法调用和返回161
7.1方法调用概述161
7.2解析方法符号引用163
7.2.1非接口方法符号引用163
7.2.2接口方法符号引用165
7.3方法调用和参数传递166
7.4返回指令169
7.5方法调用指令170
7.5.1invokestatic指令170
7.5.2invokespecial指令170
7.5.3invokevirtual指令172
7.5.4invokeinterface指令174
7.6改进解释器176
7.7测试方法调用178
7.8类初始化181
7.9本章小结185
第8章数组和字符串187
8.1数组概述187
8.2数组实现188
8.2.1数组对象188
8.2.2数组类190
8.2.3加载数组类191
8.3数组相关指令191
8.3.1newarray指令192
8.3.2anewarray指令194
8.3.3arraylength指令195
8.3.4aload指令196
8.3.5astore指令197
8.3.6multianewarray指令198
8.3.7完善instanceof和checkcast指令201
8.4测试数组203
8.5字符串204
8.5.1字符串池205
8.5.2完善ldc指令206
8.5.3完善类加载器207
8.6测试字符串207
8.7本章小结210
第9章本地方法调用211
9.1注册和查找本地方法212
9.2调用本地方法213
9.3反射215
9.3.1类和对象之间的关系215
9.3.2修改类加载器217
9.3.3基本类型的类219
9.3.4修改ldc指令220
9.3.5通过反射获取类名221
9.3.6测试本节代码224
9.4字符串拼接和String.intern()方法225
9.4.1Java类库225
9.4.2System.arraycopy()方法227
9.4.3Float.floatToRawIntBits()和Double.doubleToRawLongBits()方法229
9.4.4String.intern()方法229
9.4.5测试本节代码230
9.5Object.hashCode()、equals()和toString()231
9.6Object.clone()233
9.7自动装箱和拆箱235
9.8本章小结238
第10章异常处理239
10.1异常处理概述239
10.2异常抛出240
10.3异常处理表241
10.4实现athrow指令245
10.5Java虚拟机栈信息248
10.6测试本章代码251
10.7本章小结252
第11章结束253
11.1System类是如何被初始化的253
11.2初始化System类255
11.3System.out.println()是如何工作的258
11.4测试本章代码260
11.5总结260
附录指令表263
摘要
Preface 前 言为什么编写本书Java语言于1995年首次公开发布,很快便取得了巨大的成功,成为使用最为广泛的编程语言之一。到现在,Java已经经历了20多个年头。在这期间,无论是Java语言本身还是Java虚拟机技术,都取得了长足的进步。现如今,Java依然长期占据TIOBE网站的编程语言排行榜首。最近更是被TIOBE选为2015年度编程语言,风采可谓不减当年。
众所周知,Java早已不仅仅是一个单纯的语言,而是一个开放的平台。活跃在这个平台之上的编程语言除了Java之外,还有Groovy、Scala、Clojure、Jython和JRuby等。Java虚拟机则是支持这个平台的基石。
市面上教授Java语言的书籍种类繁多,相比之下,介绍Java虚拟机的书籍却是凤毛麟角。这足以说明Java作为一门高级语言是多么成功(让程序员远离底层),但并不代表Java虚拟机技术不重要。恰恰相反,当Java语言掌握到一定程度时,Java虚拟机原理自然就会成为必须越过的一道鸿沟。
近几年,国内涌现出了一些讨论Java虚拟机技术的优秀书籍,这些书籍主要以分析OpenJDK或Oracle JDK为主。本书另辟蹊径,带领读者自己动手从零开始用Go语言编写Java虚拟机。这样做好处颇多,弥补了OpenJDK等虚拟机的不足。
首先,OpenJDK等虚拟机实现非常复杂。对于初学者而言,很容易陷入代码的海洋和不必要的细节之中。其次,OpenJDK等虚拟机大多用C++语言编写。C++语言非常复杂,理解起来难度很大。最后,单纯阅读代码比较乏味,缺少乐趣,而脱离代码又很难透彻讨论技术。通过自己动手编写代码,很好地避免了上述问题。看着自己实现的Java虚拟机功能逐渐增强,看到可以运行的Java程序越来越复杂,成就感非常强。总之,通过实践的方式,相信读者可以更深刻地领悟Java虚拟机的工作原理。
Go是Google公司于2012年推出的系统编程语言。从到硬件的距离来看,Go语言介于C和Java之间。Go的语法和C类似,但更加简洁,因此很容易学习。Go语言内置了丰富的基本数据类型,并且支持结构体,所以很适合用来实现Java虚拟机。Go支持指针,但并不支持指针运算,因此用Go编写的代码要比C代码更加安全。此外,Go还支持垃圾回收和接口等Java类语言中才有的功能,大大降低了实现Java虚拟机的难度。
以上是本书采用Go语言编写Java虚拟机的原因,希望读者在学习本书的过程中,可以喜欢上Go这门还很年轻的语言。
本书主要内容全书一共分为11章,各章内容安排如下:
第1章:安装开发环境,讨论java命令,并编写一个类似Java的命令行程序。
第2章:讨论Java虚拟机如何搜索class文件,实现类路径。
第3章:讨论class文件结构,实现class文件解析。
第4章:讨论运行时数据区,实现线程私有的运行时数据区,包括线程、Java虚拟机栈、栈帧、操作数栈和局部变量表等。
第5章:讨论Java虚拟机指令集和解释器,实现解释器和150余条指令。
第6章:讨论类、对象以及线程共享的运行时数据区,实现类加载器、方法区以及部分引用类指令。
第7章:讨论方法调用和返回,实现方法调用和返回指令。
第8章:讨论数组和字符串,实现数组相关指令和字符串池。
第9章:讨论本地方法调用,实现Object.hashCode()等本地方法。
第10章:讨论异常处理机制,实现athrow指令。
第11章:讨论System类的初始化过程和System.out.println()的工作原理等,并对全书进行总结。
本书面向读者本书主要面向有一定经验的Java程序员,但任何对Java虚拟机工作原理感兴趣的读者都可以从本书获益。如前所述,本书将使用Go语言实现Java虚拟机。书中会简要介绍Go语言的部分语法以及与Java语言的区别,但不会深入讨论。由于Go语言相对比较简单,相信任何有C系列语言(如C、C++、C#、Objective-C、Java等)经验的读者都可以轻松读懂书中的源代码。
如何阅读本书本书代码经过精心调整,每一章(第1章除外)都建立在前一章的基础上,但每一章又都可以单独编译和运行。本书内容主要围绕代码对Java虚拟机展开讨论。读者可以从第1章开始,按顺序阅读本书并运行每一章的源代码,也可以直接跳到感兴趣的章节阅读,必要时再阅读其他章节。
参考资料本书主要参考了下面这些资料:
《Java虚拟机规范》第8版《Java语言规范》第8版《深入Java虚拟机》(原书第2版)其中《Java虚拟机规范》主要参考了第8版,但同时也参考了第7版和更老的版本。《Java语言规范》则主要参考了第8版。读者可以从http://docs.oracle.com/javase/specs/index.html获取各个版本的《Java虚拟机规范》和《Java语言规范》。
笔者早在十年前还在上学时就读过由Bill Venners著,曹晓钢等翻译的《深入Java虚拟机(原书第2版)》。但是由于当时水平有限,理解得并不是很深入。时隔十年,重读此书还是颇有收获。较之《Java虚拟机规范》的严谨和刻板,该书更加通俗易懂。原书作者已经将部分章节放于网上,网址是http://www.artima.com/insidejvm/ed2/,读者可以免费阅读。
以上是Java方面的资料。Go语言方面主要参考了Go官网上的各种资料,包括《如何编写Go程序》《Effective Go》《Go语言规范》以及Go标准库文档等。另外,在本书的写作过程中,笔者还通过搜索引擎查阅了遍布于网络上(特别是StackOverflow和Wikipedia)的各种资料,这里就不一一罗列了。
下载本书源代码本书源代码可以从https://github.com/zxh0/jvmgo-book获取。代码分为Go和Java两部分,目录结构如下:
https://github.com/zxh0/jvmgo-book/v1/code/|-go|-src|-jvmgo|-java|-exampleGo语言部分是Java虚拟机代码,每章为一个子目录,可以独立编译和运行。Java语言部分是Java示例代码,每章为一个包。Java代码按照Gradle工程标准目录结构组织,可以用Gradle编译整个工程,也可以用javac分别编译每个文件。
勘误和支持《Java虚拟机规范》对Java虚拟机的工作机制有十分严谨的描述。但是由于笔者水平和表达能力有限,本书一定存在表述不精确、不准确,甚至不正确的地方。另外,由于时间有限,书中也难免会有一些疏漏之处,还请读者谅解。
本书的勘误将通过https://github.com/zxh0/jvmgo-book/blob/master/v1/errata.md发布和更新。如果读者发现书中的错误、有改进意见,或者有任何问题需要讨论,都可以在本书的Github项目上创建Issue。此外也可以加入QQ群(470333113)与读者交流。
致谢首先要感谢我的家人和朋友,没有你们的鼓励、支持和帮助,本书不可能面世。这里特别感谢我的妻子,在我陷入低谷的时候,叮嘱我继续努力不要放弃。还有我的朋友范森,每章开头的可爱鼹鼠就是出自他手,希望这些鼹鼠能给枯燥的文字增添一些色彩。
其次感谢我所在的公司乐元素,它为我提供了舒适和愉悦的工作环境,使我在工作之余可以全心投入本书的写作之中。
代码被我放到了Github上,地址是https://github.com/zxh0/jvm.go。不过由于能力和时间有限,这个虚拟机离完整实现《Java虚拟机规范》还相距甚远。2015年4月份,我停止了jvm.go的编写,同时开始改造代码,酝酿本书。感谢所有关注过jvm.go项目的人,没有你们的帮助就没有jvm.go,也就没有本书。
最后,感谢机械工业出版社华章分社的编辑,本书能够顺利出版离不开他们的敬业精神和一丝不苟的工作态度。
×
Close
添加到书单
加载中...
点此新建书单
×
Close
新建书单
标题:
简介:
蜀ICP备2024047804号
Copyright 版权所有 © jvwen.com 聚文网