我非常喜欢这章开头的一句话,坚持写笔记的动力也受到这段话的影响:
毫无疑问,学习一门编程语言的基础知识不如编写程序有趣。但是,不知道语言的基础会使你在编写程序的时候缺少乐趣。
2.1 环境
翻译环境(translation environment):应该写完代码时的编译环境,编译成可执行的机器指令。
执行环境(execution environment):就是编译完的程序运行的环境。
独立环境(freestanding environment):嵌入式系统,没有操作系统的环境。
2.2.1 翻译
翻译阶段分成几个步骤:一个或多个源文件编译成目标代码(object code)。然后目标文件由链接器(linker)捆绑在一起,形成一个单一而完成的可执行程序。如果源码中我们用到了一些别的函数,那么在链接的过程中,链接器也会引入标准C函数库或者我们自己写的库文件中的程序。
在编译的时候也有几个过程:
预处理器(preprocessor)处理一下源文件,把需要替换的内容替换下(#define),把需要引入的内容引入下(#include)。
解析(parse)判断下语句的意思,期间会产生大多数错误和警告。
如果没什么问题就会产生目标代码。目标代码时机器指令的初步形式,用于实现程序的的语句。
如果编译的时候加入优化指令,优化器(optimizer)会对目标代码进一步处理优化,这需要时间所以,程序在生成正式产品之前不进行这个过程(release和debug版本之前的区别)。
2.1.2 执行
程序的执行过程也分为几步:
- 将程序载入到内存
- 操作系统接管该程序
- 调用main入口
- 终止(包括正常返回和异常中断)
运行的程序肯能会使用两种存储空间:
- 运行时堆栈(stack): 用于存储函数的局部变量和返回地址。
- 静态(static)内存:存储于静态内存中的变量在程序的整个执行过程中一直保留。
2.2 词法规则
2.2.1 字符
介绍了以前因为字符集条件不满足的时候而使用的三字母词(trigrph),就是几个字符的序列,合起来表示另一个字符。具体使用的时候再说吧,有个印象即可。
转义字符就是反斜杠\加字符的组合(\n 换行 \r 回车 \t TAB \v 垂直制表符...... ),来表示一些特殊的意思。
2.2.2 注释
写好注释!
2.2.3 自由形式的源代码(代码风格)
能够写超级难懂的源码!
2.2.3 标识符
由大小写字母、数字和下划线组成,长度没限制,但一般小于31。关键字不能当作标识符哦~
2.3 总结
强调下注释和代码风格,这些很重要。变量名和函数名的这些设计也是积累的过程。