C语言

前言

说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可执行程序的底层生成一片茫然,这无疑是一种悲哀,可以想象到大公司面试正好被问到这样的问题,有多悲催不言而喻,这里正由于换工作的缘故,所以打算系统的把之前用到的C/C++补一补。

总述

从一个源文件(.c)到可执行程序到底经历了哪几步,我想大多数的人都知道,到时到底每一步都做了什么,我估计也没多少人能够说得清清楚楚,明明白白。

其实总的流程是这样的。

C语言

(1)编辑hello.c

#include #include int main(){ printf("hello world!"); return 0;}

(2)预处理

预处理过程实质上是处理“#”,将#include包含的头文件直接拷贝到hell.c当中;将#define定义的宏进行替换,同时将代码中没用的注释部分删除等

具体做的事儿如下:

(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释

(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

(6)保留#pragma编译器指令,因为编译器需要使用它们。

加C/C++学习交.流群获取C语言、C++、Windows高级编程,MFC框架编程、QT框架编程,Linux应用程序开发,Linux内核研究等系统学习路线,更有进阶干货的直播免费学习权限 ,都是大牛带飞 让你少走很多的弯路的 群...号是 787190917

gcc -E hello.c -o a.c可以生成预处理后的文件。通过查看文件内容和文件大小可以得知a.c讲stdio.h和stdlib.h包含了进来。

C语言

(3)编译

编译的过程实质上是把高级语言翻译成机器语言的过程,即对a.c做了这些事儿

(1)词法分析,

(2)语法分析

(3)语义分析

(4)优化后生成相应的汇编代码

从 高级语言->汇编语言

gcc -S hello.c -o a.s可以生成汇编代码

C语言

汇编代码如下。

.file "hello.c" .section .rodata.LC0: .string "hello world!" .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC0, (%esp) call puts movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret  .cfi_endproc.LFE0: .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" .section .note.GNU-stack,

高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...相关推荐

  1. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  2. JVM从入门到精通(二):详解Class加载过程,双亲委派机制,编译执行与解释执行

    复习:Class文件结构 Class Loading Linking Initializing:编译 加载 初始化 这节课,我们讲 class 是怎么从硬盘中加载到内存中,并且准备执行的. packa ...

  3. java 编译 解释执行_关于Java的编译执行与解释执行

    编程语言分为低级语言和高级语言,机器语言.汇编语言是低级语言,C.C++.java.python等是高级语言. 机器语言是最底层的语言,能够直接执行.而我们编写的源代码是人类语言, 计算机只能识别某些 ...

  4. ota升级包编译过程中firmware如何添加进来

    整个分析过程中,机型名以xxxx为例 主要可分为 一 firmware如何添加进target-files.zip 二 编译ota升级包时如何从target-files.zip取出firmware并添加 ...

  5. python中动态语言静态语言的定义_作为程序开发,你所需要知道的编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的概念以及区别...

    作为程序开发,你所需要知道的编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言的概念以及区别! 在各式各样的开发过程当中,我相信各位开发小伙伴在开发过程中并没有太关注什么是解释性语言和编译性语 ...

  6. 嵌入式c语言1--GCC和编译过程

    目录 GCC概述 编译过程 GCC概述 GCC:GNU C Compiler GNU是一个自由的操作系统,其内容软件完全以GPL方式发布.GPL其实就是开源的意思.随着语言越来越多,慢慢的变成了GNU ...

  7. C语言程序makefile编译过程

    C语言程序makefile编译过程 2022-0111 blog_010 makefile是一些大型linux下开发的项目经常会用到的编译脚本: 可以将makefile理解为类似shell一样的脚本语 ...

  8. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  9. C语言——程序的编译+链接(linux+gcc实现过程)

    文章目录 前言 一.预处理 1.预处理阶段的操作: 1.预处理过程实现: 二.编译 1.编译阶段的操作: 2.编译过程的实现: 三.汇编 1.汇编阶段的操作: 2.汇编过程的实现: 四.链接 1.链接 ...

最新文章

  1. iOS 最新版 CocoaPods 的安装流程
  2. 2020-12-28-bitset函数
  3. 如何理解Excel数组公式{=sum(1/countif(B8:K9,B8:K9))}
  4. 在线人员统计系统php,PHP统计当前在线人数 - 案例源码
  5. hibernate mysql缓存机制_Hibernate的缓存机制
  6. 将指定的计数添加到信号量中会导致其超过_从烷烃中分离烯烃、从原油中分离碳氢化合物…这七大化学分离过程将影响世界...
  7. 开发经验分享_04_快速熟悉程序(思路)
  8. Application.Goto 方法
  9. php psl标准,psl是什么单位
  10. 今晚直播丨一次特殊的 Oralce 硬解析性能问题的技术分享
  11. 工作方式 柔らかいコミュニケーション
  12. netdevice - 底层访问 Linux 网络设备
  13. 『搬运』分享一些国内外的专利搜索网站
  14. linux aria2安装路径,Aria2 Linux 完整安装及使用教程
  15. vue3 vite版本 引入本地静态图片的方式
  16. 《SpringBoot实战》读书笔记
  17. dhcp服务器是如何进行租约信息的更新的,DHCP服务器
  18. 信息系统安全等级保护一些实施难点
  19. 蚂蚁p8多少股票_蚂蚁金服上市了,小编不想努力了。
  20. 如何旋转图片方法#ps教程#ps学习#ps修图抠图

热门文章

  1. python django 表单_Django ModelForm与Form
  2. python的知识点运用_程序猿在Python编程中不得不使用的十二种基础知识
  3. php 分析url函数,PHP 解析URL函数 parse_url()函数
  4. delphi chart 曲线实时_发展学生曲线跑能力的体育游戏及运用研究
  5. 用Android打出马奔跑的动画,一款非常好用的动画库Lottie
  6. 广西高职计算机网络技术,计算机网络技术专业考试大纲-广西职业技术学院.DOC...
  7. matlab pretty什么用,matlab如何使输出结果更美观(symdisp函数——pretty函数升级版)...
  8. 中关村windows11 32位专业版镜像v2021.07
  9. 电脑公司win11 64位旗舰版镜像文件v2021.07
  10. Windows11怎么设置时间?Win11时间设置教程