读书笔记-许式伟架构课读后感-1

1.程序员是一个门槛极低的职业

2.cpu指令分为三类并且是及其有限的:

计算类,也就是支持我们大家都熟知的各类数学运算,如加减乘除、sin/cos 等等。

I/O 类,(从存储读写数据)从输入输出设备读数据、写数据。

指令跳转类,在满足特定条件下跳转到新的当前程序执行位置。

之所以这个有限的指令集能够组合无限多的软件,是因为,指令序列是无穷的,并且指令操作的数据也是各种不同,这就意味着电脑能做的事也多种。

3.编程语言+编译器=机器指令

os协调多个运行中的软件,首先要解决的是软件治理的问题,其次是编程接口的问题。

操作系统和编程语言,现在是我们开发一个应用程序所依赖的基础架构。

基础架构解决的是与业务无关的通用问题。并且以独立软件存在,所以也称为基础软件。eg:linux mysql nginx php这些都属于基础软件。

这些是应用程序的地基。

4.浏览器消除了客户端的多样性

5.软件架构大厦的基石是冯诺依曼体系结构,初衷是解决一切可以计算的问题

cpu 即中央处理器负责指令的执行,指令序列放在那里,内存,计算机启动后,cpu就从固定的一个存储地址开始执行,电脑的“计算”能力,最终体现为中央处理器的指令集,这是需求相对稳定的部分。用户“计算”需求的多样性,最终是通过在存储中的指令序列实现。计算机加电启动后,中央处理器并不是按自己固有的“计算”过程进行,而是从一个固定的存储地址加载指令序列执行。

6.最初的计算机编程,机器语言,能表达清楚就不错了,更别说需求迭代,那时候软件和硬件工程师的界限非常不明确,因为有电气的操作,为了解决编程效率的问题,出现了汇编语言,汇编语言的编译器把汇编语言的程序编译为cpu指令序列,并保存在硬盘上,一条汇编语言基本对应一条机器指令。

汇编语言导致编程成为一个纯软件的行为,用文本符号表达机器指令。

对cpu来说,函数只有地址没有名字,从编程角度,函数是机器指令的扩展,和机器指令需要用文本符号助记一样,函数名称也需要名称助记。

汇编用文本符号表达要跳转的地址。汇编把人从物理硬件地址中解脱出来,一遍专注于程序逻辑的表达。

最早的输入设备是打孔卡,用打孔卡作为机器指令的输入,用打印机作为输出。

汇编语言的出现早于操作系统,操作系统的核心目标是软件治理,只有在计算机需要管理多个任务的时候,才需要有os.

7.编程语言的进化

编程语言催生出了程序员这个职业,

过程式编程中最核心的两个概念是结构体(自定义的类型)和过程(也叫函数)。通过结构体对数据进行组合,可以构建出任意复杂的自定义数据结构通过过程可以抽象出任意复杂的自定义指令,复用以前的成果,简化意图的表达。

面向对象在过程式的基础上,引入了对象(类)和对象方法(类成员函数),它主张尽可能把方法(其实就是过程)归纳到合适的对象(类)上,不主张全局函数(过程)。面向对象语言的代表是 Java、C#、C++、Go 等等。Java 是纯正的面向对象语言,它反对全局过程。

放弃继承,全面强化组合能力(要了解 Go 语言强大的组合能力。

消息传递是多核背景下流行起来的一种编程思想,其核心主张是:尽可能用消息传递来取代共享内存,从而尽可能避免显式的锁,降低编程负担。

Go 语言不只是提供了语言内建的消息传递机制(channel),同时它的消息传递是类型安全的。这种类型安全的消息传递契约机制,大大降低了犯错的机会。

编程语言的进化还体现在工程化能力的完善上。工程化能力主要体现在如下这些方面。包(package),即代码的发布单元。版本(version),即包的依赖管理。文档生成(doc)。单元测试(test)。

从语言的执行器的行为看,出现了这样三种分类的语言。编译的目标文件为可执行程序。典型代表是 Fortran、C/C++、Go 等。生成跨平台的虚拟机字节码,有独立的执行器(虚拟机)执行字节码 。典型代表为 Java、Erlang 等。直接解释执行。典型代表是 JavaScript。当然现在纯解释执行的语言已经不多。大多数语言也只是看起来直接执行,内部还是会有基于字节码的虚拟机以提升性能。

发布了241 篇原创文章 · 获赞 25 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013755520/article/details/104662154