深入理解 代码的翻译阶段——C

简介: 深入理解 代码的翻译阶段——C

“了解一门语言的最基础知识,不如敲代码有趣,但是,不知道语言的基础知识会使你在敲代码时缺少乐趣”

这里是目录

前言

本章介绍程序的翻译和执行,也就是代码在执行前做了些什么。是学习C和C++的基础。

环境

ANSIC:ANSIC是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准。


在ANSIC的任何一种实现中,存在两种不同的环境:


本篇主要大的方面主要介绍C语言的 翻译 和 执行 环境

1.翻译环境 :在这个环境中,C源代码被转换为可执行的机器指令(指令也就是一串二进制数字)。

2.执行环境:它用于实际执行代码。

一、翻译环境

翻译环境做了什么事?

一句话可以概括为:由多个源文件组成的.C程序,经过预编译、编译、汇编、链接等阶段会生成最终的 (.exe)可执行程序

具体做了什么事如下。


1.编译

编译阶段做了什么事?

一句话概括:由多个源文件组成的.C程序 各自经过 编译器生成.obj为后缀的目标文件

具体如下。(是不是感觉这话很在哪见过,这句话和递归似的哈哈)

(1).预编译

预编译也叫做预处理,预处理阶段做了什么事情?

一句话概括:预处理阶段只会处理以#开头的语句。例如#include,#define

具体如下


1.展开头文件。比如展开#include的800多行代码

2.处理条件编译指令。把该屏蔽代码的都屏蔽掉了

3.宏定义的替换。比如替换#define定义的宏。

4.删除注释。因为注释是给程序员看的,机器不需要看。


这样就会产生一个和 只是在内容上和之前有所不同的文件。功能上实际不变。


(2).编译

什么是编译?

一句话概括:将预处理完的文件经过一系列处理产生相应的汇编代码文件

具体如下

1.语法分析。

2.词法分析。

3.语义分析。

4.符号汇总(重点):符号汇总,符号指的是已经声明的函数的名字,例如Add,main等函数名。编译器将这些符号汇总下来记录下来,以便于后面链接时根据函数名符号找函数的定义。


总结:编译是针对单个文件编译的,只校验本文件的语法是否有问题和 汇总符号,不负责寻找函数的定义。


编译完成后生成了 汇编代码。


(3).汇编

汇编发生了什么事情?


一句话概括:就是把汇编代码转化为由0和1组成的二进制指令并 生成了符号表


符号表:就是将上一个编译阶段 汇总的 符号形成一个符号表格

符号表中显示的 是: 函数名 和 函数的地址的一一对应的关系。


此阶段结束后生成了以.obj为后缀的目标文件。就此编译阶段到此结束。


2.链接

链接阶段发生了什么事?

一句话概括:通过链接器将一个个**目标文件(或许还会有库文件)**链接在一起生成一个完整的可执行程序。


所以链接程序的主要工作就是将有关的目标文件彼此相连接。

解释:就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。


结论: 所以在链接阶段会发现被调用的函数未被定义。


注意:链接阶段只会链接调用了的函数/全局变量,如果存在一个不存在实体的声明(函数声明、全局变量的外部声明),但没有被调用,依然是可以正常编译执行的。

总结

再回过头来看看翻译阶段做了什么事情?

翻译阶段

1.就是将一个程序的每个源文件(有可能有多个源文件)通过编译器分别转为**.obj的目标代码**。

2.然后各个目标文件C函数库中和程序员的个人程序库链接器(linker) 捆绑在一起,形成一个单一而完整的 以.exe为后缀的的可执行程序

相关文章
|
2月前
|
编译器 C++
C++语言预处理器学习应用案例
【4月更文挑战第8天】C++预处理器包括条件编译、宏定义和文件包含等功能。例如,条件编译用于根据平台选择不同代码实现,宏定义可简化常量和变量名,文件包含则用于整合多个源文件。示例中展示了如何使用`#ifdef`等指令进行条件编译,当`DEBUG`宏定义时,`PRINT_LOG`会打印调试信息,否则不执行。
28 1
|
7天前
|
自然语言处理 编译器 测试技术
详尽分享词法分析程序
详尽分享词法分析程序
|
2月前
|
IDE 编译器 C语言
【C++】使用g++指令控制【翻译】各个过程
【C++】使用g++指令控制【翻译】各个过程
|
2月前
|
编译器 C语言 C++
程序翻译过程详解
程序翻译过程详解
|
2月前
|
编解码 自然语言处理 API
ModelScope问题之翻译模型给的例子报错如何解决
ModelScope模型报错是指在使用ModelScope平台进行模型训练或部署时遇到的错误和问题;本合集将收集ModelScope模型报错的常见情况和排查方法,帮助用户快速定位问题并采取有效措施。
|
2月前
|
自然语言处理 编译器 程序员
标题:从预编译到链接:探索C/C++程序的翻译环境全貌
标题:从预编译到链接:探索C/C++程序的翻译环境全貌
|
2月前
|
编译器 C++
C++ 一种在编译阶段就能解决代码的技术
C++ 一种在编译阶段就能解决代码的技术
|
2月前
|
Java
注释之背后:代码的解释者与保护者
注释之背后:代码的解释者与保护者
23 0
|
8月前
|
数据采集 人工智能 监控
【网安AIGC专题11.1】论文13:理解和解释代码,GPT-3大型语言模型&学生创建的代码解释比较+错误代码的解释(是否可以发现并改正)
【网安AIGC专题11.1】论文13:理解和解释代码,GPT-3大型语言模型&学生创建的代码解释比较+错误代码的解释(是否可以发现并改正)
110 0
|
8月前
|
机器学习/深度学习 存储 人工智能
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
【网安AIGC专题11.8】论文15 ChatGPT在软件工程中的全面作用:程序语法(AST生成、表达式匹配) 静态行为、动态分析(数据依赖和污点分析、指针分析) 提示设计(角色提示、指令提示)
84 0