C#探索之路(9):深入理解C#代码编译的过程以及原理

news2024/11/27 13:46:23

C#探索之路(9):深入理解C#代码编译的过程以及原理

文章目录

  • C#探索之路(9):深入理解C#代码编译的过程以及原理
      • 一、前言:概念解析
        • 1、编译器:
        • 2、JIT是什么?
        • 3、AOT是什么?
        • 4、如何理解这个“基于运行时”的概念?
        • 5、“在程序运行之前”这个概念如何理解?
        • 5、编译和运行分别是什么意思?
        • 6、JIT编译器(Just in Time):
        • 7、JIT编译器何时运行?在哪?
        • 8、(误区)AOT并不是只在苹果系列手机中才有使用到,Android系统的手机里面也有使用到。
        • 9、辨析JIT和AOT之间的作用
      • 二、C#中代码编译的过程:
        • 1、简易的编译流程图:
        • 2、编译阶段与运行阶段流程图:
        • 3、可执行程序文件的组成结构:
        • 4、 .NET编译运行的详细流程图:
      • 三、个人总结
      • 四、参考链接:

一、前言:概念解析

1、编译器:

编译器是将用某种程式语言写成的源代码(源语言),转换成另一种程式语言(目标语言)等价形式的程序。通常我们是将某种高级语言(如C、C++、C# 、Java)转换成低级语言(汇编语言、机器语言)。

*简而言之:编译器是高级语言解释器(转换器)

转换缘由:机器组成是CPU,机器只能读懂并运行对应的cpu指令,对于我们的int、short、for这部分的内容根本不理解也不认识。

2、JIT是什么?

JIT(Just-In-Time)是一种运行时编译技术,它指的是在程序运行的过程中,将未编译的代码实时地转换成可执行代码的过程。在Java等语言中,JIT通常是编译字节码的过程。使用JIT可以提高程序的执行速度和性能,因为即时编译器可以针对具体平台和硬件,对程序进行优化。

简而言之:JIT是运行时编译技术

3、AOT是什么?

AOT(Ahead-of-Time)是一种静态编译技术,它可以在程序运行之前将代码编译成本地机器码。这与JIT(Just-in-Time)技术不同,后者是在程序运行时将代码转换成本地机器码。AOT编译可以提高程序的性能和安全性,因为编译后的代码可以直接在系统上执行,不需要再通过JIT编译器转换。另外,使用AOT编译可以避免启动程序时的JIT延迟,从而提高启动时间。AOT编译在很多情况下都是一个好的选择,尤其是当代码需要高效执行、在启动时需要快速启动和运行、或需要避免程序被反向工程时。

简而言之:AOT是静态编译技术

4、如何理解这个“基于运行时”的概念?

“基于运行时”是指在程序运行的时候进行编译和代码转换的过程。在C#中,代码首先被编写或者编译成CIL(中间语言)代码,这些代码不会直接在计算机上运行。相反,CIL代码会在程序运行时传递给运行时环境,该环境会将其编译成本地代码,然后使用操作系统调用来执行该代码。

因此,"基于运行时"中的"运行时"是指实际程序运行时的环境。在该环境中,CIL代码通过JIT编译器转换为本机代码,以便在计算机上直接执行。这种编译方式可以提高代码的执行效率,以适应不同的平台和操作系统。同时,它也可以实现动态代码生成和执行,以便应对动态环境的变化。

总之,基于运行时的编译方式是一种在程序运行时进行编译和代码转换的过程,它使用JIT编译器将CIL代码转换为本机代码,从而提高程序的执行效率。

5、“在程序运行之前”这个概念如何理解?

“在程序运行之前”指的是在程序开始执行之前,通过AOT编译器将代码转换成本地机器码的过程。与JIT编译器不同,AOT编译器会在程序运行之前预先将代码转换成本地机器码,然后将其保存在目标设备的文件系统上,以便在运行时直接执行。这种编译方式的好处是可以避免程序在启动时的JIT延迟,从而提高程序启动速度和执行效率。通常情况下,AOT编译器会在将程序部署到目标设备上之前,通过提前编译的方式将程序代码转换成本地机器码。

5、编译和运行分别是什么意思?

编译:“编译”是将源代码转换成中间代码(ILCode),或者直接将代码转换成可执行文件(exe文件)

运行:“运行”是指计算机执行可执行代码并输出结果

6、JIT编译器(Just in Time):

JIT是基于运行时的编译器,它可以在代码执行时将IL代码(中间语言代码)转换为本机代码(机器指令)。在C#中,代码通经常编写IL代码的格式,并将其存储由于IL是一种中间语言,因此在执行时需要使用.NET运行时才能将其转换为本机代码并执行。

JIT的作用是优化代码的执行速度。使用JIT编译器,可以将IL代码转换为本机代码,这样就可以更快地执行代码。当代码第一下次被执行时,JIT会将该代码块编译成本机代码,并将编译后的代码打包起来,以方便在以后执行时重新使用。这可以提供更高的代码执行速度,并减少最少的内存和硬盘空间的使用。

简而言之:JIT编译器是一种将IL代码转换为本机代码的编译器,其主要作用是优化代码的执行速度。

7、JIT编译器何时运行?在哪?

JIT编译器是.NET运行时环境的一部分,它会在程序运行时自动运行。

JIT编译器通常部署在.NET运行时环境中,在程序开始执行时自动运行

8、(误区)AOT并不是只在苹果系列手机中才有使用到,Android系统的手机里面也有使用到。

Android 7.0上,JIT 编译器被再次使用,采用AOT/JIT 混合编译的策略。

9、辨析JIT和AOT之间的作用

这两个都是一种编译技术,至于设备本身支不支持,这取决于设备所依赖的操作系统以及设备平台本身。

10、

二、C#中代码编译的过程:

1、简易的编译流程图:

源代码–>解释器–>MSIL阶段(JIT编译器–>编译成本机代码(01000110…))

2、编译阶段与运行阶段流程图:

3、可执行程序文件的组成结构:

4、 .NET编译运行的详细流程图:

三、个人总结

​ 最近,在博客上偷懒了,不过有在认真整理自己的知识体系,并且在最近这段时间内,大佬对我的及时“拷打”(点播)让我不断地去调整自己对自己的认知。经过思考,我觉得我是个fw(开个玩笑),不过也相差无几了(并非妄自菲薄),个人觉得只有真的能够在技术上能够独当一面的时候,这个时候才算是脱离菜鸟这个称号。

​ 过段时间,准备自己弄个公众号督促一下自己,大概每周发至少两篇高质量的文章吧。一是提醒自己在博客笔记这块儿不要懈怠,另一方面,也是为了让自己通过博客的方式能够加深自己对技术概念的而理解和应用。

​ 有个我自己对自己认识后存在的几个误区,我需要提出来警醒各位博客博友,①知识体系散,不稳固。②基础不够夯实。③浮于表面,对概念的理解和技术应用停留于表面。④找不到偏重点和突破点,类似于瓶颈期间。看不到比较显著的提升。

​ 如果你有遇到过以上这么几种情况,恭喜你,脑袋要开始痒了,要涨脑子(知识)了。造成这样的几个痛点误区的原因:①应用少②接触不到③没有主动的去深入理解原理④基础还是不够牢固。

​ 如果你也是这样,沉下心来吧,慢慢去了解,慢慢去总结,慢慢去加深。

​ 打破砂锅查到底,把概念解析清楚,把原理理解透彻,才不会给后续的学习埋下障碍。虽然打破砂锅查到底可能会面临一系列的问题如图 :

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPGPkf56-1687203638721)(C:\Users\JackiieWang\AppData\Roaming\Typora\typora-user-images\image-20230620031324836.png)]

真实的想法:

​ 一开始,我其实就知道自己对这个半只不解,正好这两天需求量比较少,就注重去加强对这方面的理解和学习,而且我看到太多的文章,讲的一知半解,对于概念解析的太过于笼统,官方,也许有的博主其实自己是明白过程的,但是我发现有很多的文章要么太过于简单,要么太过于复杂,让我对这篇文章的相关原理的了解和实现在一定程度上花费了很大的时间去总结和归纳、理解。

​ 虽然查询问题的过程可能繁琐,可能复杂,但是最终殊途同归…,开启你自己的造神之路。其实说个实话,我其实觉得当我对这些概念的理解加深后,我个人是非常满足的,知其然不知其所以然才是让我最难受的,”喔这个阿,这个我懂,但懂得不多。“”喔喔喔~!我知道一丢丢,但我形容不出来,对!就是你指的这个意思…“,技术宅,扎实一点,靠谱一点。

​ 当然,我们现在其实一直都是站在前人的肩膀上去进行二次学习和了解,很多内容前人都总结好了,我们只需要自己去理解,自己去辨析证伪,在一定程度上,极大程度减少了学习成本。

​ 还有很重要的一点,利用好AI可以在一定程度上加大学习效率。

四、参考链接:

  • C#/.NET程序运行流程

  • C#程序的编译过程

  • 知乎:C#的编译过程

  • 深度理解C#的执行原理

  • C#是如何执行的

  • 对于exe可执行程序的理解:

  • exe文件的由来和原理

  • 什么是运行时

  • 解释执行和编译执行的区别、基于栈和基于寄存器的指令集区别

  • 编译期初始化与运行期初始化

  • 编译执行和解析执行的区别以及执行的速度比较?

  • 编译和运行的区别是什么

  • 编译、生成、调试和运行有什么区别

  • 51CTO:编译器与运行期

  • 编译期与运行期确定的内容:

  • 调用重载的方法是在编译器确定的:

  • JIT即时编译的原理

  • 对比JIT和AOT,各自有什么优点与缺点?

  • 理解Java的JIT和AOT

  • 什么是JIT

  • 彻底认识「JIT编译器的运行原理」

  • 即时编译(JIT)探究https://juejin.cn/post/7065515220222869518)

  • ChatGpt (手动狗头)😏

​ 模糊区域已经替大家踩了,他们之间的联系也给大家提出来了,剩下的就交给博客博友们了。

如果您遇到了这个问题,并且我的文章确确实实帮到您了,希望您给一个赞支持一下我呀,喜欢我的文章的朋友也可以关注我的博客,关注我的后续的文章分享呀,谢谢啦。在这里插入图片描述

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

在这里插入图片描述

作者:ProMer_Wang

链接:https://blog.csdn.net/qq_43801020/article/details/131298600

本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!

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

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

相关文章

Shell 脚本和编程

shell脚本和编程 Shel基础概念 Shell是一种命令行解释器,是Linux系统中最常用的命令行界面。Shell脚本是由一系列Shell命令组成的文本文件,可以用来自动化执行Linux系统上的任务。Shell脚本是一种强大的工具,可以通过编写脚本来实现自动化运…

FPGA XDMA 中断模式实现 PCIE X8 测速试验 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串行连接&#xf…

Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益

Unity 之 最新Ads原生广告接入流程详解和工具类分享 一,注册 Unity Ads 广告 SDK二,下载 Unity Ads 广告 SDK三,配置 Unity Ads 广告 SDK3.1 广告位展示流程3.2 代码初始化 四,集成 Unity Ads 广告 SDK4.1 相关介绍4.2 代码分享 五…

开发日记-凌鲨中数据库代理的实现

凌鲨定位于连接研发过程中一切信息和工具。下面是数据库代理的大概框架: 技术选型 使用golang开发各种数据库协议代理,redis-proxy,mysql-proxy,mongo-proxy使用swagger提供代理协议的调试 选型原因 我们的客户端使用了tauri作为框架,在实现扩展功能的…

基于阴影检测和平衡亮度差阴影消除算法的MATLAB完整程序分享

完整代码: clc; clear; close all; warning off; addpath(genpath(pwd)); I=imread(1.png);%%此处导入自己需要检测的图片 [x,y,z]=size(I); figure(Name,Processing Steps),subplot(3,2,1), imshow(I),title(Image 1: Original Image); I=uint8(I); temp1=I; half_intens…

MySQL优化--MVCC

目录 概念 MVCC的具体实现 隐式字段 undo log日志 概念 undo log版本链 readview 接上文,redo log保证了事务的持久性,undo log 保证了事务的原子性和一致性 那,隔离性是如何保证的呢? 锁:排他锁(如…

Linux下Redis 存储

命令使用 目录 命令使用 RDB持久化 AOF持久化 yum安装 [rootlocalhost ~]# yum -y install redis 已加载插件:fastestmirror Loading mirror speeds from cached hostfile* c7-media: * epel: ftp.yz.yamagata-u.ac.jpvim到文件etc/redis.conf 取消注释requirep…

Paddle lite 初识与简单使用

一、何为Paddle lite 官方解释如下: Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎,在多硬件、多平台以及硬件混合调度的支持上更加完备,为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力,有效解决手机…

Android——事务处理(十二)

1. 事件处理简介 1.1 知识点 (1)了解事件处理的作用; (2)了解常用的事件及相关处理接口; 1.2 具体内容 在android当中,基本上每一个组件都有用相应的事件处理,但是不过有多少种事…

chatgpt赋能python:Python抢单软件:如何优化SEO?

Python抢单软件:如何优化SEO? 导言 随着互联网技术的飞速发展,越来越多的人开始关注SEO(Search Engine Optimization)技术。而对于Python编程工程师来说,了解SEO技术也是非常重要的。那么,如何…

day10 伪操作与混合编程

伪操作 伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译 .global symbol 将symbol声明成全局符号.local symbol 将symbol声明成局部符号.equ DATA, 0xFFMOV R1, #DATA.macro FUNCMOV R1, #1MOV R2, #2.endmFUNC.if 0MOV R1, #1MOV R2, #2.endif…

简要介绍 | 快速傅里叶变换:从原理到应用

注1:本文系“简要介绍”系列之一,仅从概念上对快速傅里叶变换进行非常简要的介绍,不适合用于深入和详细的了解。 快速傅里叶变换:从原理到应用 Denoising Data with Fast Fourier Transform 1. 背景介绍 傅里叶变换(F…

vcruntime140_1.dll修复,vcruntime140_1.dll丢失推荐的修复方法-一键修复

vcruntime140_1.dll是什么什么文件呢?为什么电脑在运行一些游戏的时候会出现丢失vcruntime140_1.dll,然后游戏运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 本教程操作系统:Windows vcruntime140_1.dll丢失…

第十四章 json模块

1. json模块介绍 Python 中的json 模块提供了对JSON 的支持,用于将JSON 格式字符串转换为Python 对象。首先需要了解一下什么是JSON。 什么是JSON JSON 是基于JavaScript 语言的轻量级的数据交换格式,是JavaScript 对象的表示法(JavaScrip…

mariadb 高可用集群

目录 1.相同操作:修改hosts文件 把四台机IP写进去 2. www 管理机 4.管理 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于…

C51/C52--LCD1602

目录 一、LCD1602简介 二、LCD1602的工作(显示)原理 三、技术参数 四、外形参数,引脚功能 五、连接方式 六、示例程序与结果 一、LCD1602简介 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#xff0…

chatgpt赋能python:如何使用Python找出重复元素

如何使用Python找出重复元素 在Python编程中,有时候需要查找并删除重复的元素。这些元素可以是列表、字符串等数据类型。在本文中,将介绍如何使用Python查找并删除重复元素。以下是我们将要涉及到的一些主题: 为什么需要查找重复元素&#…

深挖面试题讲解

面试题讲解🍴 文章目录 面试题讲解🍴和equals()的区别🍔1️⃣注意事项2️⃣明确问题3️⃣总结 什么是HashCode🍇1️⃣HashCode的描述2️⃣常见误区3️⃣hashCode的作用4️⃣总结 String、StringBuffer、StringBuilder的区别&#…

chatgpt赋能python:Python编程:如何找出给定的n个数中的最大值及其对应的最小下标

Python编程:如何找出给定的n个数中的最大值及其对应的最小下标 当需要在一组数字中找到最大值时,Python提供了内置函数 max() 。 但是,如果我们需要找出最大值的同时还需要找出其最小下标,该怎么办呢? 在本文中&#…

初始化命令

创建项目 vue2 vue3 create demo vue3 vue3 create demo vue2 webpack vue2 init webpack demo vue3 vite yarn create vite demo --template vue sass cnpm下载 --save-dev -D 开发环境 --save -S 生产环境 cnpm i node-sass4.14.1 sass-loader7.3.1 --save-…