C语言的实现经过(C代码到CPU执行)
2018-01-05 创建人:Ruo_Xiao
2018-01-06 修改人:Ruo_Xiao
1、添加编辑器之后,预处理之前的编译器的操作。
2、添加对优化器的简单的说明。
2018-01-12 修改人:Ruo_Xiao
修正最后的逻辑总图,添加“源代码处理”。
2018-01-20 修改人:Ruo_Xiao
增加对编译器和连接器更详细的说明。
一、概括
C源代码 -> C编辑器 -> 源代码处理 -> 预处理器 -> C编译器 ->(优化器) -> 连接器 -> 可执行文件 -> CPU执行
二、C源代码
英文:Source Code。
三、C编辑器
- 用C语言编写的程序都存储在文本文件中,该文件被称为源代码文件(Source Code Files),大多数系统都以“.c”为扩展名。
拓展:点号“.”前面的部分被称为基本名(Basename),点号后面的部分被称为扩展名(Extension),基本名和拓展名的组合被称为文件名。 - 常用的C编辑器有:
(1)windows:记事本(notepad)。(需要修改扩展名)
(2)Linux:Vi、Vim。
(3)Unix:emacs、jove、Vi、X Window System文本编辑器。 - 有的C编辑器具有自动纠错功能,例如Vim。
四、源代码处理
1、编译器把源代码中出现的字符映射到源字符集,该过程处理多字节字符和三字符序列。
2、编译器定位每个反斜杠后面跟着换行符实例,并删除它们。也就是说把下面两个物理行(physical line):
printf("Hello,my\wife!/n");
转化为一个逻辑行(logical line)。
printf("Hello,my wife!/n");
3、编译器将文本划分成预处理记号序列、空白序列和注释序列(记号是由空格、制表符或换行符分隔的项)。这里,编译器将空白字符序列和注释序列用一个空格替换。所以下面代码
int/*我是注释!*/i = 0;
变成了
int i = 0;
五、预处理器
- 预处理器是在真正的编译开始之前由编译器调用的独立程序。
- 预处理器指令以#号开头标识,末尾不包含分号。
- 主要功能有文件包含、宏替换、条件编译等。
- 在编译的预处理阶段实现的功能:
(1)将头文件加载到代码中。
(2)对宏进行替换。等等
再根据条件编译指令,最终生成新的源代码,传给编译器。
六、C编译器
- 英文: C Compiler。
- 是将经过预处理器处理之后的C代码翻译成对应于各种CPU能够执行的可执行代码的程序。
拓展:可执行代码,用计算机的机器语言表示的代码,这种语言是由数字码表示的指令组成,即CPU的微指令。 - 编译器检查的是语法、函数与变量的声明是否正确。
- 存储编译器生成的可执行代码的文件被称为目标文件(Object file)。
拓展:目标文件
(1)扩展名:
Unix/Linux:“.o”。
Windows:“.obj”。
(2)目标文件虽然包含机器语言代码,但是不能直接运行,原因如下:
A、缺少启动代码(Startup Code),启动代码充当着程序和操作系统的之间的接口。
B、缺少库函数代码,只是包含了库函数的指令。 - 种类
(1)GNU编译器集合(GCC,其中包含GCC C 编译器),Linux和Unix下使用gcc即可调用GCC C 编译器。
(2)GCC编译器在windows上的运行的软件是Cygwin和MinGW。
(3)LLVM项目的Clang编译器,通过clang调用,应用于Linux和FreeBSD(默认)中。
(4)VC和VS。
(5)cc 是 Unix系统的 C Compiler,一个是古老的 C 编译器。
七、优化器
- 对目标代码进行进一步处理,使其效率更高。
- 只针对Release,Debug不进行处理。
八、连接器
- 将编译器生成的目标文件中的代码、系统的标准启动代码和库代码三者合并成一个文件,即可执行文件。
- 主要是链接函数和全局变量。链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现,你需要指定函数的ObjectFile。
九、可执行文件
- windows:扩展名为“.exe”。
- Unix/Linux:扩展名“.out”。
十、CPU执行
- 能让CPU执行的只要其特有的微指令集。
- 可执行文件就是由微指令集中的指令构成,故在windows下,双击exe就可以让CPU开始按照C源代码中所设想的那样工作了。
十一、流程图
C语言的实现经过(C代码到CPU执行)相关推荐
- 一行代码揭开CPU执行原理
参考:一行代码,揭开CPU执行原理! 作者:嵌入式ARM 网址:https://mp.weixin.qq.com/s/qFnKhWqBGRCFAnp_KC1dmw 目录 1.高级语言 2.编译链接 3 ...
- 教你C语言实现通讯录的详细代码
本文详细讲解了C语言实现通讯录的方法,文中通过示例代码介绍的非常详细.对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 (一)实现思路 1.通讯录功能 添加好友,删除好友,查找好友,修改 ...
- C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集
目录 文章目录 目录 文章目录 为什么要保留汇编语言 顺序程序流 条件程序流 循环程序流 函数调用栈的工作原理 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程 ...
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- python语言能够整合各类程序代码-python语言概述
python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...
- php连接数据库语言,PHP语言连接MYSQL数据库实例代码
本文主要向大家介绍了PHP语言连接MYSQL数据库实例代码,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 现在做的项目需要php连接mysql数据库,虽然之前学过,但是现在基本上都给忘 ...
- c语言中如何让诊断代码右移_如何检测和诊断生产中的慢代码
c语言中如何让诊断代码右移 开发人员面临的更困难的任务之一是查找和诊断生产中运行缓慢的代码. 首先,您如何监控生产代码而不放慢速度? 当然,您无法通过分析器运行生产代码. 即使您有计时代码的机制,那么 ...
- java二叉树代码_JAVA语言实现二叉树生成的代码教程
本文主要向大家介绍了JAVA语言实现二叉树生成的代码教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 给定某二叉树三序遍历中的两个,我们即可以通过生成该二叉树,并遍历的方法,求出剩 ...
- Java语言使用注解处理器生成代码——第二部分:注解处理器
原文作者:deors 原文地址:https://deors.wordpress.com/2011/10/08/annotation-processors/ 译文作者:Jianan - qinxiand ...
最新文章
- 使用SVCUtil.exe生成客户端代理类和配置文件
- [zz]GNU C __attribute__ 机制简介
- 从Zero到Hero,一文掌握Python关键代码
- Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
- Pug+Stylus+Bootstrap入门
- Retrofit2源码解析——网络调用流程(下)
- 闲鱼公布2021年度十大“无用”商品:网友买前壮志 买后吃灰
- cmd jar 无效_为什么我的JAR文件以CMD执行,而不是双击执行?
- linux与Windows查看路由
- linux系统开机图片修改,linux开机logo 和 android开机logo 的修改
- linux硬盘速率测试,【Linux】测试硬盘读写速度
- 无人车系统(四):轨迹跟踪PID控制
- 电脑上有哪些特别好用的小工具?盘点4个PC工具,个个都精品
- efi分区能不能删除 win10_Win10不小心把EFI分区删除怎么恢复?
- java 间接引用_Java中的四种引用方式的区别
- 微信怎么找群聊?找回微信群聊只需要这样…
- 微信服务号开发说明:测试号申请、自定义菜单添加第三方连接
- 明翰英语教学系列之语料篇V0.4(持续更新)
- numpy_subtract函数
- Tableau Prep经验总结
热门文章
- 实时监控Cat之旅~对Get和Post进行封装,支持分布式消息树
- Windows Server 2008虚拟机ERP压力测试(5)
- Scrapy爬取姓名大全,看看那个名字最受父母青睐
- linux shell sed d删除指定行并更换分隔符为#
- fedora 35 安装各种桌面环境命令整理
- kafka发送及消费消息示例
- spark安装须知:SPARK_DIST_CLASSPATH配置
- spark on yarn相关脚本整理20210524
- 请解释为什么集合类没有实现Cloneable和Serializable接口?
- 谈谈分布式的场景及分布式事务的解决方案