c/c++的编译原理

c/c++的编译原理

    程序设计语言是向人以及计算机描述计算过程的记号,在程序运行之前,首先需要被翻译成一种能够被计算机执行的形式,完成这项翻译工作的软件称为编译器。


编译器

    一个编译器就是一个可以阅读某一种语言(源语言)编写的程序的程序,并将源程序翻译成一个等价的、用另一种语言(目标语言)编写的程序。编译器的重要任务之一就是报告在翻译过程中发现的源程序中的错误。如果目标程序是一个可以执行的机器语言程序,那么它就可以被用户调用并产生输出。


解释器

    解释器不通过翻译的方式生成目标程序,而是直接利用用户提供的输入执行源程序中指定的操作。

比较

    在将用户输入映射成为输出的过程中,由便以其产生的目标程序通常比解释器快得多。但是解释器的错误诊断效果通常比编译器更好,因为它逐个语句的执行源程序。


Java编译器编译过程

    Java语言的处理器结合编译器和解释器,首先通过编译器将源程序编译成一个称为字节码的中间表示形式。然后由一个虚拟机对得到的字节码加以解释执行。这样做的好处是在一台机器上编译得到的字节码可以在另一台机器上解释执行。通过网络就可以完成机器之间的迁移。

    为更快的完成输入到输出的处理,有些被称为即时编译器的Java编译器在运行中间程序处理输入的前一时刻首先把字节码翻译成机器语言,然后再执行程序。


一个混合编译器


预处理器

    一个源程序可能被分割成多个模块,并存放于独立的文件中。把源程序聚合在一起的任务有时会由一个称为预处理器的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换成为源语言的程序。


汇编器

    编译器一般会产生一个汇编程序作为其输出,该输出由汇编器程序进行处理并生成可重定位的机器代码。


连接器

    大型程序经常会被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接到一起,形成真正的在机器上运行的代码。一个文件中的代码可能指向另一个文件中的位置,而连接器能够解决外部内存地址的问题。


加载器

    加载器将所有的可执行目标文件放到内存中执行。


一个语言处理系统


C/C++源程序编译过程

    C/C++编译过程将源代码映射为机器码,并讨论其中的内存管理模式,包括内存的分配、使用等,以及整型、数组、指针等机制在内存中的实现方式。

过程:C/C++源程序->预编译处理(.cpp)->编译、优化程序(.s、.asm)->汇编程序(.obj、.o、.a、.ko)->链接程序(.exe、.elf、.axf)

(1) 预编译:包括将宏定义指令(#define/#undef等),条件编译指令(#ifdef,#ifndef,#endif等),头文件包含指令(#include "file.h"或#include <file.h>等),特殊符号转换成源语言的程序;

(2) 编译:将源代码映射为对应的汇编代码;

(3) 汇编:将汇编代码映射为机器码;

(4) 链接:形成相应的动态和静态链接库,动态链接库在程序运行时动态加载,静态链接库直接拷贝进入程序,在程序执行时,静态链接库已经加载进来。

注:

#include<>:这条指令就是告诉编译器去系统默认的路径寻找相关文件。

#include”” :这条是告诉编译器先去源程序所在目录下寻找,如果没有就去系统默认路径寻找。


静态链接库(*.lib)

    静态链接库中函数和数据被编译成一个二进制文件,VC++编译器链接时将从静态链接库中恢复这些函数和数据,并将它们和应用程序中的其它模块组合在一起生成可执行文件。该过程称为“静态链接”,此时因为应用程序所需要的全部内容都是从库中复制出来,所以静态库本身不需要与可执行文件一起发行。

    在应用中,一些公共代码需要反复使用,就将这些代码便以为“库”文件,在程序链接时,链接器将从库文件中取得所需要的代码,并复制到可执行的文件中。这种库即为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点是被多次使用就会有多分冗余的拷贝。

    注意:态库在程序的发行时是不需要发布库的, 因为静态链接就是将程序所需的所有程序直接拷贝到程序中来。


动态链接库(*.dll)

    动态链接库,克服了静态链接库需要多次拷贝的缺点,链接器仅仅需要在可执行文件中打上标志,说明需要使用哪些动态链接库,当程序运行时,加载器根据这些标志将所需要的动态链接库加载到内存中。

   注意:动态库,肯定需要将程序的动态库一起发布,这样就可以减少程序的大小。









  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机科学中的一门重要课程,主要研究的是将高级语言编写的程序转化为计算机能够理解和执行的机器语言的过程。而C/C++是一种广泛应用的高级编程语言,其编译原理与其他编程语言相似。 C/C++编译原理包括了多个步骤。首先,预处理器会对源代码进行处理,包括宏展开、头文件包含以及条件编译等。接下来,编译器将转化预处理后的代码为汇编代码。然后,汇编器将汇编代码转化为可重定位的机器代码。最后,链接器将可重定位的机器码和库文件等结合,生成最终的可执行文件。 在编译过程中,编译器会进行语法分析和语义分析。语法分析主要是通过词法分析、语法分析和语法制导翻译等步骤,将源代码转化为语法树。语义分析是对语法树进行分析,检查语法的正确性,并进行类型检查等。 在编译过程中,还会进行优化。优化主要分为前端优化和后端优化。前端优化是在源代码转化为中间表示形式之前进行的优化,包括常量折叠、公共子表达式删除等。后端优化是在中间表示形式转化为目标代码之前进行的优化,包括指令调度、寄存器分配等。 总的来说,C/C++编译原理是一个复杂的过程,涉及到词法分析、语法分析、语义分析、优化等多个步骤。通过这一过程,将高级语言编写的程序转化为计算机能够执行的机器语言,从而实现程序的正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值