自己动手写Python虚拟机读书会笔记

举报
黄生 发表于 2020/09/07 15:50:36 2020/09/07
【摘要】 第一天。导言和基本概念虚拟机有2种,一种就叫虚拟机,VM,如VM Ware。一种叫语言虚拟机,如java语言的虚拟机,JVM其实我有一个疑问,JVM屏蔽了下面的硬件/CPU指令集差异,做到了上面的JAVA代码的一次编译,在各不同硬件平台的JVM都能运行VM Ware可以做到吗,比如VMWare里的windows环境,可以运行到ARM硬件平台上吗?这是我的疑问讲了javac的编译流程,也讲了如...

第一天。导言和基本概念


虚拟机有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: 动态分析技术,以过去预测未来。实际与预期不符,也可以退优化。与预期相符,就享受优化后提速的好处

比如,条件判断中,根据历史数据进行统计得到的结果,将执行比率最多的分支放到最前面

解释器:逃生门。永远在这里。随时欢迎优化失败的你回家


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200