IL(.NET 中间语言)是.NET 平台的核心中间语言,贴近底层且基于堆栈操作,语法围绕指令集和方法元数据标记展开,以下是常用语法的核心要点:
一、方法定义的元数据标记(描述方法特性)
用于声明方法的可访问性、行为契约等,类似 C# 中方法的修饰符:
| 类别 | 常用标记 | 含义说明 |
|---|---|---|
| 可访问性 | private/public/assembly(对应 C# internal)/family(对应 C# protected)等 | 控制方法的调用范围(如 public 为公共可调用) |
| 方法契约 | static/virtual/final/abstract | static(静态方法,无实例引用);virtual(虚方法,支持重写);final(不可重写);abstract(抽象方法,无实现) |
| 特殊实现标记 | specialname/pinvokeimpl/synchronized | specialname(方法名特殊,如构造函数 .ctor);pinvokeimpl(P/Invoke 调用非托管代码);synchronized(自动同步,保证多线程安全) |
二、核心指令分类与常用操作码
IL 指令基于堆栈操作(数据通过“栈”传递:指令从栈“弹出”操作数,执行后将结果“压入”栈),主要分为以下类别:
1. 堆栈操作(加载/存储数据到栈)
-
加载常数:
ldc系列,将常数压入栈。- 示例:
ldc.i4.0(加载整数0)、ldc.i4.1(加载整数1)、ldc.r8 3.14(加载双精度浮点数3.14)、ldstr "Hello"(加载字符串"Hello")。
- 示例:
-
加载参数:
ldarg系列,将方法参数压入栈。- 示例:
ldarg.0(加载第 0 个参数)、ldarg.1(加载第 1 个参数)。
- 示例:
-
加载局部变量:
ldloc系列,将局部变量压入栈。- 示例:
ldloc.0(加载第 0 个局部变量)、ldloc.1(加载第 1 个局部变量)。
- 示例:
-
加载字段/对象数据:
ldfld:加载对象的某个字段值到栈(如ldfld 类名::字段名)。ldobj:加载堆中对象的全部数据到栈。
-
存储操作:将栈顶数据弹出并存储。
stloc系列:如stloc.0(将栈顶值存到第 0 个局部变量)。starg系列:将栈顶值存到方法参数。stfld:将栈顶值存到对象的字段(如stfld 类名::字段名)。
2. 数值与逻辑运算
对栈顶数据执行运算,结果再压回栈:
- 算术运算:
add(加)、sub(减)、mul(乘)、div(除)、rem(取模)。 - 比较运算:
ceq(比较是否相等)、cgt(比较是否大于)、clt(比较是否小于)。 - 二进制逻辑:
and(与)、or(或)、not(非)、xor(异或)。
3. 控制流(分支、循环、返回)
控制程序执行流程:
- 无条件跳转:
br(跳转至指定标签)、br.s(短跳转,范围更窄)。 - 条件跳转:
brtrue/brfalse:栈顶为true/false时跳转。beq(相等则跳转)、bne.un(不相等则跳转)、bgt(大于则跳转)、blt(小于则跳转)等。
- 方法返回:
ret(退出方法,栈顶值为返回值;若方法返回void,则栈为空)。
4. 方法调用与对象操作
- 方法调用:
call:调用静态方法(直接指定方法,无虚方法调度)。callvirt:调用实例方法(带虚方法表调度,支持多态)。
- 对象创建与转换:
newobj:创建新对象(调用构造函数,如newobj 类名::.ctor)。box:值类型转引用类型(装箱,如int转object)。unbox:引用类型转值类型(拆箱,如object转int)。
三、语法执行模型
IL 是基于堆栈的语言:指令执行时,会从栈“弹出”操作数,执行运算后将结果“压入”栈。例如,执行 add 时,栈会弹出两个值、相加后将结果压回栈。需注意栈平衡(压入和弹出的次数要匹配),否则会导致运行时错误。
(若需了解“PLC 领域的指令列表(IL)”,其为工业控制的汇编式语法,以“助记符+操作数”控制 PLC 寄存器/IO,如 LD %I1.0(加载输入寄存器值)、OUT %Q1.0(输出到寄存器)等,但结合前序问题,此处重点为 .NET 平台的 IL 语法。)
574

被折叠的 条评论
为什么被折叠?



