技术开发 频道

CLR内部有太多太多IL看不到的东西

 【IT168技术文档】

 转载自Jeff Zhao的博客  

    老赵一直建议大家不要倾向于学习IL的原因有二:

 IL能够说明的内容太少,包括大部分.NET“必知必会”。

 IL能够获得的信息从高级语言中也大都可以知道。

 而这篇文章便是希望通过实例来把第1点解释清楚,而第2点则留给下一篇文章来解释。

 在文章开始之前,老赵先要承认两个错误:

 首先,上一篇文章对于“IL”和“汇编”的阐述还有些混淆。在这方面某些朋友给出了一些更确切地说法,IL是一种为.NET平台设计的汇编语言,拥有大量.NET平台中特有的高级特性。而x86汇编等则是与机器码一一对应的文字形式代码。不过为了方便表述,在这一系列文章中,还是以“IL”来指代.NET平台上的中间语言,以“汇编”来指代x86汇编这种和特定CPU平台紧密相关的事物——包括之前那篇文章,其实是在阐述IL和汇编之间的关系和区别,以及该如何对待它们的问题,而并非为IL是否可以被叫做是“汇编”进行争论。

 其次,在第1篇文章发布的时候,现在这篇文章,也就是本系列第2篇的标题是“汇编可以看到太多IL看不到的东西”。不过后来在半夜重读这篇文章,并且仔细整理这篇文章的示例时发现出了一个问题——我并不是在讲汇编,要探索CLR中的各种问题也并不是仅仅靠汇编来发现的。当时写文章的时候谈了太多的IL和汇编,最终把自己的思路也给绕了进去。现已修改,希望没有给朋友们造成误解,抱歉。今后老赵也会尽量避免此类情况发生。

 好了,现在开始继续我们这次的话题。

 既然是讨论IL,自然要讨论IL可以做什么,这样才能够以此得出IL究竟该不该学,如果该学的话有应该怎么学——这话当然是对你,我,他个人来说的,不可一概而论。不过也有一个东西需要了解的,就是IL到底表达出了什么,IL又没有表达出什么东西。

 在这里继续强调一下上文的结论:无论IL是否算是一种“汇编”,都不影响它是一种非常高级的编程语言,拥有各种高级特性,例如泛型、引用类型,值类型,方法属性等等,这些特性才是我们判断的依据,而不是它是否能够被冠上“汇编”的“称号”。简单地说,我们应该看它“能(或不能)做什么”,而不是它“能(或不能)被叫做什么”。以下就通过几个示例来展示一些情况:

 示例一:探究泛型在某些情况下的性能问题

 为了契合本文的内容,也为了说明问题,老赵先举一个例子,那正是在《从汇编入手,探究泛型的性能问题》一文中使用过的例子:

namespace TestConsole

 {

 public class MyArrayList

 {

 public MyArrayList(int length)

 {

 this.m_items = new object[length];

 }

 private object[] m_items;

 public object this[int index]

 {

 [MethodImpl(MethodImplOptions.NoInlining)]

 get

 {

 return this.m_items[index];

 }

 [MethodImpl(MethodImplOptions.NoInlining)]

 set

 {

 this.m_items[index] = value;

 }

 }

 }

 public class MyList<T>

 {

 public MyList(int length)

 {

 this.m_items = new T[length];

 }

 private T[] m_items;

 public T this[int index]

 {

 [MethodImpl(MethodImplOptions.NoInlining)]

 get

 {

 return this.m_items[index];

 }

 [MethodImpl(MethodImplOptions.NoInlining)]

 set

 {

 this.m_items[index] = value;

 }

 }

 }

 class Program

 {

 static void Main(string[] args)

 {

 MyArrayList arrayList = new MyArrayList(1);

 arrayList[0] = arrayList[0] ?? new object();

 MyList<object> list = new MyList<object>(1);

 list[0] = list[0] ?? new object();

 Console.WriteLine("Here comes the testing code.");

 var a = arrayList[0];

 var b = list[0];

 Console.ReadLine();

 }

 }

 }

0
相关文章