硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

Expression Evaluator:一个轻量级的 C#编译器服务

  • 2014-05-08
  • 本文字数:2060 字

    阅读完需:约 7 分钟

尽管.NET 社区热切盼望 Roslyn 的正式版本,但工作还是要继续。所以今天我们来介绍另一个编译器服务—— Expression Evaluator 。虽然其他编译器服务都试图尽可能地全面,但它却独辟蹊径。

InfoQ:你说 C# Expression Evaluator 是一个轻量级库,是什么让它成为一个轻量级的库?什么样的库又是重量级的呢?

Repert Avery:Expression Evaluator 的目标是计算表达式,就此而言我认为它是轻量级的,因为它很小(不到 1M),是自包含的,不依赖于其他非核心库(除了 Antlr),并且功能独特。我认为 Roslyn 是重量级的,因为它需要很多库的支持。当然,每个库都有自己的目标,很多 Roslyn 能做的事 Expression Evaluator 可能永远都做不到,如编译整个程序集。但就计算小的表达式来说,我相信 Expression Evaluator 已经做得非常好了。

InfoQ:Antlr 是什么?你为什么会将它包含在库里?

Rupert: Antlr (“又一个语言识别工具”的缩写)是一个最初用 Java 编写的库,可以根据特殊的语法(文法)来构建复杂的解析器代码。它就像是一个用于语言解析的加强版的正则表达式。你可以编写某种语言的语法规则,Antlr 会为你生成代码。

在使用 Antlr 之前我自己编写了这个解析器,它能做一个表达式解析器所需要的所有基础的工作。我能够支持“a + b.method(c,d[e] == f)”这样的表达式。它的规则十分简单。但当我想支持 Lambda 语法时,一切就变得复杂起来。例如表达式“(a,b) => a==b”,(a,b) 应该先解析为参数列表,然后再解析 Lambda 符号 => 之后的所有内容(可能为块表达式),这难倒了我。我需要进行一些回溯并抛弃生成的 token。我那手写的解析器显然无法完成这个任务。

Antlr 让一切变得简单。它能让我关注于编写处理各种语言的代码,而不用操心用于解析的代码。

必须为我正使用的语法文件的作者点赞。我在 https://antlrcsharp.codeplex.com/ 找到了这个十分完整的 C# 4.0 语法文件,我所要做的,就是对每种情况编写代码,来生成适当的表达式。

InfoQ:文档中提到了 LINQ 表达式树。能详细说说你是如何使用的吗?

Rupert:LINQ 表达式能将解析好的表达式存储为某种数据结构。与其自己构建数据结构,不如使用.NET Framework 提供的结构。表达式树还有一个优势是可以编译为.NET 函数。当表达式被编译为实际的.NET CLR 代码后,就可以通过调用该函数来计算表达式。预编译代码的好处是速度的提升。其他不使用 LINQ 表达式的库,在计算表达式时,会遍历等价的表达式树,通过执行代码来模拟正在执行的代码,这是一笔巨大的开销。

比如这样的表达式:

x == a + b

它的表达式树可能为:

根:

节点类型:Equals

左子节点: 参数表达式 x

右子节点: (加法表达式)

加法表达式:

节点类型:Add

左子结点:参数表达式 a

右子节点:参数表达式 b

这在 C#中可以写成:

Expression.Equals(Expression.Parameter('x'), Expression.Add(Expression.Parameter('a'), Expression.Parameter('b'));Expression Evaluator 接下来(使用 Antlr)解析该表达式,生成适当的表达式树。构建完表达式树之后,可以通过 LINQ 将其编译为函数。使用这个库的应用程序可以执行这个函数,就像它已经在第一时间被编译过了一样。被编译为函数之后,表达式树就不再需要了,不过我们可以用它来分析表达式,我相信肯定会有人想要枚举表达式所用到的变量或属性。由于表达式树记录了每个表达式的类型,因此是可以通过这种方式提取这些信息的。

InfoQ:假设我们在编写一个客户端 - 服务器系统。我们需要从客户端向服务器发送搜索条件(如 where 子句)。你会对这样的系统使用这个库吗?如果会,那么将是什么样子的?

Rupert:在这种场景下,如果模型复杂,或查询逻辑复杂,并且客户端可以使用字符串自由地定义查询,那么 Expression Evaluator 就非常有用。Expression Evaluator 将工作于服务器端,解析查询并转换为编译后的代码。

我不清楚你所说的“将是什么样子”是指什么,不过使用了 Expression Evaluator 的 Web 应用程序可以让用户使用代码来定义查询,给用户提供一个可访问的参数集合,用户可以用 C#代码来编写查询,并将原封不动地发送给服务器进行解析和编译。

如果查询需要大量条件代码并且需要考虑性能,这将是 Expression Evaluator 发挥最大作用的时候。与其在查询中使用大量分支条件,不如基于必要的条件构建一个字符串表达式,并将其编译为可在查询中运行的委托。

使用 LINQ 表达式树并没有将其局限于只能为 LINQ 表达式构建动态 where 子句。Expression Evaluator 还可用于数据绑定。此时,用一个 XML 文件存储布局,并使用特性和特殊的符号来标记该文本用于数据绑定,而不是纯文本。XML 元素模仿 HTML,双花括号的符号模仿 AngularJS。结果就是一个很像 HTML/AngularJS 的布局和模板引擎,输出的是 PowerPoint 幻灯片。布局引擎为开发者提供了 HTML 的灵活性,而 Expression Evaluator 允许数据绑定到布局上并控制布局,在 PowerPoint 中生成丰富的报告。

Expression Evaluator 在 CodePlex 上以 Simplified BSD 协议开源。

原文链接: Expression Evaluator: A Lightweight C# Compiler Service

2014-05-08 08:286630
用户头像

发布了 59 篇内容, 共 26.0 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

Movist Pro for mac播放流畅、观影愉悦!

Rose

苹果电脑 视频播放器 Movist Pro Mac Movist Pro 中文版

远程桌面连接如何设置?远程桌面连接的设置方法

RayLink远程工具

远程桌面连接

华为全新发布2023春季旗舰新品,智慧生活再进化

最新动态

给程序加个进度条吧!1行Python代码,快速搞定~

程序员晚枫

Python pip 进度条

Error:SyntaxError:JSON Parse error:Unexpected EOF 解决办法

Rose

adobe 安装报错

数据库+chatGPT3.5 优化、索引、注释、SQL就是一句话的事了

非喵鱼

Java 数据库 openai ChatGPT ChatGPT4

窄带高清画质增强之生成式细节修复

阿里云CloudImagine

云计算 窄带高清

如何针对多租户 SaaS 使用案例扩展机器学习推理

亚马逊云科技 (Amazon Web Services)

Amazon SageMaker

如何将「知识」体系化管理

Java 架构 职场 知识管理

Ableton Live 11 Suite 音乐制作软件v11.2.11中文版安装教程

Rose

音乐制作 Ableton Live 11 Suite Ableton Live

内部开发者平台与门户:二者有何关联?

SEAL安全

企业号 3 月 PK 榜 内部开发者平台 内部开发门户

DrawerLayout(官方侧滑菜单)的简单使用

芯动大师

ViewPager DrawerLayout SlidingMenu

Nautilus Chain主网上线在即空投规则公布,如何获得更多的空投?

鳄鱼视界

Nautilus Chain主网上线在即空投规则公布,如何获得更多的空投?

股市老人

Docker 开始清退开源组织,不付费就删除所有私镜像怎么看

HoneyMoose

Redis链表底层实现以及生产实战

Java redis 缓存 源码 链表

华大北斗上榜“深圳知名品牌”

江湖老铁

Bitmap、RoaringBitmap原理分析

京东科技开发者

数据结构 算法 存储 BitMap 企业号 3 月 PK 榜

Acrobat DC弹窗:“未找到IMSlib,Acrobat服务将无法正常工作”,如何解决?

Rose

Acrobat DC 服务将无法正常工作

循序渐进讲解负载均衡vivoGateway(VGW)

vivo互联网技术

负载均衡 网关

深入浅出RPC服务 | 不同层的网络协议

京东科技开发者

网络协议 RPC调用 应用层 jsf 企业号 3 月 PK 榜

中国量子产业集结,用知识产权助力量子应用化

脑极体

火山引擎边缘渲染,驱动游戏体验升级

火山引擎边缘云

边缘计算 火山引擎 渲染 边缘云

尤大:不会说 Rap 的前端不是好前端!写一个 v-rap 指令!

泰罗凹凸曼

JavaScript 有趣的技术知识

2万字60道MySQL经典面试题总结(附答案)

程序员大彬

MySQL 数据库 java面试

Expression Evaluator:一个轻量级的C#编译器服务_C#_Jonathan Allen_InfoQ精选文章