ASP.NET教程之Expression Evaluator:一个轻量级的C#编译器服务仓酷云
net网页编程的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。只管.NET社区热切企望Roslyn的正式版本,但事情仍是要持续。以是明天我们来先容另外一个编译器服务——ExpressionEvaluator。固然其他编译器服务都试图尽量地周全,但它却独辟门路。InfoQ:你说C#ExpressionEvaluator是一个轻量级库,是甚么让它成为一个轻量级的库?甚么样的库又是分量级的呢?
RepertAvery:ExpressionEvaluator的方针是盘算表达式,就此而言我以为它是轻量级的,由于它很小(不到1M),是自包括的,不依附于其他非中心库(除Antlr),而且功效共同。我以为Roslyn是分量级的,由于它必要良多库的撑持。固然,每一个库都有本人的方针,良多Roslyn能做的事ExpressionEvaluator大概永久都做不到,如编译全部程序集。但就盘算小的表达式来讲,我信任ExpressionEvaluator已做得十分好了。
InfoQ:Antlr是甚么?你为何会将它包括在库里?
Rupert:Antlr(“又一个言语辨认工具”的缩写)是一个最后用Java编写的库,能够依据特别的语法(文法)来构建庞大的剖析器代码。它就像是一个用于言语剖析的增强版的正则表达式。你能够编写某种言语的语律例则,Antlr会为你天生代码。
在利用Antlr之前我本人编写了这个剖析器,它能做一个表达式剖析器所必要的一切基本的事情。我可以撑持“a+b.method(c,d==f)”如许的表达式。它的划定规矩非常复杂。但当我想撑持Lambda语法时,统统就变得庞大起来。比方表达式“(a,b)=>a==b”,(a,b)应当先剖析为参数列表,然后再剖析Lambda标记=>以后的一切内容(大概为块表达式),这难倒了我。我必要举行一些回溯并丢弃天生的token。我那手写的剖析器明显没法完成这个义务。
Antlr让统统变得复杂。它能让我存眷于编写处置各类言语的代码,而不必费心用于剖析的代码。
必需为我正利用的语法文件的作者点赞。我在https://antlrcsharp.codeplex.com/找到了这个非常完全的C#4.0语法文件,我所要做的,就是对每种情形编写代码,来天生得当的表达式。
InfoQ:文档中提到了LINQ表达式树。能具体说说你是怎样利用的吗?
Rupert:LINQ表达式能将剖析好的表达式存储为某种数据布局。与其本人构建数据布局,不如利用.NETFramework供应的布局。表达式树另有一个上风是能够编译为.NET函数。当表达式被编译为实践的.NETCLR代码后,就能够经由过程挪用该函数来盘算表达式。预编译代码的优点是速率的提拔。其他不利用LINQ表达式的库,在盘算表达式时,会遍历等价的表达式树,经由过程实行代码来摹拟正在实行的代码,这是一笔伟大的开支。
好比如许的表达式:
x==a+b
它的表达式树大概为:
根:
节点范例:Equals
左子节点:参数表达式x
右子节点:(加法表达式)
加法表达式:
节点范例:Add
左子结点:参数表达式a
右子节点:参数表达式b
这在C#中能够写成:
Expression.Equals(Expression.Parameter(x),Expression.Add(Expression.Parameter(a),Expression.Parameter(b));ExpressionEvaluator接上去(利用Antlr)剖析该表达式,天生得当的表达式树。构建完表达式树以后,能够经由过程LINQ将其编译为函数。利用这个库的使用程序能够实行这个函数,就像它已在第一工夫被编译过了一样。被编译为函数以后,表达式树就不再必要了,不外我们能够用它来剖析表达式,我信任一定会有人想要列举表达式所用到的变量或属性。因为表达式树纪录了每一个表达式的范例,因而是能够经由过程这类体例提取这些信息的。
InfoQ:假定我们在编写一个客户端-服务器体系。我们必要从客户端向服务器发送搜刮前提(如where子句)。你会对如许的体系利用这个库吗?假如会,那末将是甚么模样的?
Rupert:在这类场景下,假如模子庞大,或查询逻辑庞大,而且客户端可使用字符串自在地界说查询,那末ExpressionEvaluator就十分有效。ExpressionEvaluator将事情于服务器端,剖析查询并转换为编译后的代码。
我不分明你所说的“将是甚么模样”是指甚么,不外利用了ExpressionEvaluator的Web使用程序可让用户利用代码来界说查询,给用户供应一个可会见的参数汇合,用户能够用C#代码来编写查询,并将一成不变地发送给服务器举行剖析和编译。
假如查询必要大批前提代码而且必要思索功能,这将是ExpressionEvaluator发扬最高文用的时分。与其在查询中利用大批分支前提,不如基于需要的前提构建一个字符串表达式,并将其编译为可在查询中运转的托付。
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。 Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。 逐步缩小出错代码段的范围,最终确定错误代码的位置。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。 CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
页:
[1]