19-编译过程简介

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

 

一、被隐藏了的事实

1)初识编译器

 

2)你不知道的事

二、编译器做了什么

1)预编译

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

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

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

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

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

 

预处理指令示例:

        gcc -E file.c -o file.i

 

2)编译

  - 对预处理文件进行词法分析语法分析语义分析

    *词法分析:分析关键字,标识符,立即数等是否合法

    *语法分析:分析表达式是否遵循语法规则

    *语义分析:在语法分析的基础上进一步分析表达式是否合法

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

编译指令示例:

gcc -S file.i -o file.s

 

3)汇编

  - 汇编器将汇编代码转变为机器的可以执行指令

  - 每条汇编语句几乎都对应一条机器指令

 

汇编指令示例:

       gcc -c file.s -o file.o

编程实验
源代码单步编译示例
19-1.c

#include "19-1.h"

// Begin to define macro

#define GREETING "Hello world!"

#define INC(x) x++

// End

int main()
{   
    p = GREETING;
    
    INC(i);
    
    return 0;
}

19-1.h
/*
This is a header file. 
*/


char* p = "Delphi";

int i = 0;
单步调试就是把上边三个命令测试一遍。

操作:

1) 预编译:gcc -E 19-1.c -o 19-1.i。打开文件:

# 1 "19-1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "19-1.c"
# 1 "19-1.h" 1
char* p = "Delphi";

int i = 0;
# 2 "19-1.c" 2





int main()
{
    p = "Hello world!";

    i++;

    return 0;
}

2) 编译:gcc -S 19-1.i -o 19-1.s。打开文件19-1.s

    .file   "19-1.c"
    .globl  p
    .section    .rodata
.LC0:
    .string "Delphi"
    .data
    .align 4
    .type   p, @object
    .size   p, 4
p:
    .long   .LC0
    .globl  i
    .bss
    .align 4
    .type   i, @object
    .size   i, 4
i:
    .zero   4
    .section    .rodata
.LC1:
    .string "Hello world!"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    $.LC1, p
    movl    i, %eax
    addl    $1, %eax
    movl    %eax, i
    movl    $0, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

3) 汇编:gcc -c 19-1.s -o 19-1.o

 

小结:

编译过程分为预处理,编译,汇编和链接四个阶段

  - 预处理:处理注释以及已经以#开头的符号

  - 编译:进行词法分析语法分析语义分析

  - 汇编:将汇编代码翻译为机器指令的目标文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值