2011-04-18 116 views
11

我正在寻找一种方法来编写和维护某个算法(实际上是我的代码的一个图形渲染子模块),只有一次。我需要C++,PHP和Javascript中的算法。理论上我可以用C++编写它,并将其包装到PHP扩展中;但是它本身有很多问题,并没有解决Javascript链接。元编程到几种输出语言

我在找什么,我认为是一种从语言(无论哪一个)转换成三个(或两个,如果源语言是三种语言之一)输出语言的工具目标。我发现MetaL(http://www.meta-language.net/)似乎做我想做的,但也看起来死了(自2007年以来没有更新),只针对我需要的三种语言之一。它需要非常灵活,并允许我更新结果 - 例如,我在C++和PHP渲染中使用Cairo,在Javascript端使用HTML Canvas。所以我需要为API定制特定的效果。

或者,我会解决一个PHP解析器和词法分析器,它会给我一个带足够信息的AST,以便为C++和Javascript编写生成器作为替代后端。

任何想法?谢谢。

+1

你的问题让我想起了旧的引用:_有些人在遇到问题时想“我知道,我会用正则表达式。“现在,他们有两个问题。我明白你的意愿来集中维护,但听起来像你正在采取一个有点烦人但合理的问题,并把它变成一个非常复杂的问题。 (我正在考虑自动构建,翻译引擎问题以及您即将进入的调试问题) 想想那些在您移动之后必须维护此解决方案的可怜家伙。 – NightDweller 2011-04-18 13:07:11

+0

如果你最多只谈论几千行代码,你最好仔细设计API并简单地重新编码它们。在语言中发现的所有奇怪事物(例如,C++:类,多重继承,命名空间,单独声明/定义,宏,模板,重载等)的自动代码生成是一项艰巨的任务,不是值得几千行的努力。如果你想产生100K SLOC,那么这将是非常值得的,或者你用任意方式编写代码片段。但3个固定算法的副本?不要以为它值得麻烦。 – 2011-04-19 04:02:09

+0

我可以将自己限制在一个语言的小部分中来编写它。我显然不需要将C++的所有细微差别翻译成多种语言。渲染是90%'计算像素,矩形或圆的位置,计算它的颜色,调用绘制API函数'。它不一定是通用的。无论如何,它看起来像haXe会做我所需要的。 – Roel 2011-04-21 16:26:55

回答

5

你可以看看haXe。 haXe是一种开源编程语言。它可以编译为JavaScript,Flash/ActionScript,php5,C++,以及将来的Java,C#。

+0

啊哈很好,谢谢,我在Google上没有找到。 – Roel 2011-04-18 12:02:10

1

也许看看'编码'您的原始算法在XML和使用各种XSLT模板输出到您的目标语言?或者可能是antlr(http://www.antlr.org/ http://www.amazon.com/Definitive-Antlr-Reference-Domain-Specific-Programmers/dp/0978739256/ref=sr_1_1?s=books&ie=UTF8&qid=1303114884&sr=1-1)。

+0

是的,这或多或少是MetaL试图做的,我想,只是没有我能告诉的xslt。我对xslt没有太多的好经验,所以我会跳过这一点,但也许我可以做一些简单的其他xml->代码转换...谢谢。 – Roel 2011-04-18 12:03:23

2

的Emscripten项目(我只在上周发现)你可能感兴趣的:http://syntensity.blogspot.com/2011/04/emscripten-10.html

这家伙基本上已经写了一个编译器编译为Javascript代码C/C++。

这应该解决你的问题的Javascript方面。

希望有所帮助。

另一个产品沿着同样的路线,更为人熟知的是Google Web Toolkit(GWT)。它基于Java,但最终的结果是相似的 - 您使用Java代码编写Web应用程序,并将前端部分编译为Javascript,将后端部分编译为常规Java字节码。我知道你不是要求Java,但如果它感兴趣,链接在这里:http://code.google.com/webtoolkit/

稍微有用,但可能与您的问题更相关的是PHPJS。这是一个用Javascript尽可能多地实现PHP语言的项目。他们在逐个函数的基础上进行,所以它只是一个近似值,但是鉴于语言语法是相似的,可以使用它来编写在原生PHP中工作不变的代码,并且也在客户端使用Javascript。

当然,将一种语言编译为另一种语言的一个重要缺陷是,生成的代码总是不够优化。关于这一点你可以做的事情不多,但在开始用单一语言编写共享代码库的路径之前,应该记住这一点。

+0

谢谢,Emscripten看起来非常相关。我猜如果它有一个javascript后端,PHP后端应该不会那么困难 - 特别是因为我只需要一个非常有限的语言结构子集。 – Roel 2011-04-18 12:01:51

1

也许你可以在javascript中编写它,然后使用C++和PHP javascript解释器。

+0

有趣的想法,谢谢。 – Roel 2011-04-18 11:59:24

+0

@Roel:“渲染”通常是计算密集型的。面对计算密集的任务,建立一个解释器来做到这一点对我来说似乎不是一个好主意。 – 2011-04-19 14:03:07

+0

就我而言并不重要。这是值得的权衡。 – Roel 2011-04-21 16:24:25

-1

完全不同的方法是使用汇编代码。用您选择的语言编写算法,将其编译为ASM源代码。然后在部署语言中提供接口包装器。

当然,这是非常“空气馅饼”。这取决于如此多的变量,目标平台的数量,优化的重要性,与实现变​​化相关的界面变化的频率等等。