深入概括VB.NET运行环境

开发 后端
文章主要介绍了VB.NET运行环境,CLR导致的体系,CLR垃圾回收器(CLR Garbage Collector),COM对象等等介绍,希望可以给你带来帮助。

随着时代的变化,信息成为我们不可缺少的一部分,在这发展中我们开发的语言也随之成长,不管应用是用VB、C#还是其他.NET语言编写,所有VS.NET代码都是编译成中间语言(Intermediate Language,IL)。当应用运行时,一个实时编译器(just-in-time compiler,或称为JIT)就把IL代码编译成机器语言。在理论上,它意味着为非Windows的平台构造VB.NET运行环境是可能的,但目前还没有出现有关这类系统的正式消息。IL有一个缺点:正如VB在5.0以前的版本,IL代码对于类似的反向编译工程很敏感。由于存在这种可能性,许多开发者对于.NET框架的整体安全性抱有怀疑。

对CLR进行优化影响IL层次上的代码,它使得所有使用CLR的语言受益。然而,对于特定语言的优化涉及到如何把代码编译成IL代码,它根据特定语言的语法进行。因此,.NET各种语言之间存在一定的性能差异是必然的。但不管如何,从整体上来看这仍旧是好事,例如CLR为VB带来了和C#一样的调试和分析工具——之所以能够如此,是因为它们都使用一样的工具。

CLR提供了前所未有的跨语言集成能力,其中包括跨语言继承代码的能力。所有使用CLR的语言都使用一个公共类型系统(Common Type System),它使得开发那些运用多种语言的应用变得更为容易。在CLR之内运行的代码称为“受管理的代码”(Managed Code),受管理代码所使用的内存由CLR全面控制。受管理的代码有着许多优点,包括交叉语言集成、跨语言异常控制以及一个组件交互的简化模型。VB.NET运行环境只能以受管理代码方式运行,与此相对应,C#却具有将代码转入非受管理方式运行的能力(运行在CLR之外),比如执行指针处理之类的操作。这是VB.NET不能与C#相提并论的地方之一。然而,这种能力的是否重要,对于不同的人、不同的用途来说都有所不同。

由CLR导致的体系上的不同不仅仅是跨语言继承、共享功能和受管理代码,它还有更深刻的意义。Visual Studio.NET的底层体系不再是COM;另外,VB.NET运行环境中所有东西都是对象,甚至连字符串也一样。由于这些原因以及其他许多原因,Microsoft改变了底层体系管理对象的方法。COM系统通过引用计数方式管理对象,每当对象被引用时,引用计数就增加。当对象引用超出作用范围或者被释放时,计数器的值就减少;一旦引用计数为0,对象就被释放。Microsoft声称.NET体系中的引用计数开销实在太大,使得.NET采用引用计数不再合适,因此它就放弃了引用计数,改用垃圾回收(Garbage Collection)。
大约40年前,John McCarthy设计了LISP语言,它是可考证的第一种编程语言。LISP运行时不断地分配和释放大量的小块内存,由于那时的计算机内存远远没有现在这么庞大,因此早期的LISP用户很快感到内存不足,同时许多不再使用的内存却未能利用起来。为了解决这个问题,McCarthy于1959年第一次提出了垃圾回收的思想。
在一个真正面向对象的系统中,垃圾回收机制能够很好地满足分配和释放大量小块内存的需要。因此,Microsoft在VS.NET中重新实现了垃圾回收机制。

CLR垃圾回收器(CLR Garbage Collector)的主要任务就是监视程序使用的资源,当可用资源达到某个确定的极限时查找不再使用的对象,如发现有这类对象存在则释放它们所占用的资源。垃圾回收的一个很大的优点是程序员无需再为大多数常见的循环引用担心。在循环引用情形下,子对象拥有对父对象的引用,同时父对象又拥有对子对象的引用。在引用计数模式下,循环引用阻止了系统释放和拆除任意一个对象。然而,垃圾回收器能够找出这类循环引用并拆除它们。垃圾回收机制同时也意味着,当对象的最后一个引用被释放时,对象并不一定立即被拆除。

采用垃圾回收机制的一个后果是:我们不能再希望类的Terminate事件总是适时触发。事实上,如果线程被阻塞的话,Terminate事件可能完全不会触发。这就是所谓的“非确定的结束”(non-deterministic finalization),而COM提供的则是“确定的结束”。由于缺乏“确定的结束”,再加上因为垃圾回收器重新组织和整理内存导致不能运用指针,新闻组中出现了对该问题激烈的争论:有些人憎恨这些新的限制,因为他们依赖于“确定的结束”;有些人觉得无关紧要,因为他们并不依赖于Terminate事件。

从引用计数转变到垃圾回收仅仅是Visual Studio.NET底层体系不再是COM这一变化的诸多必然结果之一。虽然VB.NET之内仍旧可以使用COM对象,但这些对象必须通过封装(Wrapper)才能访问。任何时候,封装都意味着性能的降低,甚至还有可能导致对象行为的异常。如果要迁移一个大量使用COM对象的工程,你必须认真地进行计划和测试,应用程序的某些部分可能还需要重新构造。

【编辑推荐】

  1. 用实例讲述VB.NET Process类
  2. 简单讲述VB.NET表间拖放
  3. 五分钟学会VB.NET实现拖放
  4. 讲述VB.NET QuickSort函数
  5. 如何掌握强大的VB.NET ReadLine()方法
责任编辑:田树 来源: 华军软件园
相关推荐

2009-10-29 16:23:42

VB.NET实现IEn

2009-10-13 14:50:59

VB.NET Envi

2009-10-26 15:57:07

VB.NET使用Ora

2009-10-14 14:04:29

VB.NET创建Web

2009-10-15 17:50:48

VB.NET Spli

2009-10-14 10:19:57

VB.NET Doma

2009-11-03 10:00:20

VB.NET New方

2009-10-28 10:51:32

VB.NET默认属性

2009-10-14 15:34:29

VB.NET窗体编程模

2009-10-14 13:15:09

VB.NET数据绑定

2009-11-03 10:51:33

VB.NET共享

2009-10-27 11:32:42

VB.NET Disp

2009-10-14 16:46:25

VB.NET OnSt

2009-10-23 14:06:07

VB.NET类对象

2009-11-02 17:49:05

VB.NET抽象类

2009-11-02 09:21:04

VB.NET文件系统

2009-10-28 14:44:43

VB.NET Name

2009-10-28 17:32:25

VB.NET控件介绍

2009-10-29 10:21:46

VB.NET变量适用范

2009-10-13 17:31:50

VB.NET Acce
点赞
收藏

51CTO技术栈公众号