2023-08-22【c#】JIT AOT 内联函数

JIT 与 C#热更 - IT技术 - MSIPO技术圈
C#程序发布时,一定要好好地保护,不然你会后悔的c# 混淆保护编程乐趣的博客-CSDN博客
C#程序采用AOT发布,真的可以避免被反编译?_编程乐趣的博客-CSDN博客

1.AOT(Ahead of time)
预编译,类似宏定义之类的东西。
2.JIT(Just in time)
实时编译
第一次执行->编译成中间字节码
后续执行->直接执行字节码
中间字节码:并非机器码,但是程序执行时仍需动态将字节码转为机器码。

通常区分是否为AOT的标准:看代码在执行之前是否需要编译,只要需要编译,无论编译产物是字节码,还是机器码,都属于AOT。

3.JIT与热更新
资源热更新很容易,Unity的AB包就可以解决。
代码热更新,因为Unity中的c#是编译型语言,Unity在打包后,会将c#编译为一种中间代码,再由Mono虚拟机,编译成汇编代码,这样能支持多平台。它打包后,就变成二进制了,会跟着程序同时启动,无法进行任何修改。

  • LUA热更
    LUA是解释型语言,不需要事先编译成块,而是动态解释执行的,这样LUA和普通的资源没有区别。
  • c#热更
    c#可以在安卓上实现热更,但是苹果不行:因为安卓可以通过c#的语言特性:反射机制,实现动态代码加载从而热更。
    具体做法:频繁更改模块独立出来做成DLL,主模块调用这些DLL,主模块代码不修改,运行时通过反射加载这些DLL就实现了热更。
    但是苹果反射机制有限制,为了安全不允许。
  • c#热更—ILRuntime(过去式)
    ILRuntime项目为基于c#的平台(如unity)提供了一个纯以实现,快速、方便、可靠的【IL运行时】,使得能够在不支持JIT的硬件环境(如ios)能够实现热更新。
    编译原理:把代码分成两个dll文件,启动的时候只启动一个,另一个dll通过反射启动。在每次启动第二个热更的dll时,将第一个dll文件替换掉,来达到一个热更的效果。
  • c#热更—华佗(待研究)

4.内联函数
虽然C#不支持inline关键字,但是JIT支持【自动inline】,即将IL转成真正机器码时,会自动将某些函数进行inline展开,只是条件非常苛刻,网上提到JIT自动进行inline展开的一些选择依据:

1)函数内部有循环语句、catch语句等复杂结构,都不做inline优化。
2)函数体比较长的不做inline优化,只有比较简单的才可能inline优化。(有人说IL不足32字节才做inline),
3)编译成机器码时,inline展开的代码比函数调用更短的,一定做inline。(注:如果参数多而代码少,就符合此情况)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自长亭知乎专栏,实习时小姐姐的约稿,已经不在那边了所以版权不归我哈 笔者一直自认玩过不少游戏,无奈水平太菜,日常...
    hyrathon阅读 1,939评论 0 0
  • 1. Dalvik&ART 1.1 Dalvik Dalvik是Google公司自己设计用于Android平台的虚...
    柴江朋阅读 1,947评论 0 0
  • Dalvik 和 ART Dalvik:Dalvik 虚拟机,android 5.0 以前所使用的虚拟机,可执行文...
    kotlon阅读 1,993评论 0 3
  • 程序主要有两种运行方式:静态编译 与 动态解释 AOT (静态编译) 静态编译的程序在执行前程序会被提前编译为机器...
    一滴矿泉水阅读 1,123评论 0 4
  • 程序主要有两种运行方式:静态编译与动态解释。 1. 静态编译 的程序在执行前全部被翻译为机器码,通常将这种类型称为...
    Lost_Robot阅读 5,708评论 0 2

友情链接更多精彩内容