ASP.NET vs ASP—编译与解释的区别
ASP.NET在技术上没有叫做ASP 4.0,但从许多方面来讲,它就是ASP 4.0版本。我们可以从下面的两个例子看出.aspx文件与.asp文件的相似之处:
例程1:ASPX页面示例
<!--File:test.aspx-->
<%@ Page language=’C#’ %>
<script runat=server>
int Add(int x, int y)
{
return x+y;
}
</script>
<html>
<body>
<table border=1>
<tr>
<td>两数之和为:</td><td><%=Add(2,3)%></td>
</tr>
</table>
</body>
</html>
例程2:ASP页面示例
<!--File:test.asp-->
<%@ language=Jscript%>
<script language=’JScript’ runat=server>
function Add(x,y)
{
return x+y;
}
</script>
<html>
<body>
<table border=1>
<tr>
<td>两数之和为:</td><td><%=Add(2,3)%></td>
</tr>
</table>
</body>
</html>
以上两个例程的<html></html>里的代码是相同的,不同的是 <%%>声明使用的语言。两段代码都是在服务器端运行,但是,当访问这两个文件时,其背后所发生的事情却截然不同。我们先来分析test.asp文件的运行机制,当执行test.asp文件时,服务器对网页中的文本要进行线性解析,提取所有不是服务器端脚本的内容并作为响应返回,而网页中的服务器端脚本(我们在test.asp文件的脚本中加入了runat=server属性)首先要通过Jscript解释器来解析执行,执行结果作为响应返回。所以,.ASP文件的运行机制在几个方面影响了网页生成(也就是我们平时所说的程序运行)速度变慢。影响.ASP网页效率的几个方面是:首先,随机解释服务器端脚本比在服务器上执行预编译的代码效率更低,因此,要对ASP应用程序进行优化,比较通用的方法就是将大量的服务器端脚本移入预编译的COM组件中,这样就可以有效的提高网页的响应速度;第一的方面是,由于要不断地调用解释器,混合使用静态的HTML和服务器端求值语句脚本块比只用一个服务器端脚本块的效率更低,因此,为了提高应用程序的执行效率,有些ASP开发人员通常使用Response.Write()调用取代静态的HTML元素。最终导致了一个ASP页面上使用多种脚本语言来编写从而大大降低了应用程序的执行效率。现在,我们再来分析一下test.aspx文件的运行机制,在该例中使用c#语言来编写的脚本,所以在服务器端CLR使用相应的C#编译器把这些代码编译成一种叫做IL汇编语言并保存到程序集中。使用CLR,无论你使用何种语言(C#、VB.NET、Jscript 等)编写的脚本,最终都被编译成IL汇编语言。
程序集中既包括服务器端代码又包括静态HTML语句,因此,只要第一次访问了某个.ASPX页面,以后生成该页面时只需执行已编译好的代码即可。就是ASP.NET网页最终都被编译成.NET类(.NET框架中组件也叫做类),所以,在一个.aspx文件中不可能使用多种服务器端语言,这样就解决了传统的ASP脚本模型的所有有关效率低的问题。所以说,ASP.NET是ASP的升级版本。
与解释模型相比,使用编译模型还有其他方面的好处:1、在性能方面编译模型优于解释模型。因为,编译器将网页编译成类(组件),这样就可以用桌面应用程序或组件开发者使用的同样的调试工具进行调试。2、便于应用程序在编译时可以发现错误,这样就可以使应用程序的健壮性大大增强。3、.NET应用程序开发者可以使用的所有工具,.aspx开发者同样可以使用。总而言之,从传统的ASP过度到ASP.NET,是在程序的性能、速度等方面的革命性的改进。