程序设计语言——实践之路笔记

来自Dennis的知识库
跳转到: 导航搜索

目录

声明

  • 本Wiki上的任何文字信息均在GNU自由文档许可证1.3或更高版本下发布,如果用于任何商业用途都需经本人同意。任何转载都请注明出处。
  • 本Wiki上的内容来自本人的学习笔记,来源可能包括原创、书籍、网页、链接等,如果侵犯了您的知识产权,请与本人联系,我将及时删除。
  • 我的联系方式 killme2008@gmail.com

第一章

语言设计的艺术

  • 为什么会有这么多语言?
    • 计算机科学的发展进步,编程语言设计本身也在发展,从机器语言->汇编->结构化->面向对象/逻辑/函数式/
    • 特殊用途,DSL的需求
    • 个人偏爱
  • 为什么有些语言比其他语言更成功?
    • 表达能力,本质上也是抽象能力
    • 易于上手,学习曲线很重要
    • 易于实现,对于编译器的实现者而言很重要
    • 有很好的编译器
    • 经济、支持者和惯性,cobol和Ada语言,Java本身也是大公司在后面支持。
  • 考察一门语言好或者不好,要从语言的使用者和实现者两个角度去考察。

程序设计语言的谱系

按照计算模型大体分为两类:

  • 说明式
    • 函数式,Lisp/Scheme,ML,Haskell,还有Erlang,包括我热爱的Clojure
    • 数据流 Id,Val
    • 逻辑式的,基于约束 神奇的Prolog,VisiCalc
  • 命令式
    • 冯.诺伊曼 Fortran,Pascall,Basic,C
    • 面向对象 C++,Smalltalk,Eiffel,Java...

为什么研究程序设计语言

  • 理解困难特性
  • 从不同可能性中选择适当的方式去表达事物,其实就是我们通常说的最佳实践
  • 更好地使用排错系统、汇编器、连接器等工具
  • 在缺乏某些有用特征的语言里模拟这些特征。

编译和解释

  • 编译: 源程序 -> 编译器 -> 目标程序 输入 -> 目标程序 ->输出
  • 解释: 源程序/输入 -> 解释器 -> 输出
  • 编译通常有性能优势,而解释更灵活,有更好的报错信息,更强的动态性(延迟约束)。
  • 预处理器和编译器: 编译器会去试图理解源码(分析语法语义),而预处理器并不这样做,它只是基于简单的模式匹配做文本性的处理。
  • 混合型语言,编译和解释混合,中间代码 + JIT编译

编译概览

编译器阶段.png

  • 编译可能分为几遍进行(一般更喜欢称为趟吧),一遍成为一个编译遍,每一遍做编译的不同阶段。
  • 编译器通常分为前端和后端:
    • 前端: 扫描、语法分析、语义分析
    • 后端: 中间代码生成、代码优化和目标代码生成(生成后可再次优化)
  • 符号表,维护标识符类型信息,内部结构以及作用域等信息
  • 语义检查:
    • 动态语义:运行时检查,如数组越界、类型转换、非空指针。
    • 静态语义:编译时检查,如标识符使用前有定义,case语句是否合法,函数是否有返回值等。
个人工具
名字空间

变换
操作
导航
工具箱