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

871461df1794fd3ec067d67a34103190.png

C语言

前言

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

总述

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

其实总的流程是这样的。

d3ddf4fdc8e47741e00c958c38c5f233.png

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包含了进来。

ef5ec0d52a14ce35658428154fd75137.png

C语言

(3)编译

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

(1)词法分析,

(2)语法分析

(3)语义分析

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

从 高级语言->汇编语言

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

22e874471dbd02c60049701996695818.png

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,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

final关键字---Java

final关键字---Java final关键字的作用1、修饰变量:被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。2、修饰方法:该方法不可被子类重写,但是可以被重载。3、修饰类:修饰的类不能被继承。注意:1、…

下载java离线文档的方法

第一种使用方法,直接下载 https://stackoverflow.com/questions/6986993/how-to-download-javadoc-to-read-offline 第二种方法,使用zeal软件 zeal简介:https://zealdocs.org/ 个人认为第二种方法好一点

接口-----java

接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须你能....”的思想。 如果你是天使,则必须能飞。如果你是汽车,则必须能跑。接口的本质就是契约,就像我们人间 的法律一样,大家都要遵守。…

如何利用flume进行日志采集

介绍 Apache Flume 是一个分布式、可靠、高可用的日志收集、聚合和传输系统。它常用于将大量日志数据从不同的源(如Web服务器、应用程序、传感器等)收集到中心化的存储或数据处理系统中。 基本概念 Agent(代理): …

接口应用:内部比较器Comparable

接口应用:内部比较器Comparable public interface Comparable {public int compareTo(Object obj); }public class Book implements Comparable{private String bookName;private String author;private String publisher;private double price;Overridepublic int…

axios进行图片上传组件封装

文章目录 前言图片上传接口(axios通信)图片上传使用upload上传头像效果展示总结 前言 node项目使用 axios 库进行简单文件上传的模块封装。 图片上传接口(axios通信) 新建upload.js文件,定义一个函数,该函数接受一个上传路径和一…

JDK1.8的接口新特性

JDK1.8的接口新特性 JDK7及其之前1、接口的变量都是public final static 全局静态常量,无变化。2、接口中都是抽象abstract方法,不能有static方法(因为abstract和static、final、private不能共存)JDK1.8及其之后1、接口中可以添加…

多相机坐标转换_使用KITTI数据集实现坐标转换

本文的主要内容,是讨论如何将KITTI激光雷达的点云数据,映射到图像中去。KITTI数据集是怎么采集的下面这幅图是车的俯视图,可以看到,用到了2个彩色相机,2个灰度相机,1个激光雷达。1个GPS/IMU。图1 KITTI车俯…

内部类-----Java

内部类-----Java 内部类是一类特殊的类,指的是定义在一个类的内部的类,在Java中内部类主要分为非静态内部类、静态内部类、局部 内部类、匿名内部类。 非静态内部类,作为类的成员存在,和成员变量、构造方法、代码块并列。因为是…

api数据加密的定义_API 设计基础规范

首先,请务必记住 API 设计和使用的一个重要法则 Postels Law(又称作稳健性原则):Be liberal in what you accept, be conservative in what you send下面是关于 API 设计的一些基本问题API First将 API 视作产品,并向产品开发一样设计和维护 API在代码实…

MySQL表级约束和列级约束

MySQL中只要支持六种完整性约束,如表所示:其中check约束是MySQL8中提供的支持。 约束条件 约束描述 primary key 主键约束,约束的值可唯一的标识对应的记录 not null 非空字段的值不能为空 unique 唯一约束,约束1字段的值是…

MySQL外键约束

MySQL外键约束 外键约束(FOREIGN KRY,缩写FK)是用来实现数据库表的参照完整性约束的。 外键约束可以是两张表紧密的结合起来,特别是针对修改或者删除的级联操作时, 会保证数据的完整性。 (注&#xff1…

zookeeper 密码_Dubbo、ZooKeeper介绍

dubbo是一个分布式架构的服务框架,一般结合maven的模块式开发使用。传统的单架构项目,不方便维护和升级;通过maven的模块式开发,就可以把一个单架构的工程,拆封成一个一个的小模块,包括(jar和war)&#xff…

异常--java

java默认的异常处理机制 优点:发生异常后、会给出异常类型、异常提示信息、异常出现的位置 缺点:出现异常后,后续语句不执行了;提示信息太专业,可读性差 解决:try-catch-finally 处理异常;th…

192.168.8.1手机登陆_高端机型都在鼓吹的ufs3.1是什么?对于手机使感受明显吗?...

最近很多朋友留言问,ufs3.1是什么,很重要吗?下面就由小编来给大家介绍一下手机上的ufs3.1是什么!ufs是高端安卓手机,常用的储存协议,就好像我们电脑里的固态硬盘一样,速度越快,打开软…

代码合并工具_11个代码质量审核和管理工具,程序员必备!

「 读者福利!2 TB 各类技术资源免费赠送 」如今,代码质量分析和审核已成为每个企业的基本流程。随着开源代码库使用的增加,安全性和代码质量对于构建高质量软件至关重要。不良的代码不仅会影响代码的可维护性,而且还会在某些情况下…

异常体系----java

一、异常体系 1、error error类层次描述了java运行时系统内部错误和资源耗尽错误,一般指与jvm或动态加载等相关的问题, 如:虚拟机错误,动态链接失败,系统崩溃等。 2、exception 所有异常类的父类,其子…

xy坐标正负方向_【笛卡尔坐标系】

【壹】笛卡尔坐标系(Cartesian coordinates)就是直角坐标系和斜坐标系的统称。相交于原点的两条数轴,构成了平面放射坐标系。如两条数轴上的度量单位相等,则称此放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标…

throw和throws的使用

throw和throws的使用 public class Person {private String name;private int age;public Person(){}Person(String name,int age){this.name name;this.age age;}public int getAge() {return age;}public String getName() {return name;}public void setName(String name…

为什么需要包装类?

1、某些方法的参数必须是对象,为了让基本数据类型的数据能作为参数,提供包装类。 2、包装类还可以提供更多的功能 3、其他特别重要的功能:比如可以实现字符串和基本数据类型之间的转换 认识一下包装类吧! package demo05;impor…