02大厦基石:无生有,有生万物
当我们设计或分析一个零部件时,我们会关心哪些问题?
第一个问题,是需求。这个零部件的作用是什么?它能被用来做哪些事情?(某种意义上来说更重要的是)它不会被用来做哪些事情?
第二个问题,是规格。这个零部件接口是什么样的?它如何与其他零件连接在一起的?
为了实现"解决一切可以用计算,来解决的问题"这个目标,冯诺依曼引入了三类基础零部件:中央处理器;存储;输入输出设备。
架构思维上我们学习到什么?
架构的第一步是需求分析。从需求分析角度来说,关键要抓住需求的稳定点和变化点。需求的稳定点,往往是系统的核心价值点;而需求的变化点,则往往需要相应去做开放性设计。
对于"电脑”这个产品而言,需求的稳定点是电脑的"计算"能力。需求的变化点,一是用户"计算"需求的多样性,二是用户交互方式的多样性。
03汇编:编程语言的诞生
程序称得上是计算机的灵魂。指令序列的可能性是无穷的,程序的可能性就是无穷的。今天计算机创造的世界如此多姿多彩,正是得益于程序无穷的可能性。
为了解决编程效率的问题,汇编语言(和解释它的编译器)诞生了。汇编语言的编译器将汇编语言写的程序编译成为CPU指令序列,并将其保存到外置的存储设备(比如硬盘)上。
在表达能力上,编语言主要做了如下效率优化。
第一,用文本符号表达机器指令。
第二,用文本符号(symbol)表达要操作的内存地址,并支持内存地址的自动分配。
第三,用文本符号(symbol)表达要调用的函数(function,也叫"过程-procedure")地址。
第四,用文本符号(symbol)表达要跳转的目标地址。
总结来说,汇编从指令能力上来说,和机器指令并无二致,它只不过把人们从物理硬件地址中解脱出来,以便专注于程序逻辑的表达。
04编程语言的进化
软件是活的书籍,是我们人类知识传承能力的一次伟大进化,有两方面原因:
其一,表达方式的多样性。
其二,对技术的现场还原。
编程范式的进化
其一是过程式。过程式就是以一条条命令的方式,让计算机按我们的意愿来执行。过程式编程中最核心的两个概念是结构体(自定义的类型)和过程(也叫函数)。
其二是函数式。函数式本质上是过程式编程的一种约束,它最核心的主张就是变量不可变,函数尽可能没有副作用。
其三是面向对象。面向对象在过程式的基础上,引入了对象(类)和对象方法(类成员函数)它主张尽可能把方法(其实就是过程)归纳到合适的对象(类)上,不主张全局函数(过程)。面向对象语言的代表是Java,C#、C++、Go等等。
面向对象有两个显著优点:
其一是清晰的使用界面,某种类型的对象有哪些方法一目了然,而不像过程式编程,数据结构和过程的关系是非常松散的。
其二是信息的封装。面向对象不主张绕过对象的使用接口侵入到对象的内部实现细节。因为这样做破坏了信息的封装,降低了类的可复用性,有一天对象的内部实现方式改变了,依赖该对象的相关代码也需要跟着调整。
面向对象还有一个至关重要的概念是接口,可以实现多态。
另外,还会引入一个叫继承的概念。
什么是面向连接的语言?在此之前,你可能并没有听过这样的编程范式,这应该算Go自己发明出来的范式名称。在我看来,所谓面向连接就是朴素的组合思想。研究连接,就是研究人与人如何组合,研究代码与代码之间怎么组合。
其他方面的进化
工程化能力:
1)包(package),即代码的发布单元。
2)版本(version),即包的依赖管理。
3)文档生成(doc),单元测试(test)。
语言的执的行为:
1)编译的目标文件为可执行程序。
2)生成跨平台的虚拟机字节码。
3)直接解释执行。
网络图片
编程语言选择:开发效率和后期维护。










网友评论