.NET CIL系列第二篇:入栈和出栈——CIL基于栈的本质

在上一篇.NET CIL第一篇:CIL介绍和入门中我们简要介绍了CIL编程的本质,和学习CIL编程的价值。还介绍了CIL的指令、特性和操作码。接下来的文字中会频繁出现:指令、特性、操作码这些关键字。所以请确定你已经知道它们的含义了。

入栈和出栈:CIL基于栈的本质

像C#这样的高级.NET语言,总是试图尽量隐藏底层的实现。.NET开发一个不太为人注意的方面就是CIL实际上是一个完全以栈为基础的开发语言。回忆我们熟悉的System.Collections命名空间中的Stack类型的功能,它被用于压一个值入栈,同时也能将栈顶的值弹出以供使用。当然,CIL开发人员不是使用System.Collection.Stack来实现入栈和出栈的,不过从思路上是相通的。

正式地说,在CIL中用来负责这个栈实现的部分叫做虚拟执行栈(virtual execution stack)。从下面的介绍中,你将看到CIL提供了一系列操作码来完成压入值到这个栈中,这个过程的术语叫加载(load)。同时,CIL也定义了一系列操作码来将栈顶的值移到内存中(例如局部变量),这个过程的术语叫存储(store)。

CIL不允许直接访问一个数据,包括局部变量、方法中传入的变量或者类型的字段数据。为了实现访问,必须显示地加载数据到栈中,并在使用时弹出。请留心这一点,因为这能够解释为什么CIL代码看起来有些冗余。

下面通过一段简单的没有参数和返回值的函数PrintMessage(),来理解CIL是如何应用栈这个模型的。在实现这个方法时,我们只将一个局部的字符串变量输出到标准的输出流。

public void PrintMessage()

{

    string myMessage = "Hello";

    Console.WriteLine(myMessage);

}

时间: 2024-10-30 04:22:05

.NET CIL系列第二篇:入栈和出栈——CIL基于栈的本质的相关文章

BOM系列第二篇之定时器requestAnimationFrame_javascript技巧

引入 计时器一直是javascript动画的核心技术.而编写动画循环的关键是要知道延迟时间多长合适.一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅:另一方面,循环间隔还要足够长,这样才能确保浏览器有能力渲染产生的变化 大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次.大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升.因此,最平滑动画的最佳循环间隔是lOOOms/60,约等于16.6ms 而setTimeout和

.NET CIL系列第一篇:CIL介绍和入门

CIL编程的本质 CIL是英文Common Intermediate Language的简写.CIL本质上其实就是.NET平台的母语.当开发人员选择一种托管的编程语言(C#.VB.COBOL.NET等)构建.NET程序集时,同这个语言相关的编译器就会把源代码编译成CIL.正如其他任何一种编程语言一样,CIL提供了非常多的结构和实现标记.如果考虑到CIL其实也是一种.NET的编程语言,那么通过直接使用.NET Framework 3.5 SDK提供的CIL和CIL编译器(ilasm.exe)来开发

.NET CIL系列第三篇:正反向工程

介绍了CIL的基础知识之后,现在来研究CIL编程的实际使用,我们从正反向工程开始讨论. 正反向工程 大家已经知道可以使用ildasm.exe来查看由C#编译器生成的CIL代码(参见.NET CIL系列第一篇:CIL介绍和入门),不过也许不知道ildasm.exe还允许将加载到ildasm.exe的程序集中的CIL都导出到一个外部文件中.一旦有了CIL代码,就可以使用CIL编译器ilasm.exe任意编辑或重新编译代码. 说明:reflector.exe可以用于查看某个程序集的CIL代码,也可以把

深入理解javascript作用域第二篇之词法作用域和动态作用域_javascript技巧

前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇--词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元.这个概念是理解词法作用域

BOM系列第一篇之定时器setTimeout和setInterval_javascript技巧

setTimeout() setTimeout()方法用来指定某个函数或字符串在指定的毫秒数之后执行.它返回一个整数,表示定时器的编号,这个值可以传递给clearTimeout()用于取消这个函数的执行 以下代码中,控制台先输出0,大概过1000ms即1s后,输出定时器setTimeout()方法的返回值1 var Timer = setTimeout(function(){ console.log(Timer); },1000); console.log(0); 也可以写成字符串参数的形式,由

CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig

本文讲的是CoreOS Fest 系列之第二篇: Systemd.Go.Calico.Sysdig,[编者的话]在 CoreOS Fest 第二天的会议中,演讲者展示了多个开源项目和工具,包括 Systemd 和 CoreOS . Go 语言和容器. Calico 项目. Sysdig 等. 在 CoreOS Fest 的第一天会议中,陆续介绍了 CoreOS 的架构.规划和规范.第二天的会议,演讲者展示了多个开源项目和工具,包括 systemd-nspawn . Calico 项目和 Sysd

SQL Server调优系列基础篇(常用运算符总结)

原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL Server数据库系统中是如何分解执行的,数据结果如何通过各个运算符组织形成的. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.数据连接 数据连接是我们在写T-SQL语

SQL Server-字字珠玑,一纸详文,完全理解SERIALIZABLE最高隔离级别(基础系列收尾篇)

前言 对于上述锁其实是一个老生常谈的话题了,但是我们是否能够很明确的知道在什么情况下会存在上述各种锁类型呢,本节作为SQL Server系列末篇我们 来详细讲解下. Range-Lock 上述关于RangeS-U.RangeS-S.RnageX-X以及还有RangeI-N这四种锁属于范围锁(Range-Lock)范畴.那么在什么情况下会存在范围锁呢,当在SERIALIZABLE最高隔离级别时范围锁将会被用到,这也就意味着直到事务开启到结束查询出的结果集是一致的以此来防止幻影.在该隔离级别中锁定的

奥巴马在美国国会发表了上任以来的第二篇国情咨文

今年1月25日,美国总统奥巴马在美国国会发表了上任以来的第二篇国情咨文.奥巴马一个小时的演讲中,"赢得未来"成为高频率出现的主题词.他提出,赢得未来的第三步是"重建美国基础设施",其中最重要的是要在未来5年内向98%的美国人提供下一代高速互联网. 而在2月3日,互联网域名管理机构(ICANN)于美国迈阿密宣布:IPv4地址库已经告罄,这是世界互联网的重大历史事件.也意味着新一代互联网进入了加快建造的时代,由此更需要从全球互联网的顶端高度理解新的IPv6地址模式所带来