boostprotovsc#表达式树

boost proto vs c# expression tree

本文关键字:表达式 boostprotovsc#      更新时间:2023-10-16

首先,我想知道两个"功能"是否有相同的目标。其次,如果是(或仅部分是),那么boost proto over是否存在任何重大限制c#表达式树

感谢

我是Boost.Proto的作者,最近才发现C#表达式树。AFAICT,它们在意图上相似,但在实施和范围上不同。

C#支持将LINQ表达式捕获为动态类型树。LINQ使用者使用它来优化查询的评估。通过LINQ扩展方法,对内存中数据结构的查询将是一种直接的评估,但对远程数据库的查询将通过在运行时遍历LINQ表达式、计算T-SQL字符串并将其传递给SQL服务器进行远程执行来更优化地执行。目前,C#表达式树最擅长于这类优化问题。

推进。Proto OTOH有一个更广泛的范围。原型表达式树是静态类型的,允许在编译时进行复杂的转换和代码生成。更重要的是,Proto提供了内省和转换树的工具,并从中生成自定义代码。这可能有助于优化,但也有助于为表达式提供完全不同的领域特定语义。因此,Proto被更准确地认为是一个嵌入式领域特定语言工具包。

C#表达式树也可以这样做,但AFAIK目前还没有用于树转换和代码生成的框架。在.NET上生成运行时代码的能力使这成为一种令人信服的可能性。也许一些有进取心的开发人员(你?)会愿意在C#表达式树上写一个Proto#。:-)

它们部分重叠,因为它们都可以用于编写DSL。Boost proto是围绕在C++中构建嵌入式DSL的想法构建的,该DSL被转换为C++并在编译时编译。C#表达式树更多的是编写一个外部DSL(或者任何解释器)。所以boost::Proto是关于修改和增强C++的,表达式树是关于用新语言编写代码,而不是修改C#。

你到底想问什么?我不理解你的问题。

他们的目标并不相同,因为C++和CLR非常不同。

在C++中,不能将任意代码作为表达式来处理。你没有反射机制。

表达式是运行时功能,而Boost Proto是编译时库。