自己动手写Python虚拟机读书会笔记
第一天。导言和基本概念
虚拟机有2种,一种就叫虚拟机,VM,如VM Ware。一种叫语言虚拟机,如java语言的虚拟机,JVM
其实我有一个疑问,JVM屏蔽了下面的硬件/CPU指令集差异,做到了上面的JAVA代码的一次编译,在各不同硬件平台的JVM都能运行
VM Ware可以做到吗,比如VMWare里的windows环境,可以运行到ARM硬件平台上吗?这是我的疑问
讲了javac的编译流程,也讲了如何查看字节码和反编译
HotSpot字面意思就是热点地区,热中之热,那就进行JIT编译为机器码
从个人角度来说,写虚拟机是有点超出个人能力的事情,但仍然可以从本次读书中吸取知识
比如,在编译过程中,对Java代码的注解、foreach迭代等的处理,会从另外一个角度全面化对编码的认识。
另外,提升对泛型的理解。
对于指令集,可以分为基于栈的,和基于寄存器的
JVM是基于栈的,而CPU,我理解是基于寄存器的
第二天。构建对象系统
我们都知道流行的面向对象编程OOP。那么在虚拟机里,如何明确对象的类呢?
klass:对象的类型
每个对象都有一个到kclass的引用,来表明自己的类型。这个引用叫Oop.Ordinary object pointer.
所以,一个对象在虚拟机中的结构,除了我们编码时定义的结构外,还包含
object header, klass pointer
python到底是强类型语言,还是弱类型语言?
首先,python在声明时可以不指定变量类型,可以动态变化
所以它是弱类型喽?其实不对。虽然变化,但是实际上是有类型的,所以是强类型
这么说来,为什么js是弱类型?js完全没有类型概念?我还有点不明白
还讲了动态类型的对象动态新增属性的2种机制:Hash表,和二级指针扩展
第三天。内存管理
内存如果管理的不好,1一块内存使用完毕,却没有回收,不能再次使用。这是浪费,与节约型社会的目标相违背
2一块内存还在使用中,竟然又分配给其他用户使用,造成冲突、异常,这与和谐型社会的目标相违背
内存管理的流程:
1分配内存 2识别垃圾 3回收内存
从头到尾的管理,分配是你,识别是你,回收也是你,是你是你还是你,有没有一点做管理者的感觉了?
分配方法有二:free-list & bump-pointer
free-list是用一个列表来记录,这个列表就是管理者的小本子
bump-pointer在堆中按顺序分配
识别垃圾的方法是从Root出发,不可达的对象就是垃圾
回收机制有三:Sweep to free-list就是小本子记下那些已回收,压缩Compaction 和 撤离Evacuation
后二者都会移动对象
第四天。函数和方法
都知道函数在js是一等公民,比如高阶函数。一等公民的含义:函数可以作为参数传入其他函数,也可以作为返回值被返回
注意,这里是函数作为参数,不是调用函数的返回值作为参数
实际上,在很多现代语言中,函数都是一等公民
有二种方式来做,一是作为语言中的类库,二是在虚拟机中实现
访问变量的顺序:LEGB:Local-Enclosing-Global-Builtin
函数参数的默认值,可以用不可变对象,不要用可变对象,除非,你知道自己在做什么,想要什么:)
给编码带来方便的lambda表达式,使用FunctionObject。lambda有非常简单的定义和规则,却是一套图灵完备的演算系统。
函数和方法的区别
函数就是独立的,方法和其owner是有绑定的。另外python里没有显式的类方法或静态方法。
语法糖,decorator, @符号
这一章的内容,需要配合高级编程能力来理解
第五天。其他。
迭代器:在编程语言中很常见。基本上是现代语言内置的能力。讲虚拟机对它支持
yield: 讲函数转换为迭代器对象
线程:OS级别,OS负责调度
协程:用户级别。与线程是多对多的关系。
它与线程的原理类似。主要有保存/恢复现场,调度,维护协程与IO动作的对应,协程之间的同步等
JIT:热的烫手的方法,会开辟一块内存,翻译为机器码后放进去。这块内存的权限是可写,写执行。还是不会落盘的。之后的执行就调机器码,执行效率更高
Profiling: 动态分析技术,以过去预测未来。实际与预期不符,也可以退优化。与预期相符,就享受优化后提速的好处
比如,条件判断中,根据历史数据进行统计得到的结果,将执行比率最多的分支放到最前面
解释器:逃生门。永远在这里。随时欢迎优化失败的你回家
- 点赞
- 收藏
- 关注作者
评论(0)