前言
语法糖
指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响(即没有这个语法,该语言也能实现类似的功能),但是更方便程序员使用。
// 方式1
for (i = 0; i < 10; i++)
{
//P
}
// 方式2
i = 0;
while (i < 10)
{
//P
i++;
}
此处,for关键字便可以视为while关键字提供的语法糖。
xx
假定一个系统不停地执行如下流程
接收数据()
处理数据()
返回结果()
后来,我想在处理数据前,对数据做一些“预处理”,于是:
接收数据()
预处理()
处理数据()
返回结果()
后来我发现,预处理流程很复杂,并且千变万化,于是:
// 系统流程
接收数据()
pre处理数据(){
从函数链表中取出函数并执行
}
处理数据()
返回结果()
// 自己的业务代码
函数链表
注册数据函数函数(处理函数){
函数链表.add(处理函数)
}
我们习惯于向函数传递一个参数,通过参数来改变函数的行为。其实,向函数传递一个函数也是一样的。
其实框架(linux也可以认为是一个框架)功能的扩充就是这样一个过程。
操作系统
操作系统的两个基本功能:
-
管理外设
进程无法直接操作外设
-
管理多道程序
多道程序的引入,是现代操作系统复杂性的根源。因为是多道任务同时执行,系统必须实现对多道任务的隔离与共享。
read文件,线程被阻塞:是因为执行read系统调用,引发了缺页中断,进而导致任务的重新调度执行。
编程语言的三大趋势(至2015年)
-
声明式
- 类似于SQL,只描述想做什么,如何做由编译器负责。
- 现有的代码,实在是很难一眼就看出来它们要做什么。
go或python之类的语言,已经体现了这种倾向,在声明式方面迈出了几步,比如
a[0:2]
就可以截取数组,这在java或c里,需要一个for语言块才能完成。 -
动态语言(类型是动态的)
- 不用为变量声明类型
- 一种在执行期间才去发现数据类型的语言, 动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化(说实话,这句我看不懂)
动态语言,看似执行的是源代码文件,实际执行的还是python或shell,源代码文件只是告诉python和shell该做什么事情。与此对比,静态语言往往会被编译成可执行文件,可执行文件直接通过机器指令完成工作。(这貌似是解释性vs编译型)
-
并发
多核革命的一个有趣之处在于,它对于并发的思维方式会有所改变。传统的并发思维是在单个CPU上执行多个逻辑任务,使用旧有的分时方式、时间片模型来执行多个任务。但是,你想一下便会发现如今的并发情况正好相反,现在是要将一个逻辑上的任务放在多个CPU上执行。这改变了我们编写程序的方式,这意味着对于语言或是API来说,提供自动分解任务的功能,把它拆分成多个小任务后独立的执行,而传统的编程语言中并不关注这点。
以前是通过增加线程来提供并行性,现在提倡将一个大任务分割到多个cpu上,来缩短任务的执行时间。