“程序设计语言——实践之路笔记”的版本间的差异
来自Dennis的知识库
Dennis zhuang(讨论 | 贡献) (→编译概览) |
Dennis zhuang(讨论 | 贡献) |
||
第55行: | 第55行: | ||
** 后端: 中间代码生成、代码优化和目标代码生成(生成后可再次优化) | ** 后端: 中间代码生成、代码优化和目标代码生成(生成后可再次优化) | ||
* 符号表,维护标识符类型信息,内部结构以及作用域等信息 | * 符号表,维护标识符类型信息,内部结构以及作用域等信息 | ||
+ | * 语义检查: | ||
+ | **动态语义:运行时检查,如数组越界、类型转换、非空指针。 | ||
+ | **静态语义:编译时检查,如标识符使用前有定义,case语句是否合法,函数是否有返回值等。 |
2012年12月5日 (三) 16:33的版本
目录 |
第一章
语言设计的艺术
- 为什么会有这么多语言?
- 计算机科学的发展进步,编程语言设计本身也在发展,从机器语言->汇编->结构化->面向对象/逻辑/函数式/
- 特殊用途,DSL的需求
- 个人偏爱
- 为什么有些语言比其他语言更成功?
- 表达能力,本质上也是抽象能力
- 易于上手,学习曲线很重要
- 易于实现,对于编译器的实现者而言很重要
- 有很好的编译器
- 经济、支持者和惯性,cobol和Ada语言,Java本身也是大公司在后面支持。
- 考察一门语言好或者不好,要从语言的使用者和实现者两个角度去考察。
程序设计语言的谱系
按照计算模型大体分为两类:
- 说明式
- 函数式,Lisp/Scheme,ML,Haskell,还有Erlang,包括我热爱的Clojure
- 数据流 Id,Val
- 逻辑式的,基于约束 神奇的Prolog,VisiCalc
- 命令式
- 冯.诺伊曼 Fortran,Pascall,Basic,C
- 面向对象 C++,Smalltalk,Eiffel,Java...
为什么研究程序设计语言
- 理解困难特性
- 从不同可能性中选择适当的方式去表达事物,其实就是我们通常说的最佳实践。
- 更好地使用排错系统、汇编器、连接器等工具
- 在缺乏某些有用特征的语言里模拟这些特征。
编译和解释
- 编译: 源程序 -> 编译器 -> 目标程序 输入 -> 目标程序 ->输出
- 解释: 源程序/输入 -> 解释器 -> 输出
- 编译通常有性能优势,而解释更灵活,有更好的报错信息,更强的动态性(延迟约束)。
- 预处理器和编译器: 编译器会去试图理解源码(分析语法语义),而预处理器并不这样做,它只是基于简单的模式匹配做文本性的处理。
- 混合型语言,编译和解释混合,中间代码 + JIT编译
编译概览
- 编译可能分为几遍进行(一般更喜欢称为趟吧),一遍成为一个编译遍,每一遍做编译的不同阶段。
- 编译器通常分为前端和后端:
- 前端: 扫描、语法分析、语义分析
- 后端: 中间代码生成、代码优化和目标代码生成(生成后可再次优化)
- 符号表,维护标识符类型信息,内部结构以及作用域等信息
- 语义检查:
- 动态语义:运行时检查,如数组越界、类型转换、非空指针。
- 静态语义:编译时检查,如标识符使用前有定义,case语句是否合法,函数是否有返回值等。