实现C#语言扩展

实现C#语言扩展,c#,language-extension,C#,Language Extension,使用这样的系统,可以在一台机器内跨多个内核和线程分割匿名函数、查询等的执行。我希望能够使用标准语言结构(如for循环(如Parallel.for())、值类型(如ints、structs)等)将此功能扩展到跨多台机器运行,并将应用程序源代码的修改保持在最低限度。理想情况下,这将允许我打开一个项目,向一个方法添加一个属性,然后重新编译以获得对增强功能的访问 看来我需要一些大致如下的东西: 捕获已编译代码块(如lambda)并将其与所需的任何数据一起传递给另一个节点上运行的工作进程的能力,或 提供一

使用这样的系统,可以在一台机器内跨多个内核和线程分割匿名函数、查询等的执行。我希望能够使用标准语言结构(如for循环(如
Parallel.for()
)、值类型(如
int
s、
struct
s)等)将此功能扩展到跨多台机器运行,并将应用程序源代码的修改保持在最低限度。理想情况下,这将允许我打开一个项目,向一个方法添加一个属性,然后重新编译以获得对增强功能的访问

看来我需要一些大致如下的东西:

  • 捕获已编译代码块(如lambda)并将其与所需的任何数据一起传递给另一个节点上运行的工作进程的能力,或

  • 提供一个预处理器,该预处理器将捕获有问题的代码,将其编译成一种模板项目,该模板项目将替换变量引用等,并引用一个类,该类将处理网络通信、缓存和对任何其他所需资产的访问,并将生成的DLL发送到其他计算机上运行的任何可用工作节点

  • 似乎提供了一些有用的工具。有没有办法连接到当前的编译管道来实现这一点

    编辑


    好吧,我知道这是可能的。问题是,怎么做?

    你不必扩展语言来做梵天所做的事情。他刚刚实现了一个自定义查询提供程序,它解析表达式树并发出GPGPU代码(LINQtoSQL做同样的事情,但使用SQL)

    我链接了一个有关MSDN的基本指南,它可以帮助您启动并运行
    IQueryable
    提供程序

    最困难的部分是遍历表达式树并生成OpenCL代码。一旦你能做到这一点,你只要把它传给Cloo,你就应该开始跑步了

    编辑

    您使用属性
    [Kernel]
    将编译标准.NET代码的工具链接到GPU代码。他们通过使用后期构建工具查找编译后的IL中的属性来实现这一点,并执行IL重写以生成GPU调用。这类似于AOP解决方案

    IL重写既费时又费力,但你也可以走这条路

    使用诸如并行Linq之类的系统,可以在一台机器内跨多个内核和线程分割匿名函数、查询等的执行。我希望能够使用标准语言构造(如for循环(如Parallel.for())、值类型(如int、structs等)将此功能扩展到跨多台机器运行,并将应用程序源代码的修改保持在最低限度

    听起来不错。事实上,我们有一个非常类似于微软研究院的系统,尽管很明显我不能讨论细节

    我需要能够捕获已编译的代码块(如lambda)并将其与所需的任何数据一起传递给另一个节点上运行的工作进程

    好的,你知道了。我们在C#3中添加了该功能。这就是LINQtoSQL的工作原理。不知何故,LINQ查询必须进入数据库。编译后的lambda在客户机上进行查询,转换成一个查询并发送到服务器节点,然后返回结果

    Roslyn似乎提供了一些有用的工具。有没有办法连接到当前的编译管道来实现这一点

    这不是罗斯林的目的;Roslyn并不是要给C语言添加新功能。这是为了使分析代码更容易地构建重构引擎之类的东西

    您不需要连接到编译管道。PLINQ不会更改编译器,LINQ to SQL不会更改编译器,依此类推。将lambda转换为表达式树时,编译器会发出代码,在运行时创建表示lambda的表达式树。您可以查询该表达式树,将其序列化到网络中的另一台计算机,反序列化它,将其转换为委托并运行它(如果您喜欢这样做的话)


    您可能需要编写自己的表达式树序列化程序和反序列化程序,但它们是非常简单的数据结构。作为一个不可变的树应该使它们非常容易序列化和反序列化;它们不能真正形成复杂的网络,因为它们总是从叶节点向上构建。

    好吧,闭嘴者-这到底是如何过于本地化的?因为你一定是这里唯一一个想要实现C语言扩展来创建OpenCL内核的人。好吧,忘了OpenCL部分。您将如何进入编译阶段来定制代码生成,以便跨异构平台分发执行?这对我来说似乎再清楚不过了。从什么时候起我们就可以结束关于特定应用程序的问题了?!我不认为这是本地化的。OP真正需要的是关于编写LINQ查询提供程序以将C#转换为OpenCL的指导,这是一项巨大的任务,但前期并不十分复杂。请看@JohnSaunders,“没有办法做到这一点”是一个有效的回答,因为我在问这是否可能,如果可能,如何做到。我不明白这怎么会让问题“过于本地化”;谢谢你的回复。我仍然很好奇如何在不使用自定义提供程序的情况下实现它,例如捕获循环,并用对这样一个提供程序的引用替换它们,但这将解决问题。+1。有些库声称可以简化自定义LINQ提供程序的实现,例如.Expression树可以表示循环和C#4中的大多数语句构造。如果不需要LINQ风格的语法,只需自己解析表达式树即可。请记住,可以将lambda函数直接指定给表达式对象,例如:
    expression some