VB.net ---- 具有不聪明的编译器

淡蓝色2 2005-05-31 01:28:16
从VB.net2002到2003,它的代码编辑器具有了足够的“智能化”,然而,它的编译器却是非常不够聪明。

1.与VB6.0编译器的比较:
请看下面的代码段:
Sub x1()
Dim I As Long, J As Integer, K As Integer
For I = 0 To 50000000
J = J + K
Next
End Sub

这段代码 无须更改,即 可以在VB6.0 又 可以在VB.net中编译通过。
然而它们编译后的运行结果是不同的
启用VB6.0的任何一种优化,你会发现这段代码被VB6.0编译器完全忽略了,计算机根本就不会执行这段代码。理由很充分:这段代码毫无实质性的作用(如果你说它有延时的作用,那我会说用这种方法也够垃圾、蠢笨,延时没这么用的)。

不过,VB.net的编译器则不然,它会把这段代码原封不动地编译。VB.net编译器毫无“垃圾检测”能力。


2.与C#编译器的比较:
请看下面的VB.net代码段:
Sub X()
Dim A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q as Integer
A = B + C
B = A + B
C = A + B
End Sub

等效的C#代码段:
void X(){
int a,b,c,d,e,f,g,h,i,j,k,m,n,o,p,q;
a = 0; b = 0; c = 0;
a = b + c;
b = a + c;
c = a + b;
}

启用所有的优化编译它们,然后用反射器分别查看它们的编译结果,你会发现 VB.net把代码中所有的语句都原封不动地编译了。
而C#编译器则基本上没编译什么代码。理由也很充分:这段代码毫无执行意义。


这个可以理解:VB.net把力气都使到代码编辑上了,而编译器还未受到重视。
热切希望VB.net2005编译器 能够在这方面具有长足的进步。
...全文
263 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snrmnm_sx 2005-06-01
  • 打赏
  • 举报
回复
楼主真是一下细心的人!
luckjon 2005-06-01
  • 打赏
  • 举报
回复
.net的垃圾回收机制会自动回收无用的变量,无须担心这个了
Ninputer 2005-06-01
  • 打赏
  • 举报
回复
不用担心,这些代码到了JIT时还会再经历一次优化,到时候无用代码就不会被JIT
chenzhanyiczy 2005-05-31
  • 打赏
  • 举报
回复
我觉得C#是没有编译那些从没使用过的代码,并不是什么代码都没编译
chenzhanyiczy 2005-05-31
  • 打赏
  • 举报
回复
我想问楼主,你是怎样查看到上面这些代码被编译的?
淡蓝色2 2005-05-31
  • 打赏
  • 举报
回复
楼上的老大 ,应该是"有些人为了 防止 反汇编"吧

您指的是"混淆器"吗?
水如烟 2005-05-31
  • 打赏
  • 举报
回复
呵.听说有些人为了反汇编就是用这种方法的,本来只用一条就OK,偏偏加了几百行的无用代码.
W_W_Q 2005-05-31
  • 打赏
  • 举报
回复
很好,不幸的是明天没钱吃饭了。
zhongwanli 2005-05-31
  • 打赏
  • 举报
回复
^_^ , 楼主有意思
meixiaofeng 2005-05-31
  • 打赏
  • 举报
回复
楼主钻研精神很值得我们学习
daisi 2005-05-31
  • 打赏
  • 举报
回复
上面的楼主们牛,我还没有注意到编译器上面来
exing 2005-05-31
  • 打赏
  • 举报
回复
我对一个帖子中出现这么多的不幸深感同情
淡蓝色2 2005-05-31
  • 打赏
  • 举报
回复
我也很不幸地告诉楼上:
VB.net2005已经支持了 对无用变量的检测。:-)
tiaoci 2005-05-31
  • 打赏
  • 举报
回复
不过非常不幸地告诉楼主,VB.NET2005也是没有什么改进

至少我现在CTP版试下来是如此
ranzige 2005-05-31
  • 打赏
  • 举报
回复
佩服佩服。楼主真牛。
tiaoci 2005-05-31
  • 打赏
  • 举报
回复
的确如此,不过编译器太聪明了也不好
menuvb 2005-05-31
  • 打赏
  • 举报
回复
回复人: wuyazhe(我的宝贝叫阿刺) ( ) 信誉:100 2005-05-31 13:45:00 得分: 0


佩服。楼主的确vb迷


兔子-顾问 2005-05-31
  • 打赏
  • 举报
回复
佩服。楼主的确vb迷
Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。 程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见绌。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual studio中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。
.Net十大必备工具 1. Snippet Compiler Snippet Compiler 是一个基于 Windows 的应用程序,可以通过它来编写、编译和运行代码。如果具有较小的代码段,并且不希望为其创建完整的Visual Studio .NET项目(及伴随该项目的所有文件),该工具将很有用。 2. Microsoft Source Analysis for C#(StyleCop) 微软内部的静态代码检查和代码强制格式美化工具StyleCop的4.2版本Microsoft Source Analysis for C# 。 SourceAnalysis 不是代码格式化工具,而是代码规范检查工具,它不仅检查代码格式,而是编码规范。 3. GhostDoc GhostDoc是Visual Studio的免费插件,可以编写XML格式的注释文档。C#中XML格式的文档注释好处:Visual Studio会显示这些注释内容,还有比如NDoc或微软的文档工具也可以用这些注释生成有良好外观的帮助文件。 4. Sandcastle Sandcastle。这是一个管理类库的文档编译器。它还可通过反射处理汇编源代码,并在代码中使用XML注释生成MSDN形式的文档,这种文档比难以解读的XML更易于理解。 5. Nunit NUnit是一个.NET上的单元测试框架。NUnit 1.x主要是移植JUnit 3.8。从2.0版本开始,NUnit进行了重写和重新设计,使用Attributes代替特定的方法和相应的基类。 6. MyGeneration MyGeneration是一个功能很强大的代码生成工具。通过编写各种类型脚本(C#,VB.Net,JScript,VBScript)的模板,通过数据库的表内容,生成你需要的各种代码。可以用它来生成ORM的实体类,存储过程,SQL语句等。 7. Reflector for .NET Reflector for .NET是一个面向 Microsoft .NET Framework 的免费类浏览器、分析器和DLL反编译器。 8. The Regulator the regulator是很有特色的工具,能使生成和测试正则表达式变得容易。它们在.NET 框架中受到支持。 9. LINQPad LINQ是Language Integrated Query的简称,是集成在.NET编程语言的特性,是编程语言的一个组成部分。 10. NAnt NAnt是基于.NET的生成工具,与版本Visual Studio.NET 不同,它使得你的项目创建生成过程变得容易。

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧