业余民科,垃圾内容
文章目录
本来想在Programming Languages, PartA, B, C都上完之后再写一篇博客的总结的,但是最近比较闲,所以从Part C开始写一些东西吧。
首先ruby给我的感觉就是够骚,各种花里胡哨的充满想象力的使用方式,例如class definition are dynamic。Dan Grossman讲的东西够plain,好的讲述者应该能以简单的语言有针对性的讲述想要表达的内容,想起自己几年前在介绍clang static analyzer的时候,大段大段的内容正说明我没有理解透。
OOP的核心
- subclasses
- inheritance
- overrding
Subtyping/Subclassing
Dan没有讲关于Subtyping的理论的东西,这也是为什么《Programming Languages》这门儿课定位于普通开发者。这个video《#53 Subtyping》简要的介绍了什么是subtyping。
注:《#53 Subtyping》这是一门儿很好的课
首先Type are Contracts,另外
Subtypes are subject to all the constraints of their supertypes(May add more constrains)
也就是subtypes的对象可以放在任何接受supertypes对象的位置,但是反过来不行。而这一概念进行系统阐述的人是Barbara Liskov,见Liskov substitution principle。
Subtype Requirement:
Let ϕ ( x ) {\displaystyle \phi (x)} ϕ(x) be a property provable about objects x {\displaystyle x} x of type T. Then ϕ ( y ) {\displaystyle \phi (y)} ϕ(y) should be true for objects y {\displaystyle y} y of type S S S where S S S is a subtype of T T T.
P ( τ 1 ) a n d τ 2 < : τ 1 ⟹ P ( τ 2 ) P(\tau _1)\ and\ \tau _2 <: \tau _1 \Longrightarrow P(\tau _2) P(τ1) and τ2<:τ1⟹P(τ2)
而对于ruby来讲,约束只有method,ruby定义的subclass显然满足这个约束。
dynamic dispatch
Dan对介绍了许多dynamic dispatch相关的内容,最明显的就是C++中的虚函数,《深度探索C++对象模型》对此有详细的介绍,但是内容较老。基本是把type info carry到runtime的时候,然后根据type info来决定真正的调用的函数是什么的,实现方式多种多样,最普遍的还是vtable。
Dynamic dispatch will always incur an overhead so some languages offer static dispatch for particular methods.
注:swift的开发人员大部分都是clang转过去的,所以swift关于这方面的设计和C++几乎一模一样,可以参考GOTO 2016 • Exploring Swift Memory Layout • Mike Ash
后面Dan会使用Racket实现一个简单的dynamic dispatch,简单有趣明了。《PLP:10.4.3 Member Lookup》简单总结了member lookup的实现方式。
注:其它一些关于C++ vtable有趣的工作,可以参见《Protecting C++ Dynamic Dispatch Through VTable Interleaving》
dynamic dispatch vs closures
closures本质上和class很相似,encapsulate a method with context for later execution。但closure只是单次的简单的context的记录,并不会记录与其相关的类型信息,或者与其绑定的method信息。
如何使用racket模拟dynamic dispatch
知道了dynamic dispatch是什么之后就会知道如何实现它了,重点还是要在object上做文章,要在其上附着一些额外的信息以便能够在runtime执行一些其他的操作。
读书的重点在于思考和理解,否则无疑是向脑子里倾倒垃圾