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

一、前言:概念解析

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可以在一定程度上加大学习效率。

四、参考链接:

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

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

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

作者:ProMer_Wang

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

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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐