编程语言

语言学习

编程语言的历史

从纸条打孔到高级语言

各种各样编程语言出现的原因:懒惰 急躁 傲慢

语法

语法是语言设计者制定的规则,怎么方便就怎么来

基于栈:

1 2 + 3 *

基于树:

(+ 1 2)

设计不存在任何解析矛盾的语法体系是十分困难的。随后要再融入新的语法时不与既有的语法发生冲突,这个尤其困难

流程控制

else语句的:goto 的危害

while语句的:让反复执行的if更加简洁

for语句:让数值建增的while语句更简洁

for-wach语句:让for遍历更简洁

函数

作用:缩小关注点 代码复用

返回:调用栈

递归:递归完成的操作都可以转换为迭代操作

错误处理

程序所依赖的外部凡是可能出错的最后总会出错

异常的使用:

名字与作用域

为什么要名字?可读性

为什么要作用域?管理名字

作用域的演变:

$i
local $i
my $x

类型

类型是数据的元数据

cvtsi2ssq %rax, %xmm1

类型的扩展:

容器与字符串

并发处理

交替运行:

对象与类

面向对象在不同语言下不一样

模型的建立方法:

闭包

函数对象:

从函数对象中能够对外部变量进行访问(引用、更新),是闭包的构成要件之一

从属于外部作用域中的局部变量,被函数对象给“封闭”在里面了

继承与代码复用

继承的实现策略:

多重继承带来命名冲突的解决:

DSL

利用为特定领域(Domain)所专门设计的词汇和语法,简化程序设计过程,提高生产效率的技术,同时也让非编程领域专家的人直接描述逻辑成为可能

库设计就是语言设计(Library design is language design)

// 用流畅接口在Java中实现DSL
private void makeOrder(Customer
  customer) {
    customer.newOrder()
      .with(6, "TAL")
      .with(5, "HPK").skippable()
      .with(3, "LGV")
      .priorityRush();
}

DSL构成要素

内存管理

GC大一统理论:目前的GC收集方法只有根扫描和引用计数,两者相互对立,对一方有用的技术,对另一方跟定也有用。如根扫描的写屏障机制,以及引用计数的堆局部变量进行分代