基础拾遗---CLR
基础拾遗
前言
clr(公共语言运行时)
一个可由多种编程语言使用的"运行时",它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR的核心功能(内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。所以只要面向clr我们可以运用任何语言,这就告诉我们我们可以根据自己的需求用最合适的编程语言。
我们不管用什么变成语言总之会编写相关的源代码,那么不同的开发语言都会有不同的源文件,这些不同的源文件都会选择不同的编辑器但最终他们都是托管模块。如图是其过程与托管模块的:(ps:图片来源于CLR via C#)
继续向下以上托模块可合并成程序集,其实clr 就是和程序集进行工作的而非托管模块。我们可以理解为由一或者多个模块/资源文件的逻辑性组合。程序集是重用、安全性以及版本控制的最小单元。在CLR世界中,程序集相当于“组件”如图可以看出一些托管模块 与 一些资源文件 交给一个工具处理,生成一个PE32(+)文件,这些托管模块与资源文件合并到了一起,并多了一个清单(清单的作用类似于元数据对托管代码的作用)。程序集同时包含 元数据与IL。
元数据
IL代码由面向CLR的编译器产生,但它并不是编译器产生的提供给运行时仅有的东西。编译器同样产生有关原始代码的元数据。它提供给CLR关于代码更多的东西,例如:各种类型的定义、各种类型成员的签名以及其他数据。基本上,元数据是类型库、注册表内容和其它用于COM的信息。尽管如此,元数据还是直接和执行代码合并在一起,并不处在 隔离的位置。简单地说,它实现了编程语言、类型和对象的无缝集成。
IL的概念
IL是独立于CPU且面向对象的指令集。.NET平台将其之上的语言全都编译成符合CLS(公共语言规范)的IL指令集,接着再由不同的编译器翻译成本地代码,比如我们常见的JIT编译器,如果在Mac上运行C#可通过Mac上的特定编译器来将IL翻译成Mac系统能够执行的机器码。也就是说IL正如它的名字一样是作为一种中间语言来执行动态程序,比如我们调用一个方法表中的方法,这个方法会指向一个触发JIT编译器地址和方法对应的IL地址,于是JIT编译器便将这个方法指向的IL编译成本地代码。生成本地代码后这个方法将会有一条引用指向本地代码首地址,这样下次调用这个方法的时候将直接执行指向的本地代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!