当前位置: 首页 > article >正文

C语言编译过程再解析

多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此

  • 编译过程 中的 链接与 编译
编译过程分为
	1. 预处理
	2. 编译
	3. 汇编
	4. 链接

其中有 2个过程比较特殊,
	1. 编译
	2. 链接

对于C程序来说,链接分为
	提前链接(静态链接)
		对应下图第1行
	运行时链接(动态链接)
		对应下图第2行
对于C程序来说,编译分为
	普通编译
		.c -> 与host同架构的.o
	交叉编译
		.c -> 与host不同架构的.o
	提前编译(AoT) // Ahead-of-Time Compilation // 这里的编译也可叫做 翻译
		与host不同架构的.elf(中的指令) -> 与host同架构的.elf(中的指令)
		对应下图第6行
	运行时编译(JIT) // Just in time Compilation // 这里的编译也可以叫做 翻译
		与host不同架构的指令 -> 与host同架构的指令
		对应下图第5
  • 解释运行 与 JIT编译运行的区别
解释运行和JIT编译运行(类似qemuJIT编译+host直接运行)的区别
	以 下面和下图 为例
		bash 对 shell脚本的解释运行 // 下图第3行
		qemu 的 JIT  // 下图第5行
		

虽然两者都涉及代码的执行,但其输入和输出确实有很大差异。
1.Bash对Shell脚本的解释运行:
	输入: 输入是Shell脚本文件,包含一系列命令和操作。
	输出: 输出是执行命令后的结果,可能是文本输出、系统状态更改等。

2.QEMU的JIT(即时编译):
	输入: 输入是客户机指令,例如ARM、x86等指令集。
	输出: 输出是将这些客户机指令翻译(编译)为宿主机机器指令,以便在不同架构之间进行硬件级的仿真。
  • jvm 的 JIT 和 qemu的JIT
1. JVM中的JIT(Java虚拟机的即时编译器):
	输入: Java虚拟机的JIT编译器接收Java字节码作为输入。Java源代码经过编译器编译成字节码,JIT编译器在运行时将这些字节码转换为特定平台的本地机器码。
	输出: JIT编译器的输出是特定平台的本地机器码,它是对Java字节码的即时编译结果。这些机器码被直接执行以运行Java程序。

2.QEMU中的JIT(QEMU的动态二进制转换器):
	输入: QEMU的JIT编译器接收客户机指令,例如ARM、x86等指令集,作为输入。QEMU在模拟不同体系结构时会将客户机指令翻译成宿主机机器指令。
	输出: JIT编译器的输出是宿主机机器指令,这些指令是对客户机指令的翻译结果。它们被用于在不同架构之间进行硬件级的仿真。
	虽然两者都涉及到将一种形式的代码转换为另一种形式的代码,但输入和输出有所不同,因为JVM的JIT编译器针对Java字节码进行处理,而QEMU的JIT编译器处理不同体系结构的指令集。
  • 几种常见的编译及加载运行方式

在这里插入图片描述


http://www.kler.cn/a/146446.html

相关文章:

  • MySQL程序之:使用类似URI的字符串或键值对连接到服务器
  • 关于vite+vue3+ts项目中env.d.ts 文件详解
  • 【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型
  • Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件
  • ORB-SLAM2源码学习: Frame.cc: cv::Mat Frame::UnprojectStereo将某个特征点反投影到三维世界坐标系中
  • R5天气识别学习笔记
  • YOLO的网络结构组成
  • 数据库系统原理与实践 笔记 #10
  • Jupyter Notebook本地部署并实现公网远程访问内网Jupyter服务器【内网穿透】
  • 【Spring】Spring是什么?
  • websocket,WebSocket与Socket的区别,HTTP与WebSocket区别,WebSocket特点
  • 如何使用Java支付宝沙箱环境并公网调用sdk创建支付单服
  • YOLOv7独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表
  • 成为一名优秀教师的关键要素
  • 深度学习之十(图神经网络--Graph Neural Networks,GNNs)
  • 数据结构—树
  • Harmony开发 eTs公共样式抽取
  • 区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测
  • AR眼镜双目光波导/主板硬件方案
  • canvas基础:绘制线段,绘制多边形
  • 利用广度优先或模拟解决米诺骨牌
  • 史上最细,2个半月从功能进阶自动化测试,进阶指南...
  • 【每日一题】子数组的最小值之和
  • 分享:身份证阅读器在ARM Linux系统调用libwlt2bmp.so解码库实现身份证头像解码
  • python爬虫实习找工作练习测试(以下内容仅供参考学习)
  • 【Linux】make/Makefile 进度条小程序