对于一个程序,计算机语言是低级语言,而人利用高级语言与计算机交互,语言不通,则交互就会出现障碍,为了解决这种障碍,我们就需要把人的高级语言翻译成机器语言,在一开始接触计算机时,我们就知道计算机只能理解由0、1序列构成的语言,因此就有了以下语言的翻译过程,我们也称编译运行原理。
用高级语言或者汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行;源程序可以说是一个文件,我们须得把该文件转成二进制文件,再加载到内存上去执行。
1、预编译阶段
2、编译阶段
编译的主要目的是把源程序翻译为二进制文件,其过程分为6个阶段:
词法分析:对源程序从前往后依次扫描,识别一个个“单词”符号,“单词符号”是程序设计语言的基本语法单位(关键字、标识符、常数、运算符、分隔符等)
语法分析:根据语言的语法规则将单词符号序列分解成各类语法单位,通过语法分析确定输入串是否构成一个语法正确的程序
语义分析:主要分析程序中各种语法结构的语义信息(类型分析和检查错误)
中间代码生成:中间代码设计原则是容易生成及容易被翻译成目标代码
代码优化:优化过程可以在中间代码生成阶段也可以是目标代码生成阶段,依据的原则是程序的等价变换规则
目标代码生成:把中间代码换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码
符号表的作用:记录源程序各个符号的必要信息,以辅助语义的正确性检查和代码的生成
3、汇编阶段
进行弱符号和符号表中外部符号处理, 指令段是虚假地址和偏移
4、链接阶段
5、运行阶段
在80386以前是实模式,80386以后是保护模式
a.建立虚拟地址空间和物理内存的映射(创建映射结构体PCB),创建页目录和页表
b.加载指令和数据
c.入口地址写入下一行指令寄存器
实模式由于A映射到内存上后,可以通过跳转到达B,修改B的数据,所以不安全