• C语言-第15课


    第15课  - 编译过程简介

      

    1. 编译器做了什么

    1)预编译:

    l 处理所有的注释,以空格代替。

    将所有的#define删除,并且展开所有的宏定义。

    处理条件编译指令#if#ifdef#elif#else#endif

    处理#include,展开被包含的文件。

    保留编译器需要使用的#pragma指令。

    预处理指令:gcc -E file.c -o hello.i

     

    (2)编译

    l 对预处理的文件进行一系列的词法分析,语法分析和语义分析:

    词法分析主要分析关键字,标示符,立即数等是否合法。

    语法分析主要分析表达式是否遵循语法规则。

    语义分析在语法分析而定基础上进一步分析表达是否合法。

    l 分析结束后进行代码优化生成相应的汇编代码文件。

    编译指令:gcc -S file.c -o hello.s

     

    (3)汇编

    汇编器将汇编代码转变为机器可以执行的指令。每个汇编语句几乎都对应一条机器指令。

    汇编指令:gcc -c file.s -o hello.o

    // test.h

    /*

    This is the header file for test.c

    */

    #define MAX(a,b) (((a)>(b)) ? (a) : (b))

     

    int g_global = 10;

     

    // test.c

    #include "test.h"

    #define LOW  0

    #define HIGH 255

    int max(int a, int b)

    {

        return MAX(a,b);

    }

    int main()

    {   

        int c = max(LOW, HIGH); // Call max to get the larger number

        return 0;

    }

     

    1. 连接器的意义

    连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。

     

    1. 模块拼装

    静态链接

     

    动态链接

     

     

    小结:

    (1) 编译器将编译工作主要分为预处理,编译和汇编三步。

    (2) 连接器的工作是把各个独立的模块链接成为可以执行的程序。

    (3) 静态链接在编译器完成,动态链接在运行期完成。

  • 相关阅读:
    ural(Timus) 1346. Intervals of Monotonicity
    SGU 223 Little Kings
    poj 1243 One Person
    poj 1185 炮兵布阵
    poj 1191 棋盘分割
    poj 1187 陨石的秘密
    ACMICPC Live Archive 2451 Brackets Sequence
    将时间格式的字符串转换成日期类型浏览器兼容解决方案
    asp.net项目发布容易忽略的debug=true
    使用微软的Ajax控件遇到的后台js提示语句不起作用的解决方案其一
  • 原文地址:https://www.cnblogs.com/free-1122/p/9706901.html
Copyright © 2020-2023  润新知