写点什么

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:286436
用户头像

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

关注

评论

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

用了 18 个月时间,做 AI 应用从 0 到 200 万用户,从亏损到盈利(4000 字全面复盘)

陈宇明

创业 程序员 AI AI应用 AI创业

高清LED显示屏在舞台应用中的惊艳效果

Dylan

活动 高清视频 LED显示屏 全彩LED显示屏 led显示屏厂家

天花板!充值运营平台限时返场!

开源物联卡管理平台-设备管理

物联网 IoT eSIM安全 java 技术提升

比特币减半倒计时:NFT 生态将受到怎样的影响?

NFT Research

BTC NFT

写给职场新人|从迷茫到屡获殊荣的技术人成长之路

京东科技开发者

云PBX的相关介绍

cts喜友科技

通信 通讯 云通讯

Optimism 黑客松大赛获奖名单公布

Footprint Analytics

AI gamefi Optimism

数仓的两种轻量级数据交换格式:json与jsonb

华为云开发者联盟

数据库 华为云 华为云开发者联盟 华为云GaussDB(DWS) 企业号2024年4月PK榜

小型企业网络优化加速方案

Ogcloud

网络 SD-WAN 企业组网 企业网络 SD-WAN组网

提升Office 365网络效率的SD-WAN技术

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

Uniswap丨justswap丨pancakeswap去中心化薄饼交易所系统开发

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

网站的静态资源怎么获取?

不在线第一只蜗牛

网站 静态资源

百度文库「一站式AI内容创作平台」再上新!重磅发布「跨模态AI漫画及画本生产能力」

极客天地

AI从入门到入门之手写数字识别模型java方式Dense全连接神经网络实现

京东科技开发者

RocketMQ 存储机制浅析

字节跳动云原生计算

RocketMQ

高效的 API 自动化测试

Liam

Jmeter 自动化测试 API测试 测试工具 API 自动化测试

加密货币交易所开发成本:2024 年完整指南

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

Kafka 线上性能调优

不在线第一只蜗牛

kafka 分布式

数据治理的五大误区与破解方法

郑州埃文科技

数据治理

克魔助手抓包工具完整教程

携手打造开放AI生态,英特尔助力千行百业数智化变革

E科讯

百度智能云宣布国内首家支持Llama3全系列训练推理

科技热闻

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