编译相关

编译的过程 :

1. 词法分析,程序被扫描成:关键字,标识符,字面量和特殊符号这些记号。

2. 语法分析,对记号进行语法分析产生语法树。(代码最终由表达式组合)

3. 语义分析,经过类型匹配和转换,把语法树上的表达式都标识上类型。

4. 运行时无关的中间码的生成,此时的语法树可以转换成三址码,并进行初步优化。

5. 生成目标代码,但此时变量的地址并未确定。

 

目标文件的内容: 段里放的都是真正的东西,比如指令,变量值。至于名称都在符号表里,所以.bss段没有内容。 符号表里列举出了所有的符号,以及那些符号对应的值或指令在哪。 在链接中用到的符号主要是函数名和变量名,而且是经过修饰的(C和C++的修饰不一样,注意extern "C")。 需要重定位的地方会被记录到重定位段里。

 

链接的背景: 程序经常改变,于是指令和变量的地址就会跟着改变,导致跳转指令也要跟着调整。 于是人们用符号标识位置,并在每次汇编的时候都重新计算符号的地址,然后统一填入。 独立编译模块变得流行,需要解决变量和函数的跨模块访问问题。

 

链接的过程:

1. 扫描所有的输入目标文件,合并相同段,分配地址空间,收集全局符号表。这一步后,所有符号都有了地址。

2. 读取重定位信息,调整代码地址。

 

常常在我脑子中转的一个问题是:context switch是哪个程序?当系统中运行一个shell,然后由shell调用hello,那个执行context switch的system call是算哪个程序?答案是:那个system call对应的那一串执行context switch的指令不是程序。程序是在操作系统之上的概念,当指令落入操作系统手中,就不是程序的概念了。如果要考虑context switch层面上的问题,计算机工作过程就不应该看成是进程切换的过程,而是单一的一维指令执行的过程,在那个层面上,没有进程的概念,只有指令周期和有限状态机的概念。

 

理解这个过程值得注意的点有:context switch对于进程来说是透明的,fork()函数也只是一个函数而已,它并不负责那个新进程是怎么创建的,它只管执行一下这条指令然后收结果,在它看来结果是立即收到的,并没有等“很多有关创建一个新进程的指令执行”再收到结果,因为那些都是它本身进程外的事情。收到结果,如果结果是0表示那个“任务”成功完成了,如果是其它的,表示那个“任务”没有完成,至于那个“任务”是什么,它并不在乎。

 

于是,我需要重新思考什么是操作系统,它给应用程序提供了怎么样一个平台,它提供的系统调用接口是怎么样的,我需要了解清楚操作系统的全貌,才能在编程的工作中游刃有余。要知道,当计算正在执行一条指令时,这条指令要么来自应用程序,要么来自操作系统,我需要知道,哪些是操作系统份内的事情,哪些是应用程序份内的事情。

 

 

 

 

转载于:https://www.cnblogs.com/caicaiandtutu/archive/2012/07/08/2581500.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值