Chapter1:基础

整本书的核心:语言的设计与实现

我们所看到的设计是显示的,语法定义的,

而实现是隐式的,决定了编译或运行时的行为。

了解设计的目的,可以推测实现的细节,也可以自己实现设计。

学习具体的实现,更充分的达到高效设计。

行文的逻辑基本就是,对于一种特定设计

1.从程序员的使用者角度,解释该设计的必要性。

简化代码,清晰概念。

2.实现的细节,包括编译与运行中的推断与检查等,也有可能是个语法糖,简单的实现换来优美的设计。

设计的实现

3.设计的演变,实现的转变影响设计的优劣

从历史的角度说明设计的合理性与必然结果

4.对比从语言的剩余部分来实现设计(自举),指出特性上的差异

或5.模拟一种语言没有的设计

如果设计缺失,带来的不便与混乱,从反例说明

6.不同的语言的实现方案

对比各种实现方案带来的设计上的特性差异

charpter1.0引言

1.机器语言通过指令集控制处理器,机器语言的形式为进制数

2.汇编语言是指令集的助记形式,用的是英文的缩写

汇编语言与机器语言保持一一对应,所以本质上还是用指令集思考问题,是机器相关的。

由汇编器完成两种语言的翻译

机器相关的汇编语言+很多种不同的指令集=同一想法在不同机器上复现很困难

最后,高级语言登场,实现机器无关性

高级语言的单条语句与指令集中的单条语句不再对应

由编译器了解程序正文的语义,翻译成机器语言(或汇编语言)

硬件的复杂化(不容易提升手写汇编语言的效率)+编译技术进步(生成越来越高效的汇编语言)=高级语言被人接受

这一历史体现了“边际成本”的有趣现象,一种设计的优势与劣势是相对的,人们追求优雅一致的设计,但又不想放弃简单高效的实现,直至原有设计的效率提升达到瓶颈,并且效率的提升带来了难以控制的复杂性。

charpter1.2程序设计语言的分类

说明式

  函数式:

  数据流:

命令式

  冯 诺伊曼:C

  脚本:python

  面向对象:Java

函数式:函数递归,目标函数递归为子问题

数据流:数据在功能节点间流动 tensorflow?

逻辑式:满足逻辑的值,不断筛选和加工 SQL

冯 诺伊曼:计算值(表达式,函数返回值),在变量上存储值,修改变量。

脚本:为特定目标快速建立原型

面向对象:对象维护状态(域),修改状态(方法)

charpter1.3:设计一种语言的目的

表达能力:简单高效地编写程序

实现效率:了解实现的细节对效率的影响

在语言中模拟缺乏的特性

charpter1.4编译与解释

编译器控制编译过程,然后交由目标程序控制自己的执行过程。

解释器在执行过程中控制程序的执行。

编译器与解释器的差别更在于目的:运行前的检查与推断,运行中的检查与推断。这两个动机都是有价值的,所以会看到两者的互补。

编译器尝试在运行前理解源程序,并维护程序的部分信息,供执行时使用,从而提升效率。并且生成代码进行运行时的动态检查。

书中经常提到静态与动态,其中静态是指由程序正文提供的,在编译时可以推断的信息,动态指的是运行时的,或者难以预测的信息。

程序经过编译后,依然存在不确定性,可能是对输入的依赖,也可能是由于函数调用等控制结构带来的复杂性。

编译器的特性:彻底的分析与非平凡的变换。

数据库系统的查询语言也是编译器,SQL语言翻译成文本操作。

IDE:汇编器,调试器,预处理器,连接器,编译器,解释器,编辑器

检查词法语法,维护语法树

1.6编译概览

一个编译遍

代码形态    编译的子步骤

字符流     

        扫描器(词法分析)

单词流     

        语法分析器

语法分析树

        语义分析

抽象语法树

        编译优化(机器无关)

中间形式

        目标代码生成

目标语言(汇编)

        编译优化(机器相关)

目标语言

扫描器(词法分析):检查单个单词的正确性

语法分析树:结构依赖于语法,上下文无关文法

语义分析器:标识符与表达式的类型,相容性

构造符号表,维护各个标识符的类型,内部结构,作用域

检查标识符的定义,上下文,子程序参数签名与调用,返回值

语义动作例程

依然不可检查的:动态语义

变量使用前初始化

指针指向有效对象

下标越界

算术溢出

具体语法树:序列的合法性

抽象语法树:删去不必要节点,增加符号表

代码生成器:保存符号表,包含在目标代码非执行部分

代码改进:在中间代码生成后,在目标代码生成后

rest:

语言的设计目标:清晰,紧凑,易于维护,表达能力强,方便优雅,概念清晰,实现效率

编译后的链接步骤,可以看作是通过库例程扩充硬件指令集,可也以人为编译器就像虚拟机那样生成代码,而虚拟机中包含了硬件和库的功能。

预处理器:执行简单的文本模式匹配。没有了解程序的正确性,语义的分析。

自举:简单的实现到复杂的实现,逐步扩充语言

#!待整理

上一篇:Linux本地yum源配置以及使用yum源安装gcc编译环境


下一篇:FS Shell命令手册