【C/C++】程序如何来,编译全过程

简介:

概述

   编译的目的是把人书写的高级语言代码翻译成目标程序的语言处理程序,编译用的程序(例如gcc)称为编译系统。

  一个编译系统把一个源程序翻译成目标程序的工作过程分为5个阶段:词法分析、语法分析、中间代码生成、代码优化和目标代码生成。

  其中主要阶段是词法分析和语法分析,也可以称为源代码分析,分析过程中发现有语法错误,给出提示信息。



词法分析

   词法分析的目的是处理源代码中的单词。

  词法分析程序按照从左到右的顺序wyuq 扫描源代码,生成单词对应的符号,把字符描述的程序转换为符号描述的中间程序。

  词法分析程序也称做词法扫描器。

  词法分析过程可以用手工构造和自动生成两种方法。手工构造可以使用状态图,自动生成的构造方法通常使用确定步骤的程序状态机。



语法分析

   语法分析程序使用词法分析程序的结果作为输入。

  语法分析的功能是分析单词符号是否符合语法要求,如表达式、赋值、循环等是否构成语法要求。此外,语法程序还按照语法规则分析检查程序的语句是否符合合理正确的逻辑结构。

  语法分析方法有自上而下和自下而上分析两种方法。

  自上而下分析方法从方法开始的符号向下推导,逐步分析。自下而上分析方法利用堆栈的原理,把词法符号按顺序入栈,然后分析语法是否符合要求。



中间代码生成

   中间代码也称做中间语言,是一种介于源代码与目标代码之间的表示方式。

  使用中间程序可以完整地表达源代码的意思,同时又使编译程序在逻辑结构上简单明确。

  中间语言是供编译器使用的,常见的表示形式有逆波兰几号、四元式、三元式和树等。



代码优化

   代码优化是目标是生成有效的目标代码。

  代码优化通过对中间代码的分析,进行等价变换,达到减小存储空间和缩短运行时间的目的。

  程序优化并不改变源代码的功能。

  代码优化还可以对目标代码进行优化,与中间代码优化相比,对目标代码优化依赖计算机类型,但是优化的效果相对较好。



目标代码生成

  编译程序的最后一项任务是生成目标代码。

  目标代码生成器把中间代码变换成目标代码,通常有3种变换形式:

  • 立即执行的机器语言代码。这种方式对应静态连接方式,程序中所有地址都重定位,执行效率最高,但是占用的存储空间最大。

  • 待装配的机器语言模块。该方式不连接系统共享的程序库,在需要使用的时候会由系统加载共享程序库。

  • 汇编语言代码。该方式经过汇编程序汇编后,直接生成可以在操作系统上运行的目标代码。

  生成目标代码需要考虑3个影响生成速度的问题:

  • 一是采用什么方法生成比较短小的目标代码;

  • 二是如何在目标代码中多使用寄存器,减少目标代码访问外部存储单元的次数;

  • 三是如何根据不同平台计算机指令特性进行优化,提高程序运行效率。



本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1198506


相关文章
|
30天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
114 0
|
1月前
|
安全 编译器 C++
【C++20概念】编译时多态性的力量
【C++20概念】编译时多态性的力量
49 0
|
25天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
1月前
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
62 2
|
1月前
|
算法 编译器 C++
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
【C++ 泛型编程 中级篇】C++ 编译时技术:探索 if constexpr 和 std::enable_if
40 0
|
1月前
|
安全 算法 编译器
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
【C++ 静态断言的技巧】掌握C++中static_assert的力量:深入探讨编译时检查
42 1
|
1月前
|
存储 算法 编译器
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
29 0
|
1月前
|
编解码 算法 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(三)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
27 0
|
1月前
|
C++ 索引
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(二)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
29 0
|
1月前
|
存储 编译器 程序员
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南(一)
【C++ 泛型编程 高级篇】 C++ 14 模版元编程 遍历元组 编译期生成整数序列 std::index_sequence和std::make_index_sequence 使用指南
49 0