CPU、内存和I/O控制芯片,这三个部件就是计算机的核心。
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
你是base在哪一层编程?
操作系统的应用程序编程接口(Application Programming Interface,例如Window API)应用程序接口的提供者是运行库。运行库使用操作系统提供的系统调用接口(System call Interface),系统调用接口往往以软件中断(Software Interrupt)的方式提供。操作系统内核层对于硬件层来说是硬件接口的使用者。
预编译(Prepressing)-->编译(Compilation)-->汇编(Assembly)-->链接(Linking)
预编译处理包括:
*将所有的"#define"删除,并且展开所有的宏定义。
*处理所有预编译指令,比如"#if","#ifdef","#elif","#else","#endif"。
*处理"#include"预编译指令,将被包括的文件插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
*添加行号和文件名标识,便于编译器产生调试用的行号信息及用于编译错误或警告的行号显示。
*保留所有的#pragma编译器指令,因为编译器需要使用它们。
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
汇编器是将汇编代码转变成机器可以执行的指令,生成中间目标文件,简称为目标文件。
链接器--模块拼装
目标文件的开头是一个“文件头”,它描述了整个文件的文件属性,包括文件是否可执行、是静态链接还是动态链接及入口地址(如果是可执行文件),目标硬件,目标操作系统等信息,文件头还包括一个段表(Section Table),段表其实是一个描述文件中各个段的数组。段表描述了文件中各个段在文件中的偏移位置及段的属性等。文件头后面就是各个段的内容。
可执行语句都编译成机器代码,保存在.text段;已初始化的全局变量和局部静态变量都保存在.data段;未初始化的全局变量和局部静态变量藏在一个叫.bss的段里。.bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它们缺省值都是0,不需要占用实际空间。其它段不一一列举。
符号修饰与函数签名(Name Mangling)----为了防止命名冲突
几乎所有现代的编译器都支持源代码级别的调试,比如设置断点,监视变量,单步调试等,前提是编译器必须提前将源代码与目标代码之间的关系保存到目标文件里边。