.NET程序的编译和运行

程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行。下图为传统代码编译运行过程:.NET的编译和运行过程与之类似,首先编写好的源代码,然

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行。

下图为传统代码编译运行过程:

.NET程序的编译和运行

.NET的编译和运行过程与之类似,首先编写好的源代码,然后编译为微软中间语言代码,运行的时候即时编译为本地机器语言,同时.NET代码运行时有一个CLR环境来管理程序。如下图为.NET代码编译运行过程:

.NET程序的编译和运行

下面详细介绍下编译运行时的一些概念。
1.MSIL和JIT
在编译使用.NET 框架创建的代码时,不是立即创建操作系统特定的本机代码,而是把代码编译为微软中间语言(Microsoft Intermediate 
Language,MSIL)代码,这些MSIL代码不专用于任何一种操作系统,也不专用于任何一种语言,有些类似于JAVA的字节码。C#及其他.NET语言,如VB.NET在编译阶段都编译为这种语言。
因为代码在编译阶段没有直接编译成本机代码,所以在执行应用程序时,必须完成更多的工作,这就是Just—In-Time(JIT)编译器的任务。
JIT把MSIL编译为专用于某种操作系统和目标机器结构的本机代码,只有这样,操作系统才能执行应用程序。这里编泽器的名称Just—In—Time,反映了MSIL仅在需要时才编译的特性。
过去,常常需要把代码编译为几个应用程序,每个应用程序用于特定的操作系统和CPU结构,这通常是一种优化形式(例如,为了让代码在AMD芯片上运行将更快),但更多时候是必须的(例如分别运行在Windows和Linux操作系统上)。现在就不必要了,顾名思义,JIT编译器使用MSIL代码,而MSIL代码是独立于机器、操作系统和CPU的。目前有几种JIT编译器,每种编译器都用于不同的结构,我们总能找到一个合适的编译器创建所需的本机代码。这样,用户需要做的工作就比较少了,实际上,用户不必考虑与系统相关的细节,只需要把注意力放在代码的功能上就足够了。

2.程序集
在编译应用程序时,创建的MSIL代码存储在一个程序集中,程序集包括可执行的应用程序文件(这些文件可以直接在Windows上运行,不需要其他程序,其扩展名为.exe)和其他应用程序使用的库(其扩展名是.dll)。

除了包含MSIL外,程序集还包含元数据(即程序集中包含的数据信息)和可选的资源(MSIL使用的其他数据,例如声音和图片文件)。在程序集包含的所有文件中,有一个文件用于保存清单。(清单是元数据部分中一组数据表的集合,其中包含了程序集中一部分文件的名称,描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件)。需要注意的是一个程序集只能一个程序清单。

元数据允许程序集是完全自我描述的,不需要其他信息就可以使用程序集。也就是说,我们不再需要把应用程序所需要的数据添加到系统注册表中,因此,部署应用程序就非常简单了,只需把文件复制到远程计算机中的目录下即可。

当然,不必把运行应用程序所需要的所有信息都安装到一个地方。我们可以编写一些程序集,执行多个应用程序所要求的任务。此时,通常把这些可重用的程序集放在所有应用程序都可以访问的地方。在.NET
框架中,这个地方是“全局程序集高速缓冲存储器”(Global Assembly cache),有相应的工具可以帮助把程序集放在高速缓冲存储器中。

http://hovertree.com/menu/csharp/

3.托管代码

在把代码编译为MSIL,再用JIT编译器把它编译为本机代码后,CLR的任务还没有完全完成。用.NET 
框架编写的代码在执行时是托管的,即CLR管理着应用程序,其方式是管理内存、处理安全性,以及允许进行跨语言调试等。相反,不在CLR控制之下运行的应用程序是非托管的,某些语言如C++可以用于编写这类应用程序,例如,访问操作系统的低级功能。使用C#主要编写在托管环境下运行的代码,它们使用CLR的托管功能,让.NET自己与操作系统进行交互,当然也可以编写在非托管环境下运行的代码,但需要特别标注。托管代码的优点有:1、平台无关性,2、提高性能,3、语言的互操作性。

4.垃圾回收

托管代码最重要的一个功能是垃圾回收(Garbage 
Collection),它可确保应用程序不再使用某些内存时,这些内存就会被完全释放。在.NET推出以前,这项工作主要由程序员负责,代码中的几个简单错误会把大块内存分配到错误的地方,使这些内存神秘失踪。这通常意味着计算机的速度逐渐减慢,最终导致系统崩溃。

.NET无用存储单元收集器会频繁检查计算机内存,从中删除不再需要的内容。它可能一秒钟内会进行上千次的检查,也可能几秒钟检查一次,或者随时进行检查,但可以肯定的是进行了检查。

5.应用程序域

在以前传统的开发中我们都知道,一个应用程序对应一个进程,并为该进程指定虚拟内存,由操作系统来映射实际的物理内存,有效的维护了进程之间的安全性。但另一方面,每一个进程都会消耗一定的系统资源,降低了性能,并且进程间的通信也比较麻烦。
在.Net中推出了一个新的概念:应用程序域(AppDomain)。可以理解成很多应用程序域都可以运行在同一个.NET的进程中,可以降低系统消耗,同时不同的域之间互相隔离,在安全性方面有保障。另外对于同一个进程内不同域之间的通信也相对简单一点。

转自:http://hovertree.com/h/bjaf/i550eyyq.htm

推荐:http://www.cnblogs.com/roucheng/p/3521864.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120593.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号