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

news/2024/11/23 0:59:21/

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.ppmy.cn/news/477491.html

相关文章

C11 std::function 学习

此文, https://blog.csdn.net/bcbobo21cn/article/details/111658249 使用了一次C11 std::function,是作为函数指针使用的; 进一步的来说,C11的std::function可以对任何可以调用的目标实体进行调用操作; std::functi…

2019年哪些手机值得期待?

2019年哪些手机值得期待? 1.ipone11 苹果2019年要发布的三款新手机,预计在2019年9月份发布会上发布iphone11。此前,苹果刚刚解决棘手的5G芯片问题,而关于今年的新款iphone外观也是大家关注的重点。 亮点1 提升信号表现 苹果改进i…

2019年5G手机大爆发:目前已有9款,哪款最值得入手?

2019年才过了不到四分之一,没想到已经涌现出了一批5G手机。之前我们更多和大家谈论的是,5G手机有没有在今年入手的必要。毕竟截止目前5G网络仍未在国内正式商用,要等到5G手机真正普及还得到2020年以后。 尽管如此,相信还是有不少…

JWT入门指南

1、Token认证 随着 Restful API、微服务的兴起,基于 Token 的认证现在已经越来越普遍。基于token的用户认证是一种服务端无状态的认证方式,所谓服务端无状态指的token本身包含登录用户所有的相关数据,而客户端在认证后的每次请求都会携带toke…

在坦桑尼亚如何打国际长途,打给你中国的朋友?

只要你充值了,就可以直接打回 国内任何电话 当然要在号码前加拨 “ 86”例如拨号132********就拨“86132********” 座机 如010******** 就拨8610*********不要拨座机区号前面的0 就可以了,发信息也是一样的。 记得要拨一个“”号,要不,联系不…

国内用户访问国内服务器,国外用户访问国外服务器

1、域名智能解析 通过来源,来解析访问服务器 添加记录值页面进行操作 2、域名判断 每个项目国内外配置域名,判断ip地址,访问不同域名。来达到效果 3、dns 在全局流量管理中,点击创建进行配置访问策略

php 验证座机,验证国内手机号与座机号的正则表达式

这次给大家带来验证国内手机号与座机号的正则表达式,验证国内手机号与座机号的正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。验证手机号:^((13[0-9])|(14[7])|(15[^4,\\D])|(18[0,0-9])|(17[0,0-9]))\\d{8}$ 验证座机和手机号…

国际和国内电话区号

精选30云产品,助力企业轻松上云!>>> https://baike.baidu.com/item/%E5%8C%BA%E5%8F%B7/1866086 https://zh.wikipedia.org/wiki/%E7%94%B5%E8%AF%9D%E5%8C%BA%E5%8F%B7 https://zh.wikipedia.org/wiki/%E5%9B%BD%E9%99%85%E7%94%B5%E8%AF%9D…