仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 901|回复: 10
打印 上一主题 下一主题

[学习教程] ASP.NET编程:[你必需晓得的.NET]第十三回:从Hello, world入手下手熟悉IL仓酷云

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
呵呵,那你就关注微软的招聘信息以及别人的招聘经验啊,还有也不一定去做技术的,你如果真的想去就多了解了解。(其实我的意思是说想到微软做技术是很不容易的。系列文章目次索引:《你必需晓得的.NET
本文将先容以下内容:


  • IL代码剖析办法
  • Hello,world汗青
  • .NET进修办法论

<br>

1.弁言
1988年BrianW.Kernighan和DennisM.Ritchie合著了软件史上的典范巨著《TheCprogrammingLanguage》,我保举一切的程序人都无机会重温这本汗青上的典范之作。从当时起,Hello,world示例就作为了几近一切理论型程序计划书本的开篇代码,一向持续至今,除表达对伟人与汗青的尊敬,本文也以Hello,world示例作为我们扣开IL言语的出发点,入手下手我们循规蹈矩的IL熟悉之旅。
2.从Hello,world入手下手
起首,固然是展现我们的Hello,world代码,入手下手一段无益的分享。
usingSystem;
usingSystem.Data;

publicclassHelloWorld
{
publicstaticvoidMain()
{
Console.WriteLine("Hello,world.");
}
}这段代码实行了最复杂的历程,向生疏的天下打了一个召唤,那末运转在初级言语面前原形又是甚么呢,上面入手下手我们基于上述示例的IL代码剖析。
3.IL体验中央
对编译后的可实行文件HelloWorld.exe使用ILDasm.exe反编译工具,复原HelloWorld的为文本MSIL编码,至于其事情道理我们希冀在系列的后续文章中做以交卸,我们检察其截图为:


<br>由上图可知,编译后的IL布局中,包括了MANIFEST和HelloWorld类,个中MANIFEST是个附加信息列表,次要包括了程序集的一些属性,比方程序集称号、版本号、哈希算法、程序集模块等,和对内部援用程序集的援用项;而HelloWorld类则是我们上面先容的配角。
3.1MANIFEST清单剖析
翻开MANIFEST清单,我们能够看到

<br>
从这段IL代码中,我们的剖析以下:


  • .assembly指令用于界说编译方针大概加载内部库。在IL清单中可见,.assemblyexternmscorlib暗示内部加载了内部中心库mscorlib,而.assemblyHelloWorld则暗示了界说的编译方针。值得注重的是,.assembly将只显现程序中实践使用到的程序集列表,而关于到场using援用的程序集,假如并未在程序中援用,则编译器会疏忽多加载的程序集,比方System.Data将被疏忽,如许就无效制止了过分加载引发的代码收缩。
  • 我们晓得mscorlib.dll程序集界说managedcode依附的中心数据范例,属于必需加载项。比方接上去要剖析的.ctor指令暗示机关函数,从代码中我们晓得没无为HelloWord类供应任何显现的机关函数,因而能够一定其承继自基类System.Object,而这个System.Object就包括在mscorlib程序会合。
  • 在内部指令中还会指了然援用版本(.ver);使用程序实践公钥标志(.publickeytoken),公钥Token是SHA1哈希码的低8位字节的反序(以下图所示),用于独一切实其实定程序集;还包含其他信息如言语文明等。

<br>

  • HelloWorld程序会合包含了.hashalgorithm指令,暗示完成平安性所利用的哈希算法,体系缺省为0x00008004,标明为SHA1算法;.ver则暗示了HelloWorld程序集的版本号;
  • 程序集由模块构成,.module为程序集指令,标明界说的模块的元数据,以指定以后模块。
  • 其他的指令另有:imagebase为影象基地点;.filealignment为文件对齐数值;.subsystem为毗连体系范例,0x0003暗示从把持台运转;.corflags为设置运转库头文件标记,默许为1;这些指令不是我们研讨的重点,具体的信息请参考MSDN相干信息。
3.2HelloWorld类剖析
起首是HelloWorld类,代码为:
.classpublicautoansibeforefieldinitHelloWorld
extends[mscorlib]System.Object
{
}//endofclassHelloWorld

  • .class标明了HelloWorld是一个public类,该类承继自内部程序集mscorlib的System.Object类。
  • public为会见把持权限,这点很简单了解。
  • auto标明程序加载时内存的结构是由CLR决意的,而不是程序自己
  • ansi属性则为了在没有被办理和被办理代码间完成无缝转换。没有被办理的代码,指的是没有运转在CLR运转库之上的代码,比方本来的C,C++代码等。
  • beforefieldinit属性为HelloWorld供应了一个附加信息,用于标志运转库能够在任什么时候候实行范例机关函数办法,只需该办法在第一次会见其静态字段之前实行便可。假如没有beforefieldinit则运转库必需在某个准确工夫实行范例机关函数办法,从而影响功能优化,具体的情形能够介入MSDN相干内容。
然后是.ctor办法,代码为:
.methodpublichidebysigspecialnamertspecialname
instancevoid.ctor()cilmanaged
{
//代码巨细7(0x7)
.maxstack8
IL_0000:ldarg.0
IL_0001:callinstancevoid[mscorlib]System.Object::.ctor()
IL_0006:ret
}//endofmethodHelloWorld::.ctor

  • cilmanaged申明办法体中为IL代码,唆使编译器编译为托管代码。
  • .maxstack标明实行机关函数.ctor时代的评价仓库(EvaluationStack)可包容数据项的最年夜个数。关于评价仓库,其用于保留办法所需变量的值,并在办法实行停止时清空,大概存储一个前往值。
  • IL_0000,是一个标志代码行开首,一样平常来讲,IL_之前的部分为变量的声明和初始化。
  • ldarg.0暗示装载第一个成员参数,在实例办法中指的是以后实例的援用,该援用将用于在基类机关函数中挪用。
  • call指令一样平常用于挪用静态办法,由于静态办法是在编译期指定的,而在此挪用的是机关函数.ctor()也是在编译期指定的;而另外一个指令callvirt则暗示挪用实例办法,它的挪用历程有异于call,函数的挪用是在运转时断定的,起首会反省被挪用函数是不是为虚函数,假如不是就间接挪用,假如是则向下反省子类是不是有重写,假如有就挪用重写完成,假如没有还挪用本来的函数,顺次类推直到找到最新的重写完成。
  • ret暗示实行终了,前往。
最初是Main办法,代码为:

.methodpublichidebysigstaticvoidMain()cilmanaged
{
.entrypoint
//代码巨细11(0xb)
.maxstack8
IL_0000:ldstr"Hello,world."
IL_0005:callvoid[mscorlib]System.Console::WriteLine(string)
IL_000a:ret
}//endofmethodHelloWorld::Main

  • .entrypoint指令标明了CLR加载程序HelloWorld.exe时,是起首从.entrypoint办法入手下手实行的,也就是标明Main办法将作为程序的出口函数。每一个托管程序必需有而且只要一个出口点。这区分于将Main函数作为程序出口标记。
  • ldstr指令暗示将字符串压栈,"Hello,world."字符串将被移到stack顶部。CLR经由过程从元数据表中取得笔墨常量来机关string对象,值得注重的是,在此机关string对象并未呈现在《第五回:深切浅出关头字---把new说透》中提到的newobj指令,关于这一点的注释我们将鄙人一回中做扼要剖析。
  • hidebysig属性用于暗示假如以后类作为父类时,类中的办法不会被子类承继,因而HelloWorld子类中不会看到Main办法。
接上去的一点增补:


  • 关于正文,IL代码中的正文和C#等初级言语的正文不异,实在编译器在编译IL代码时已将一切的正文往失落,以是任何对程序的正文在IL代码中是看不见的。
3.3回回简便
往粗取精,我们的IL代码能够简化,上面的代码是基于下面的剖析,并去向不主要的信息,以更简便的体例来展示的HelloWorld版IL代码,具体的剖析就以正文来睁开吧。

<br>
4.结论
停止本文,我们从一个点的角度和IL来了一次打仗,除懂得几个主要的指令寄义,更主要的是已走进了IL的天下。经由过程一站式的扫描HelloWorld的IL编码,我们还不敷以从全局来懂得IL,不外第一次的亲热打仗最少让我们太生疏,并且跟着系列文章的深切我们将渐渐创建起这类认知,从而进步我们把握懂得.NET底层的无效工具。本系列也将在后续的文章中,渐渐创建起这类利用工具的办法,敬请存眷。

<br>

参考文献
(USA)JoeDuffy,Professional.NETFramework2.0
(USA)DavidChappell,Understanding.NET
CLR团队通告
CLR基本研讨团队建立了,本团队以研讨和寻找CLR基本和.NETFramework底层常识为主旨,在此强烈热闹的接待博客园的伴侣们。假如对CLR及.NET底层研讨有乐趣,请请求到场CLR基本研讨团队,在一个专注的情况里共享你的手艺。在请求之前请您浏览团队大纲,CLR团队信息以下:
团队地点:http://clr.cnblogs.com/
团队大纲:检察
团队请求:进进
团队近期举动:收拾搜集团队成员CLR系列文章,在团队通告展播。

因胸联盟 该用户已被删除
沙发
发表于 2015-1-21 05:38:25 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
深爱那片海 该用户已被删除
板凳
发表于 2015-1-25 23:07:32 | 只看该作者
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
莫相离 该用户已被删除
地板
发表于 2015-2-4 08:46:59 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
柔情似水 该用户已被删除
5#
发表于 2015-2-7 03:55:39 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
精灵巫婆 该用户已被删除
6#
发表于 2015-2-8 07:58:46 | 只看该作者
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
只想知道 该用户已被删除
7#
发表于 2015-2-10 11:14:20 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
变相怪杰 该用户已被删除
8#
发表于 2015-3-1 09:37:08 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
爱飞 该用户已被删除
9#
发表于 2015-3-9 23:02:44 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
飘灵儿 该用户已被删除
10#
发表于 2015-3-17 02:11:23 | 只看该作者
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-23 16:17:48 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 05:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表