返回首页

简介
,在这篇文章中,我们将采取一个共同的中间语言(CIL)的外观,是由各种语言的编译器在Visual Studio 2005生成的。。NET Framework的是什么?
简洁的目的会去回答这个问题的答案如下:。NET框架是一个软件组件,可添加到Microsoft Windows操作系统(虽然有一些能够在这个地方工作在Linux和其他操作系统上运行)。的。NET Framework组成的集合类包含预编码​​解决方案,以常见的编程要求。是在一个管理程序的运行要求的软件环境,中运行的。NET框架开发的应用程序。这被称为公共语言运行库(CLR)的运行时环境。 CLR提供了一个外观应用程序的虚拟机,从而使程序员不需要考虑特定的CPU将执行该程序的功能。 CLR还提供其他重要的服务,如安全保证,内存管理和异常处理。
运行时,也加快了开发人员的生产力。例如,程序员可以在他们选择的开发语言写的应用程序,尚未充分利用的运行库,类库,和其他开发人员用其他语言编写的组件。任何选择以运行库为目标的编译器供应商可以这样做。这一目标的。NET Framework的语言编译器。NET Framework中提供该语言编写的现有代​​码的功能,大大缓解了现有应用程序的迁移过程。。NET Framework的最重要组成部分,是在公共语言基础结构,或CLI。 CLI的目的是提供一个应用程序开发语言无关的平台。为了澄清,CLI是一个规范,而不是实现,往往是与(CLR)的困惑
CLI由5个主要部分:通用类型系统(CTS)通用语言规范(CLS)通用中间语言(CIL)就在即时编译器(JIT)虚拟执行系统(VES)
的所有5个这些部件的详细讨论超出了本文的范围。不过,我觉得以下两个组件需要的一些解释 通用语言规范(CLS) - 是的,微软已经帮助编译器厂商提供的规格设置。这些规范规定的最低组的功能。NET语言必须有。 & #160; 通用中间语言(CIL) - 是最低级的人类可读的通用语言基础结构和NET Framework中的编程语言。语言的目标。NET Framework的编译成字节码,这是组装成CIL。 CIL的类似于面向对象的汇编语言,完全是基于堆栈的。它是由虚拟机执行。 只要在即时编译器(JIT) - (JIT)编译的功能使所有托管代码运行在它的系统上执行的本机语言。同时,内存管理器中删除零碎内存的可能性,以进一步提高性能和增加内存位置的参考。 所有人生而平等。NET语言?
不管。NET编程语言使用,语言编译器的输出是CIL中相同的逻辑表示。在执行程序之前,CIL是编译为目标代码适合的机器上的程序执行。这最后的编译步骤通常是在程序调用的时刻进行的。NET Framework CLR组件,虽然可以手动在早期阶段进行。这个概念
以研究是否有实际上是一个由四个编译器,我在我的Visual Studio 2005版本所提供的四个主要语言开发了四个相同的应用程序(VB.NET,C#,C和J#)编译的CIL的差异。我也跟着在创建应用程序相同的步骤。我Quadrifurcated的应用程序,并投掷了一些不良的生活习惯。我会编译所有这些应用程序,然后看看他们的MSIL编译器。中的应用
我创建控制台应用程序,基本上包含了计时秒表多久的应用程序执行了。应用程序本身基本上包含一个循环,遍历一千倍,串联字符串。结果打印出来字符串串联到控制台,也可以打印出来的时间长短了执行。
我省略StringBuilder类的使用,在所有这些应用,这是故意的,因为这是一个测试,看看StringBuilder类的效率。如果你看了这篇文章,你可以看到StringBuilder类所提供的性能收益。"守则"VB.NET

Imports System.Diagnostics

Module Module1

 Sub Main()

  Dim strSomeString As String = ""

  Dim sw As New Stopwatch

  sw.Start()

  For i As Integer = 0 To 1000

   strSomeString += "Test "

  Next

  sw.Stop()

  Console.WriteLine(strSomeString)

  Console.WriteLine(sw.ElapsedMilliseconds)

  Console.ReadLine()

End Sub

End Module

C#中{C}J#
package ConsoleJSharp;

import System.*;

import System.Diagnostics.*;

public class Program

{

    public static void main(String[] args)

    {

        String strSomeString = "";

        Stopwatch sw = new Stopwatch();

        sw.Start();

        for (int i = 0; i < 1000; i++)

        {

            strSomeString += "Test ";

        }

        sw.Stop();

        Console.WriteLine(strSomeString);

        Console.WriteLine(sw.get_ElapsedMilliseconds());

        Console.ReadLine();

    }

}
彗星
#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;

using namespace System::Diagnostics;



int main(array<System::String ^> ^args)

{

    String^ strSomeString = "";

    Stopwatch^ sw = gcnew Stopwatch;

    sw->Start();

    for (int i = 0;i< 1000 ;i++)

    {

        strSomeString +=  "Test ";

    }

    sw->Stop();

    Console::WriteLine(strSomeString);

    Console::WriteLine(sw->ElapsedMilliseconds);

    Console::ReadLine();

}
编译的CILVB.NET
.method public static void  Main() cil managed

{

    .entrypoint

        .custom instance void

        [mscorlib]

        System.STAThreadAttribute::.ctor()=(01 00 00 00)

            // Code size       83 (0x53)

            .maxstack  2

            .locals init (

            [0] string strSomeString,

            [1] class [System]System.Diagnostics.Stopwatch sw,

            [2] int32 i, [3] int32 VB$CG$t_i4$S0 

            )

IL_0000: nop

IL_0001: ldstr  ""

IL_0006: stloc.0

IL_0007: newobj instance void

         [System]

         System.Diagnostics.Stopwatch::.ctor()

IL_000c: stloc.1

IL_000d: ldloc.1

IL_000e: callvirt instance void

         [System]

         System.Diagnostics.Stopwatch::Start()

IL_0013: nop

IL_0014: ldc.i4.0

IL_0015: stloc.2

IL_0016: ldloc.0

IL_0017: ldstr  "Test "

IL_001c: call   string

             [mscorlib]

             System.String::Concat(string, string)

IL_0021: stloc.0

IL_0022: nop

IL_0023: ldloc.2

IL_0024: ldc.i4.1

IL_0025: add.ovf

IL_0026: stloc.2

IL_0027: ldloc.2

IL_0028: ldc.i4   0x3e8

IL_002d: stloc.3

IL_002e: ldloc.3

IL_002f: ble.s    IL_0016

IL_0031: ldloc.1

IL_0032: callvirt instance void

         [System]

         System.Diagnostics.Stopwatch::Stop()

IL_0037: nop

IL_0038: ldloc.0

IL_0039: call     void

         [mscorlib]

         System.Console::WriteLine(string)

IL_003e: nop

IL_003f: ldloc.1

IL_0040: callvirt instance int64

         [System]

         System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()

IL_0045: call     void

         [mscorlib]

         System.Console::WriteLine(int64)

IL_004a: nop

IL_004b: call     string

         [mscorlib]

         System.Console::ReadLine()

IL_0050: pop

IL_0051: nop

IL_0052:  ret

} // end of method Module1::Main
C#中
.method private hidebysig static void  Main(string[] args) cil managed

{

    .entrypoint

        // Code size       87 (0x57)

        .maxstack  2

        .locals init (

        [0] string strSomeString,

        [1] class [System]System.Diagnostics.Stopwatch sw,

        [2] int32 i,

        [3] bool CS$4$0000 

        )

IL_0000:  nop

IL_0001:  ldstr    ""

IL_0006:  stloc.0

IL_0007:  newobj  instance void

          [System]

          System.Diagnostics.Stopwatch::.ctor()

IL_000c:  stloc.1

IL_000d:  ldloc.1

IL_000e:  callvirt instance void

          [System]

          System.Diagnostics.Stopwatch::Start()

IL_0013:  nop

IL_0014:  ldc.i4.0

IL_0015:  stloc.2

IL_0016:  br.s    IL_002a

IL_0018:  nop

IL_0019:  ldloc.0

IL_001a:  ldstr   "Test "

IL_001f:  call    string 

              [mscorlib]

              System.String::Concat(string,string)

IL_0024:  stloc.0

IL_0025:  nop

IL_0026:  ldloc.2

IL_0027:  ldc.i4.1

IL_0028:  add

IL_0029:  stloc.2

IL_002a:  ldloc.2

IL_002b:  ldc.i4   0x3e8

IL_0030:  clt

IL_0032:  stloc.3

IL_0033:  ldloc.3

IL_0034:  brtrue.s IL_0018

IL_0036:  ldloc.1

IL_0037:  callvirt instance void

          [System]

          System.Diagnostics.Stopwatch::Stop()

IL_003c:  nop

IL_003d:  ldloc.0

IL_003e:  call     void

          [mscorlib]

          System.Console::WriteLine(string)

IL_0043:  nop

IL_0044:  ldloc.1

IL_0045:  callvirt instance int64

          [System]

          System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()

IL_004a:  call  void

          [mscorlib]

          System.Console::WriteLine(int64)

IL_004f:  nop

IL_0050:  call   string

          [mscorlib]

          System.Console::ReadLine()

IL_0055:  pop

IL_0056:  ret

} // end of method Program::Main
J#
.method public hidebysig static void main(string[]args)cil managed

{

    .entrypoint

        // Code size       108 (0x6c)

        .maxstack  2

        .locals init

        (

        [0] string strSomeString,

        [1] class [System]System.Diagnostics.Stopwatch sw,

        [2] int32 i 

        )

IL_0000: ldtoken [vjslib]

    com.ms.vjsharp.lang.ObjectImpl

IL_0005: call    void

         [mscorlib]

         System.Runtime.CompilerServices.

             RuntimeHelpers::RunClassConstructor

             (

             valuetype [mscorlib]System.RuntimeTypeHandle

             )

IL_000a: ldstr  ""

IL_000f: stloc.0

IL_0010: newobj  instance void 

         [System]

         System.Diagnostics.Stopwatch::.ctor()

IL_0015: stloc.1

IL_0016: ldloc.1

IL_0017: callvirt instance void

         [System]

         System.Diagnostics.Stopwatch::Start()

IL_001c:  ldc.i4.0

IL_001d:  stloc.2

IL_001e:  br.s   IL_003f

IL_0020:  newobj instance void

          [vjslib]

          java.lang.StringBuffer::.ctor()

IL_0025:  ldloc.0

IL_0026:  callvirt instance class 

          [vjslib]

          java.lang.StringBuffer

              [vjslib]

              java.lang.StringBuffer::append(string)

IL_002b:  ldstr    "Test "

IL_0030:  callvirt instance class

              [vjslib]

              java.lang.StringBuffer

                  [vjslib]

                  java.lang.StringBuffer::append(string)

IL_0035:  callvirt instance string

          [vjslib]

          java.lang.StringBuffer::ToString()

IL_003a:  stloc.0

IL_003b:  ldloc.2

IL_003c:  ldc.i4.1

IL_003d:  add

IL_003e:  stloc.2

IL_003f:  ldloc.2

IL_0040:  ldc.i4   0x3e8

IL_0045:  blt.s    IL_0020

IL_0047:  ldloc.1

IL_0048:  callvirt instance void

          [System]

          System.Diagnostics.Stopwatch::Stop()

IL_004d: ldloc.0

IL_004e: call      void

         [mscorlib]

         System.Console::WriteLine(string)

IL_0053:  ldloc.1

IL_0054:  callvirt instance int64

          [System]

          System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()

IL_0059:  call  void

          [mscorlib]

          System.Console::WriteLine(int64)

IL_005e:  call   string

          [mscorlib]

          System.Console::ReadLine()

IL_0063:  pop

IL_0064:  call  void

          [vjslib]

          com.ms.vjsharp.util.Utilities::cleanupAfterMainReturns()

IL_0069:  br.s  IL_006b

IL_006b: ret

} // end of method Program::main
彗星
.method assembly static int32  main(string[] args) cil managed

{

    // Code size       83 (0x53)

    .maxstack  2

        .locals (

        [0] class [System]System.Diagnostics.Stopwatch sw,

        [1] string strSomeString,

        [2] int32 i 

        )

IL_0000:  ldnull

IL_0001:  stloc.1

IL_0002:  ldnull

IL_0003:  stloc.0

IL_0004:  ldstr      ""

IL_0009:  stloc.1

IL_000a:  newobj instance void

          [System]

          System.Diagnostics.Stopwatch::.ctor()

IL_000f:  stloc.0

IL_0010:  ldloc.0

IL_0011:  call    instance void

          [System]

          System.Diagnostics.Stopwatch::Start()

IL_0016:  ldc.i4.0

IL_0017:  stloc.2

IL_0018:  br.s       IL_001e

IL_001a:  ldloc.2

IL_001b:  ldc.i4.1

IL_001c:  add

IL_001d:  stloc.2

IL_001e:  ldloc.2

IL_001f:  ldc.i4     0x3e8

IL_0024:  bge.s      IL_0034

IL_0026:  ldloc.1

IL_0027:  ldstr   "Test "

IL_002c:  call     string

              [mscorlib]

              System.String::Concat

                  (

                  string,

                  string

                  )

IL_0031:  stloc.1

IL_0032:  br.s       IL_001a

IL_0034:  ldloc.0

IL_0035:  call   instance void

          [System]

          System.Diagnostics.Stopwatch::Stop()

IL_003a:  ldloc.1

IL_003b:  call   void

          [mscorlib]

          System.Console::WriteLine(string)

IL_0040:  ldloc.0

IL_0041:  call   instance int64

          [System]

          System.Diagnostics.Stopwatch::get_ElapsedMilliseconds()

IL_0046:  call    void

          [mscorlib]

          System.Console::WriteLine(int64)

IL_004b:  call   string

          [mscorlib]

          System.Console::ReadLine()

IL_0050:  pop

IL_0051:  ldc.i4.0

IL_0052:  ret

} // end of method 'Global Functions'::main
要注意的事项有细微的差别,尤其是在每个代码段开始,在各种编译器所产生的的输出。 VB和C#的CIL看起来非常相似。 我已经把编译器如何宣布大胆的方法开始在所有局部变量 VB控制台向导生成一个模块,而不是类 为什么VB生成一个模块?
有VB开发者社区内很多讨论是否模块是面向对象编程(OOP)方法。它是一种常见的误解,是一个随身携带的模块从VB6因此应不惜一切代价避免。虽然对这个热门话题的完整讨论不在本文的讨论范围,我会指出,在VB.NET模块的确是面向对象的。你应该考虑的一个模块,作为一种特殊的类类型,不能用于创建对象。它只能包含共享的成员,它不能包含实例成员。虽然每一个模块的成员是隐式共享,你会遇到一个编译时错误,如果你添加到任何一个Shared关键字。模块没有在其他语言不存在,那么是什么使得VB中如此特别?
NET 2.0的C#语言中的令人振奋的新的增加,除了静态类。静态类和类成员用于创建,而无需创建类的实例可以访问的数据和功能。静态类成员可以使用单独的数据和行为是独立于任何对象标识的数据和功能没有改变,无论对象发生了什么。没有数据或依赖对象的身份在类的行为时,可以使用静态类。因此,静态类可以被认为是C#的回答VB的卑微模块。Whats错误代码?
,虽然这段代码乍一看看起来相当的最佳运作和代码可以编译不抛出各自的编译器,任何讨厌的错误。代码在本质上不是真正的基于。NET代码。如果你要运行的代码的人会发现,简单的字符串连接例程可以采取任何地方在10 - 44 ms(毫秒)来完成,不论你选择什么样的语言来运行。可以这样优化,你可以看到其他什么问题?
{A}我将举例说明怎么连一个像这样的简单的应用程序可以优化。来源
对于一些我的文章的背景资料,我用从Wikipedia上获得的。NET Framework的一些信息。历史06年6月10日初稿第1部分 06年9月10日小幅更新,以提高格式和更改标题06年10月10日更新一些更多的背景资料

回答

评论会员:immetoz 时间:2011/12/07
垃圾邮件删除
评论会员:GLLNS 时间:2011/12/07
。NET的静态分析有兴趣的乡亲应该有一个工具NDepend的一目了然:
http://www.NDepend.com

NDepend的分析源代码。NET程序集。它允许控制的复杂性,内部的依赖。NET代码的质量。

NDepend的提供了一个专门查询和约束的代码库的语言(CQL代码查询语言)。

它还配备先进的代码可视化(依赖性,公制TreeMap中,框和箭头图矩阵...), 60多个指标,生成报告和建设的主流技术和开发工具相结合的设施。

NDepend的也可以让你的代码比较精确的不同版本。

帕特里克Smacchia
MVP.NET
作者
作者:

| cykophysh39
评论会员:!请不要垃圾在这里 时间:2011/12/07
哈罗德班福德
评论会员:游客 时间:2011/12/07
帕特里克SmacchiaMVP.NET写道:乡亲感兴趣NET的静态分析,应该一目了然。工具NDepend的:http://www.NDepend.comNDepend的免费吗?否则,我在这里看到illecit的广告...{S0}imgsrc=http://www.orcode.com/upimg/2011_12_07_02_52_15_1.gif如果主神全能者开始后,创作之前曾征询我,我会建议简单的东西。-阿方索的智者,13世纪卡斯提尔王这是怎么回事我的傲慢假设。您可能有一个极好的原因,我完全错了。 -伊恩克拉克imgsrc=http://www.orcode.com/upimg/2011_12_07_02_51_55_4.gif
cykophysh39
评论会员:游客 时间:2011/12/07
我有更新,以文章的格式,它出现在页面上整齐我希望的代码仍然清晰可辨。我也做了一些重大改建的文章,我希望你能够按照我thouhgt列车,我仍然对这篇文章的工作,我居然发现相当intresting自己的文章和我做一些更多的研究主题。如果您有任何疑问,请让我知道。的问候,加里"傻瓜,不会从一个聪明的人学习,但一个聪明的人,将学习从傻瓜""这是很难失败,但从来没有尝试成功更是雪上加霜。"-西奥多罗斯福"成功是从失败到失败,而不会失去你的热情。"-温斯顿丘吉尔我的网站||{A5}
cykophysh39
评论会员:游客 时间:2011/12/07
如果这篇文章是现在只能和你永远不希望它是研究在未来任何人,然后"无聊导致这"是一个好的标题,语言比较没有搜索匹配。程序执行的时间没有搜索匹配的标题。大会上没有查询,等等,等等即使有人搜索文章的机构,有多少要打开和细读"无聊导致这个"看它是否匹配?你这里有一些好东西,但我看不到,我怎么会不断在将来找到这篇文章。你呢?如果你把别人提供(如格式)和重新标题,你可能会更好的评估(评价)。建议好运气。
cykophysh39
评论会员:游客 时间:2011/12/07
感谢老兄,我什至没有想到这个项目的寿命!本文开始只是解闷,我没有想到有人会intrested,但我实际上从这个比我的其他所有结合的文章,更多的响应,哪一种使我重新evluate的整体风格的文章。我会更新今晚!感谢您的反馈,所有反馈衷心感谢。"傻瓜,不会从一个聪明的人学习,但一个聪明的人,将学习从傻瓜""这是很难失败,但从来没有尝试成功更是雪上加霜。"-西奥多罗斯福"成功是从失败到失败,而不会失去你的热情。"-温斯顿丘吉尔我的网站||{A5}
阿美族酒吧
评论会员:游客 时间:2011/12/07
请检查格式,我无法度过一天滚动网球比赛文章!2错误。编译...65534错误。{S2}
cykophysh39
评论会员:游客 时间:2011/12/07
A.哥们,你应该考虑使用Opera浏览器。B.我感到我能做些什么代码项目的样式表"傻瓜,不会从一个聪明的人学习,但一个聪明的人,将学习从傻瓜""这是很难失败,但从来没有尝试成功更是雪上加霜。"-西奥多罗斯福"成功是从失败到失败,而不会失去你的热情。"-温斯顿丘吉尔我的网站||{A5}
cykophysh39
评论会员:游客 时间:2011/12/07
??哥们,你应该学习一些关于一个命名的东西,Äúnetiquette本网站,Äúopera浏览器吗?任何人。如果您将LT;pregt;块表中,你应该照顾自己的线的长度(它,AOS的HTML标准,而不是我)。,Äôre除非你写的歌剧只有用户文章,你不该,AOT依赖于特定的浏览器功能使用户能够读取。,AOS不是一个样式表的问题,AOS在预格式化块长行代码的问题。你,Äôve没有回答。你刚才侮辱了我。2错误。编译...65534错误。{S2}
Mivano
评论会员:游客 时间:2011/12/07
!那么你也应该学会"网络礼仪"自己花花公子当您启动aggresively,不感到惊讶,当你得到积极的答复。无论如何,我已经回答了我的文章做一些更多的格式!"傻瓜,不会从一个聪明的人学习,但一个聪明的人,将学习从傻瓜""这是很难失败,但从来没有尝试成功更是雪上加霜。"-西奥多罗斯福"成功是从失败到失败,而不会失去你的热情。"-温斯顿丘吉尔我的网站||{A5}
cykophysh39
评论会员:游客 时间:2011/12/07
嗨,我看了看源代码,似乎除了VB的所有语言有1000次迭代,VB1001。您在VB中看到的add.ovf由于FIR是因为编译标志。我只是比较VB和C#项目设置。在VB中打开项目设置到编译选项卡#1488;高级编译器设置。顶部的复选框指示移除整数溢出检查。默认情况下是不检查。在C#中打开项目设置去"构建"标签上#1488;高级??第一个复选框显示检查算术溢出/undeflow。默认情况下是不检查。我不,AOT为C和J#,但是这就是为什么你的MSIL差异。您仍然可以争论为什么默认值是不同的。阿美