济南大型网站建设,建一个商城网站需要多少钱,广州外贸网站信息,上海网站建设哪个好编译的过程 #xff1a; 1. 词法分析#xff0c;程序被扫描成#xff1a;关键字#xff0c;标识符#xff0c;字面量和特殊符号这些记号。 2. 语法分析#xff0c;对记号进行语法分析产生语法树。#xff08;代码最终由表达式组合#xff09; 3. 语义分析#xff0c;经…编译的过程 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