C++primer 学习(一)浅谈编译器的作用

我们知道,在程序运行之前,必须先经过编译,编译的工作,总结为一句话:就是找出程序中的错误。

编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

预处理器:预处理器(preprocessor)作用是通过代入预定义等程序段将源程序补充完整。

编译器前端:编译器前端(frontend),前端主要负责解析(parse)输入的源程序,由词法分析器和语法分析器协同工作。词法分析器负责把源程序中的‘单词’(Token)找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。

编译器后端:编译器后端(backend)编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。

编译器分析,优化,变型都可以分成两大类: 函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。对于函数内的优化,有可以根据优化施加的范围分为,全局的(global)和局部的(local)。其中全局的优化是指该优化需要使用到全局的数据流控制流信息。而局部的优化是指指导优化的信息来自基本快。

编译都可以找出哪些错误呢?很显然,语法错误,类型错误,声明错误都是常见且比较容易解决的。最难解决的是逻辑错误或者内存溢出错误。出现内存溢出错误的时候,解决的办法就是断点调试,观察变量的值是否溢出或者在哪一步溢出。这个很关键。

你可能感兴趣的:(C++primer)