前言
以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定
引入
源代码在机器层面,是以指令存在的.指令包含了指令码和操作数.本书第7章的内容比较重要,但除了几个有用的gcc指令之外和程序员关系没那么大---他主要是由设计编译器的工程师完成的.链接可以看作是:"将源代码编译成机器代码"这个需求的实现.本章内容和学习一个api函数一样"无趣"----你需要记住他的一些指令应用,但又不知道是怎么来的.所以深入建议深入学习本章最好有编译原理方面的知识储备,否则了解即可.
前面有个推导:在机器层面都是由地址来表示数据.这里做一个简单描述:
1>源代码在机器层面以一串指令(如一个函数被编译成数条汇编指令)存在.
2>指令和操作数(对应函数中的变量)都是二进制数表示的数据.每个数据包括了地址和数值两项.两个数据之间可以用指针"连接"起来(也可以设置多重指针).由指向某个地址的指针间接获得该地址里的数值.当指向某个地址时,被指向的地址开始的连续数据可以被访问.
3>指针既能指向某片连续区域(函数),也能指向单个地址(变量).他的便捷性使其成为数据访问的首选.
链接
链接的作用是将编程模块化,随时可以写函数加入到软件中并更新.
有了上面的铺垫,链接可以用简单的几句话来概括:你是谁?你在哪里?
链接核心内容:符号解析和重定位.符号对应高级语言中的全局函数和全局变量.
符号解析对应"你是谁"?将某个符号放在内存中,程序中重复调用相同的函数,或者使用相同的变量,知道他们是指向同一个内存中的数据.
重定位对应"你在哪里?"执行指令的时候,遇见符号,定位到内存中他所在的位置.
指令的定位:
符号需要重定位找到正确位置,指令似乎没提重定位.笔者理解是加载编译器后,指令集被固定在内存中的某个位置.程序计数器PC是指向指令序列首元素的指针.指令序列的每个元素放着指令的地址.当执行完一条后,PC指向下一条指令.
思考
从数据的表示,到指针的机制,再到"数据都以地址(指针)访问",这一整套内容,可以看作是一个系统的设计.所以可以从中抽象一些思考的模式,也就是说学习设计者的思想.
对编译的理解
本章内容围绕着编译展开,会的人可以自己开发个编译系统,或者对现有编译器做修改以适应自定义需要.在整个软件开发(研发)环境中,是很重要的.不会也不用担心,有现成的工具集可用.
笔者对编译的理解是:封装机器指令,写出将源代码转换成机器代码的工具集,并向使用者提供接口指令(类似gcc),---这就是编译器的开发需求.
如果只是使用本章的内容,背几条gcc指令就可以了,还是比较简单的,或者用的时候再查.
小结
简单总结了链接,当是10月24日这个"节日"冒个泡