zxh0 / jvmgo-book Goto Github PK
View Code? Open in Web Editor NEW《自己动手写Java虚拟机》随书源代码
License: MIT License
《自己动手写Java虚拟机》随书源代码
License: MIT License
P71页 4.3.3 Frame结构体未对齐(operandStack)
170页invokestatic结构体Execute方法里
if !resolved.IsStatic()
应替换为
if !resolvedMethod.IsStatic()
java版CompositeEntry 中的readClass 方法循环内部直接是return,会导致只会执行一次,同时,异常发生后也会中断循环。我已解决,希望提交pr修复。
I ran into your repo and your book.
I was wondering if you had any plans of writing the book in english and selling it in amazon because i might be interested in purchasing a copy or 2?
:)
作者您好,在拜读您的著作 自己动手写Java虚拟机。在运行ch06的代码的时候,发现有两处和书本结果不同的地方
如果想和书本上的运行结果一致,应该如何修改ch06的代码,谢谢
它的两个操作数,第一个是8个字节的索引,第二个是8个字节的数字,这个数字是有符号数
所以应该是这样的:self.Index = uint(reader.ReadUint8())
self.Const = int32(int8(reader.ReadInt8()))
地址: https://github.com/shaoxiongdu/JVMStudy
描述:JVM 底层原理解析 + 面试知识点整理 2021更新版本
特点:
带在线站点 方便学习
图床采用国内访问 加载更快
参考官方规范
199页最后一行的newMultiArray()
应该为newMultiDimensionalArray()
书中115页中frame := thread.NewFrame(maxLocals, maxStack)
的两个参数均为uint16类型,而NewFrame函数接收两个uint类型的参数
第189页 ArrayLength()代码 第二行
switch self.fields.(type) {
应该是self.data
ClassFileTest的常量池大小是61如图3-8所示
然而图中却是64 -> 00 40
按照第25页上的ClassFileTest代码编译出来class文件的ConstantPool大小确实是64,不过如果去掉主函数上的RuntimeException申明就是61了
zxh0,你好!请教一下,
1) invokespecial.go中Execute为什么不用考虑resolvedMethod是private的情况?
2) if resolvedMethod.IsProtected() && 这句话中,是不是将后面的判断语句用一个新的if语句会更有利于阅读
https://github.com/zxh0/jvmgo-book/blob/master/v1/code/go/src/jvmgo/ch07/instructions/references/invokespecial.go
试了文中三种方法,都不能识别jre路径,想问下有没有人有解法
似乎应该将class改为heap
page 26 table 3-1 float33 maybe float32?
第七章中 , 下段文本发现错误
其中 method_descriptor.go 此文件应在 ch07\rtda\heap\method_descriptor.go 路径中
第一版
P52 最后一段最后一句
表3-5给出了这23中属性...
是否应该改为 表3-4给出了...
在《自己动手写java虚拟机》中,您的书中194页 anewarray.go 文件中 Execute函数中 classRef := cp.GetConstant(self.Index).(*rtc.ClassRef)
,而实际应该是classRef := cp.GetConstant(self.Index).(*heap.ClassRef)
。不知道我有没有理解错误
纸质的第一版第三章测试时报错,省略的attr_local_variable_table.go文件和cp_invoke_dynamic.go文件,应在相关小节提醒一下读者。cp_utf8.go文件中如果用简化版的decodeMUTF8函数,会报导入的包未用到,这个是小问题。
亲爱的作者,我是您书的忠实粉丝,哈哈
最近刚刚完成第三章,发现总是解析 Constant Pool的tag时候出错,fmt出来发现有3位数的tag出现
然后就到您这边下载了原书code,编译以后发现load class时候出现同样的问题
$ ./ch03.exe -cp "C:\Develop\Java\JVM" test
Constant Pool Length: 43panic: 215
goroutine 1 [running]:
panic(0x53f9e0, 0xc08241a390)
C:/Go/src/runtime/panic.go:481 +0x3f4
main.loadClass(0xc08200a256, 0x4, 0xc0820522a0, 0x1)
C:/Develop/GO/src/jvmgo-source/ch03/main.go:36 +0x105
main.startJVM(0xc0820122d0)
C:/Develop/GO/src/jvmgo-source/ch03/main.go:23 +0xfc
main.main()
C:/Develop/GO/src/jvmgo-source/ch03/main.go:16 +0x124
不知可否答疑解惑
多谢哈
266(0xff)应该是255(0xff)
张老师您好,
第一章最后go install jvmgo\ch01,报错go: jvmgo\ch01: malformed module path "jvmgo\ch01": invalid char '\'
我在网上找了很久,也试了很多方法,都解决不了,
您能帮忙看下吗?
感谢!
在定义操作数栈还有局部变量表的时候为什么使用了结构体切片,而不是使用结构体指针切片。使用结构体切片不是会引起结构体拷贝浪费空间?
这个是不是不对啊,八进制 34 = 38+41 = 28 啊,感觉classpy 显示的也不对
应该是overload吧?我联系上下文感觉说的好像是必须由描述符来区分方法的意思
求读者交流群
2.3.2上面strings.HasSuffix(path, ".JAR")后面少一个||符号
2.3.4上面readClass中defer r.Close()是不是应该判断err != nil之前,也就是放在return之前,几个defer都需要调整下位置
decodeMUTF8()函数好像错误 最终得不到结果
最近拜读大作获益匪浅,非常感谢,作者高才,本书立意非常好。
交流一下,instructions/factory.go中,可否如下重构,如果重构,有什么好处和坏处:
type CMDExexute interface {
Execute(frame *rtda.Frame)
}
var (
cmds map[byte]CMDExexute
)
func initCommands() {
if len(cmds) > 0 {
return
}
initCMDMap(0x00, func() CMDExexute { return &constants.NOP{}})
//...
}
func initCMDMap(code byte, fun func() CMDExexute) {
cmd := fun()
cmds[code] = CMDExexute(cmd)
}
func NewInstruction(opcode byte) base.Instruction {
initCommands()
v, ok := cmds[opcode]
if !ok {
panic(fmt.Errorf("Unsupported opcode: 0x%x!", opcode))
}
return v.(base.Instruction)
}
Unreachable code.Need to be deleted
P70页 push()方法内的两对大括号未对齐
第二版194页第二段代码中
classRef := cp.GetConstant(self.Index).(*rtc.ClassRef)
应该为
classRef := cp.GetConstant(self.Index).(*heap.ClassRef)
206页getField()
函数的声明中的isStatic
参数缺少类型
不知道新版有没有改正
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.