2008年10月22日星期三

CLR via C#学习笔记(1)--什么是CLR

想想也是惭愧,作为一个自称是.Net平台开发程序员的人,居然没有看过Jeffrey Richter的CLR via C#,估计会被不少程序员笑话吧。

自己的C#入门书籍是Jesse Liberty的Programming C#,那本书我看了得有三遍了吧,呵呵。但那本书只是让我对C#的语法有了一个了解,而直到半年多后的现在,我也仅仅只是在用C#去编程序,而对.Net这个巨大的平台,知道的仅仅是 Understanding .Net 2.0那本书里得到的一个对.Net平台的一个概览,而实质性的东西却知之甚少。怎么说呢,就是知道该怎么做,而不知道为什么这么做。

作为一个打算把.Net作为自己职业方向的程序员,不对.Net平台(而不仅仅只是C#语言)有一个Thoroughly的了解,我认为是远远不够的。怎么也得知其然且知其所以然吧,所以选择了这本据说是.Net程序员必读的Bible一般的CLR via C#,希望以此来提升自己的.Net内功。

既然已经选择了.Net Framework,就有必要来决定使用哪种编程语言了:通常这是个很难的选择,因为不同的语言具有不同的能力。非托管的C/C++可以对系统进行一些非常低级的控制,而Visual Basic可以非常方便的快速生成UI应用程序和控制COM对象和数据库。

公共语言运行库(CLR)这个名称准确的描述了它的作用,它是一个可由多种不同的编程语言来使用的运行库。CLR的特性可由所有面向它的语言来使用。
事实上,在运行的时候,CLR是根本不关心开发人员用哪种语言写的源代码的,也就是说,.Net程序员在挑选编程语言的时候,应该选择最容易表示自己意图的语言。例如,创建一个简单的WinForm应用程序,使用C#或VB要比使用C++方便许多;对于数学或金融应用程序,使用APL语法要比Perl语法表示同样的意图要容易的多。

创建一个.Net程序,首先使用支持CLR的任何语言要编写正确的code,然后使用相应的Compiler来检查语法和分析Source code,Compiler会生成一个Managed module,也就是一个标准的PE32或者是PE32+文件,他们需要CLR才能执行。

本地代码编译器生成的是针对某种特定架构的CPU(例如x86、x64)专用的代码,相反,所有CLR相容的编译器生成的都是Intermediate Language,由于CLR会管理它的执行,IL有时也叫做托管代码。同时编译器还会在每个托管模块中生成元数据,元数据就是一系列特殊的数据表,他们描述了模块中定义的内容,比如类型及其成员。

元数据有很多用途:
1)在编译时,元数据消除了对头和库文件的需求,因为与引用的类型/成员有关的信息都包含在用IL来实现类型/成员的文件中
2)MS Visual Studio通过Intellisense解析元数据,以方便我们编写代码(智能提示)
3)CLR中的代码验证过程使用元数据来保证代码只执行"安全"的操作
4)元数据允许将一个对象的字段序列化到一个内存段中,并将其发送到另一台机器,然后反序列化,在远程机器上重建对象状态
5)元数据允许垃圾收集器跟踪对象的生存期

没有评论: