提升proto vs c#表达树

时间:2012-01-19 14:24:59

标签: c# c++ boost

首先,我想知道两个“功能”是否具有相同的目标。 其次,如果是(或者只是部分是),那么提升原型是否有任何明显的限制 c#表达树

感谢

3 个答案:

答案 0 :(得分:6)

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

C#具有语言支持,可将LINQ表达式捕获为动态类型树。 LINQ使用者使用它来优化查询评估。对内存数据结构的查询可以通过LINQ扩展方法进行简单的评估,但是通过在运行时遍历LINQ表达式,计算T-SQL字符串并将其传递给LINQ表达式,可以更好地执行针对远程数据库的查询。用于远程执行的SQL服务器。就目前而言,C#表达式树在这些优化问题上表现最佳。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-2)

你究竟想问什么?我不明白你的问题。

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

在C ++中,您不能使用任意代码并将其作为Expression使用。你没有反射机制。

Expression是RunTime功能,而Boost Proto是编译时库。