参考文章:
索引文:
- 重识 Objective-C Runtime - Smalltalk 与 C 的融合 · sunnyxx的技术博客
- 译 被遗忘的面向对象编程史(软件编写)(第十六部分) - 掘金
(这篇文章对原文的翻译,我认为存在一些错误,导致理解偏差, 读书笔记归纳在此
参考笔记: 被遗忘的面向对象编程史 )Alan Kay 对
面向对象的看法(“今天的面向对象走歪了”):
- Alan Key 观点总结 The Deep Insights of Alan Kay - mythz blog 翻译
- Alan Key 的邮件 Dr. Alan Kay on the Meaning of “Object-Oriented Programming”
- Alan Kay notes - Rickard’s personal homepage
编程语言历史:
一些有趣,值得记录, 但没能读完的:
* Smalltalk Overview
我在接触 runtime 查找文章时, 很频繁的见到这几个关键词:
- 运行时
- 动态性
- 消息机制
并且大部分文章会在一开始直接放出数据结构, 然后开始讲解其中每个字段含义及作用.
遗憾的是, 这个学习过程对我来说异常困难, 我几乎以背书的方式, 背完了这些结构体, 结构体里面字段的作用.
一个遇到陌生概念, 尝试理解, 又在理解中遇到更多陌生概念… 然后不断反复的过程
即使这个过程结束, 我仍无法将记忆过的内容建立成系统化的知识体系, 也无法灵活应用
而后才意识到这么 “学” 没有意义, 我需要抛开这些直接而看起来有用的知识点
从源头开始, 作为解决根源问题设计者思路接触问题, 再从解决问题的思考中得出这些概念
而不是背下一个陌生概念, 而后又在这个陌生概念中引申出更多陌生的概念.
一. 很重要的序言 — 我为什么开始研究起了 OC 的起源
所以第一件事: 为什么会有 Runtime
再然后, : 为什么设计成这样
起源
先放个总结来的定义:
Runtime 是使用 C, C++, 汇编, 来实现一门面向对象语言(既OC) 的一套代码
其等同于一部分的 OC 实现 (这之外还有预编译等)
所以在考究 runtime 在解决什么前, 先深入一步, OC 是在做什么:
OC 起源于, 其作者, 希望有一门语言, 既能使用主流且高效的 C , 又能具备 SmallTalk 的面向对象特性
所以做出了一个 C 版的 SmallTalk (SmallTalk 并不如 C 那么好写且运行低效)
那么 SmallTalk 是什么?
SmallTalk 是由 Alan Key 这个
面向对象概念的提出者, 小组推出的世界第二门面向对象语言
先看这样一个背景:
~1940 : 当时的那个年代, 先出现了机器码(1940 前)与汇编(1940),
1950~1960 : 后出现现代化高级语言,FORTRAN, COBOL 等, (1950~1960)
1967-1978 : 再后来才出现一系列现在主要使用的语言范式, Simula, C, SmallTalk
1983 : C ++
1984: : Objective-C
在 SmallTalk 出现的那个年代, 程序设计领域面临一种危机:
随着软硬件环境逐渐复杂, 软件如何解决复杂性, 并能得到良好的维护
我们可以想象一个场景: 在没有对象概念, 没有封装, 只有数据结构, 命令式, 函数式程序的情况下.
一个复杂的系统, 各模块互相共享的状态(没有封装), 随意修改的数据. 其存在错综复杂的耦合问题及维护的复杂性.
(一个例子: ARPA 程序员对在程序编写之前选择数据模型的需求感到沮丧)
Alan Key 具备生物学和数学背景, 为了脱离数据, 他将程序类比为 细胞和函数式
以解决 共享的可变状态 和 共享数据 引起的耦合问题
其中有三个重要的点:
I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages
我把对象想象成生物细胞或者和网络上的单个计算机,它们之间只能通过消息进行通讯。OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things
OOP 对我来说意味着消息传递,对状态进程的本地保留保护和隐藏,以及对所有事物的动态绑定。My math background made me realize that each object could have several algebras associated with it, and there could be families of these, and that these would be very very useful.
我的数学背景使我意识到每个对象可以有多个代数与之关联,这些代数关系可以构成家族,而这些概念会非常非常有用。Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects.
直到真正的软件工程实现之前,下一个最佳实践就是在各个方面都采用具备极致端迟绑定的动态系统进行开发。Late binding allows ideas learned late in project development to be reformulated into the project with exponentially less effort than traditional early binding systems (C, C++, Java, etc.)
延迟绑定使得在项目开发过程后期中产生的想法能被植入项目,和传统的早期绑定系统(如C, C++, JAVA等)相比,它所需的工作量是成指数级减少的。
转换过来就是:
- 封装: 抽象高层的状态, 像细胞一样封装对象, 对象隐藏自己信息(状态), 独立运行
- 消息传递: 对象之间的通信通过消息传递进行
- 延迟绑定: 所有事物动态绑定, 并且尽可能延迟绑定过程
结论
那么我们回过头来:
Rumtime 要解决什么问题 ?
Runtime 是使用 C, C++, 汇编. 实现 OC 的工具. 这门工具的目的在于实现 OC
OC 需要具备什么:
OC 借鉴至 SmallTalk, 期望具备 SmallTalk 的面向对象特性
SmallTalk 的面向对象特性是要解决什么问题: (ps.以下的理解可能有些狭隘, 在于我对历史的背景了解不足)
解决在没有面向对象的环境下, 可变数据数据共享等带来的耦合问题
而为了解决这样的问题, SmallTalk 设计了什么样的机制:
- 封装: 抽象事物, 并将状态隐藏在内容
- 消息传递: 事物之间只通过消息传递进行通信
- 延迟绑定: 所以事物具备动态性, 并且尽可能延迟绑定
所以 Runtime 最终是什么:
Runtime 是一个用 C, C++ , 汇编实现具备 封装, 消息传递, 延迟绑定三种特性的 OC 语言的代码库