CIL 01: Common Language Infrastructure#

大家好,我将会在未来发布一系列关于 CIL (Common Intermediate Language) 的讨论内容。我们将从 C# 语言的视角出发,逐步揭示 CLI 高级语言的运行秘密,并最终与大家共同掌握对 CIL 的基础读写能力。

作为前言,本文将首先讨论 CLI 及其定义。

什么是 CLI?#

CLI (Common Language Infrastructure) 即通用语言基础架构,是由 ECMA-335 定义的一套技术规范。

其旨在构建一个能运行多种高级语言所编写应用程序的环境,并确保无需针对特定平台重写代码,即可在各种不同的系统环境中运行。

目前较知名的 CLI 语言包括:

  • C#
  • F#
  • C++/CLI
  • PowerShell

CLI 的基础架构部分定义了三个核心组件:

  1. CLS (Common Language Specification):通用语言规范
  2. CTS (Common Type System):通用类型系统
  3. VES (Virtual Execution System):虚拟执行系统

事实上,遵循 CLI 这套标准的高级语言,通常会被编译为名为 CIL 的低级汇编语言,并被 VES 处理——无论是解释执行,还是生成目标平台的 Native 代码。

下面我们会更详细地介绍 CLI 的架构与工作细节。


1. CLS (Common Language Specification)#

作为一套规则集合,CLS 是为了语言互操作性而设计的。标准地说,CLS 定义了 CLI 语言互操作时的“安全子集”。

如果你的代码遵守 CLS 规则,那么任何符合 CLS 标准的语言都能调用你的代码。

想象一下,有些 CLI 语言支持指针或者无符号整数,而另一些不支持。一个安全子集则能描述它们安全互操作时的最小接口

请注意 CLS 的适用范围: CLS 规则并不要求你的所有代码都必须遵守,它只约束 “对外公开” 的部分。这意味着你可以在实现内部使用任何疯狂的特性,只要它们不被暴露出来。


2. CTS (Common Type System)#

CLI 支持多种编程范式,包括过程式、面向对象和函数式语言,它们都被 CTS 所支持。

CTS 将数据实体分为两类:ValuesObjects

Value (值)#

Value 采用简单的 bit pattern(位模式),主要用于表示整数、浮点数或者布尔值这样的基础数据类型。我们可以通过它们的类型直接描述:

  • 它所占的内存空间
  • 这些 bit 的含义
  • 它们可以执行的操作

Object (对象)#

Object 则是比 Value 更复杂的实体,它具有三个显著特征:

  1. 自描述性 (Self-describing) 这意味着它的类型被显式地存储在它自身的内部表示中。
  2. 具有身份 (Identity) 每个对象都有一个唯一的、永恒不变的 identity。这意味着即使两个 Object 存储的数据完全相同,它们也是不同的。
    • 注:熟悉 C# 的读者可能会想到 GetHashCode。ECMA-335 (CLI) 是一套标准,每个语言或实现都可以有独特的实现。你可以把 GetHashCode 当作是 C# 对 CTS 定义的 identity 的一种实现(且通常依赖 readonly Field 保持不变)。
  3. 具有槽 (Slots) 槽中存放着其他实体 (Value or Object)。你可以把它当作 C# Class 或者 Struct 的 Field。

此外,作为现代编程语言,CTS 也支持泛型(可以理解为一阶类型构造器的某种受限形式),并支持泛型的变体,包括逆变协变


3. VES (Virtual Execution System)#

也许你听说过 CLR (Common Language Runtime) 或者 CoreCLR,它们其实就是 VES 的某种具体实现(就像 Mono 与 CLI 的关系一样)。

VES 负责加载和运行托管代码 (Managed Code)。作为抽象代码和硬件之间的中间层,VES 替语言使用者默默处理着:

  • 内存分配
  • 垃圾回收
  • 线程安全

工作流程简述:

  1. 高级语言编译器(如 C# 的 Roslyn)将源代码编译为 CIL
  2. VES 负责执行 CIL。例如使用 RyuJIT 将 CIL 翻译成目标平台的 Native 代码。

你可以将 VES 看作一个基于堆栈的虚拟机,而 CIL 则是这个虚拟机的汇编语言。VES 还内置了数据类型支持、控制流结构和异常处理模型。


4. CIL (Common Intermediate Language)#

最后,让我们回到主角——CIL。

CIL 是基于栈的、面向对象的中间语言二进制指令集(它也曾被称为 MSIL)。在未来的文章/视频中,我将详细介绍 CIL 指令集的具体内容,这也是本系列的重头戏。

现在,想必你已经足够了解 CLI 了。


关注与交流#

如果你对我的内容感兴趣,欢迎加入讨论或关注我的个人网站:

参考资料#

comments powered by Disqus