8. Mono与IL2Cpp简介

发布于:2025-09-06 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.c#的执行过程

2.Mono

3.IL2CPP


1.c#的执行过程

假如我们想让一个外国厨师(电脑cpu)做一道鱼香肉丝, 但cpu厨师只懂一种非常底层的机器语

言, 就像一套固定的手势和简单的指令(比如:,,, 放盐3); 作为程序员, 写的c#

代码就像是用中文写的菜谱

在这里插入图片描述

cpu厨师看不懂中文菜谱, 那就需要一系列的翻译和解释过程; c#代码的执行过程分为三大步: 

编写 -> 编译 -> 执行

1).编写代码

   我们用Visual Studio, Rider等工具(IDE, 集成开发环境)

   写下人类可读的c#代码(中文菜谱)

2).编译代码, 编译代码分为两个小步

   a.编译为中间语言(il/cil)
 
     - 角色登场: c#编译器(Roslyn)

     - 过程: 当我们点击生成或运行时, c#编译器将写的中文菜谱(c#源代码)翻译成中间语

       言il或通用中间语言(cil)的东西

     这一步将我们的中文菜谱翻译成了通用菜谱, 但是cpu厨师还是看不懂的

   b.打包为程序集(Assembly)

     - 编译生成的il代码和相关资源会被打包成一个或多个.dll或.exe, 我们统称它们为程

       序集; 比喻: 将世界通用菜谱语言写成的菜谱书被打包好, 准备送给厨师
3).设备上执行

现在, 打包好的通用菜谱要被送到厨房(设备), cpu厨师终于要上场, 但它还是看不懂通用菜

谱, 这个时候一位至关重要的翻译官出场

a.加载和JIT编译(jit compilation)

  - clr 可以将它想象为整个厨房的环境和总管, .net程序必须在存在clr的环境中才能执行, 

    这个环境就是.net运行时

  - jit编译器是clr的现场翻译官, 它的工作方式如下:

    点菜, 当程序执行到某个方法(比如鱼香肉丝), clr才会把这段方法的il代码交给jit编译

    器; jit编译器(现场翻译官)立刻将这段il代码编译成当前cpu平台能直接理解的原生机器

    码; 执行并缓存, cpu会将拿到翻译好的指令, 立刻开始执行, jit编译器将已经翻译好的

    机器码缓存起来

b.托管执行

  程序在clr的管理下运行, 我们称之为托管执行; CLR这位总管在整个过程中提供了许多强大

  的服务

  - 垃圾回收 (Garbage Collection, GC): 自动帮你收拾厨房,把切完不要的菜梗、用过

    的油碗(不再使用的内存)清理掉,你几乎不用担心“内存泄漏”的问题

  - 类型安全 (Type Safety): 确保厨师不会错把糖当盐放,避免了很多低级错误

  - 异常处理 (Exception Handling): 万一锅着火了(程序出错), 有一套机制来处理,不

    会让整个厨房炸掉

在这里插入图片描述


2.Mono

Mono(虚拟机)是一个跨平台的, 开源的.net framework的实现

在这里插入图片描述

mono的方式处理il, il代码和一个包含jit即时编译器的完整运行时环境会进入我们的包

3.IL2CPP

il2cpp是unity自己开发的一套构建时的后端处理技术(il to cpp)将中间语言(il)转换为

c++代码

在这里插入图片描述

il2cpp的方式处理il, 纯原生机器码 + 一个不包含编译器的精简版运行时支持库

网站公告

今日签到

点亮在社区的每一天
去签到