元编程:用一种语言X编写,用多种语言交叉编译,如C#,PHP,Java,C

2022-08-30 20:01:53

在我多年来完成的所有项目中,我从未遇到过这样的要求,尽管这在纸面上似乎很容易:为许多知名的CMS编写插件。

显然,每个插件系统(或扩展系统)都是不同的,这需要通过适配器模式进行特定的桥接代码。但核心应该写一次。我不希望WordPress用户使用PHP-Java桥接器,也不期望DotNetNuke用户使用.NET-Native bridge(尽管这更容易构思)。

在我看来,核心应该可以编译在三个主要领域,涵盖大多数CMS系统:

  • 母语,中间语言可以是C,也可以是C++。目标可以用作 PHP 扩展。
  • MSIL/CIL for .NET based languages
  • 基于 Java 的系统的 Java 字节代码

C#和Java之间的翻译非常好,但C和C#要困难得多。最终,最好可以添加其他目标,以免强制WordPress或WikiMedia用户在使用插件之前安装扩展。

我相信这也提出了其他问题。解决此类问题的常用方法是什么?我应该先定义一个DSL,然后使用DMS或类似的转换吗?其他选择?


答案 1

Haxe是一种针对不同平台编译的元语言:

  • JavaScript
  • C++
  • C#
  • 哈希链接
  • 爪哇岛
  • 路亚
  • 菲律宾比索
  • 蟒蛇 3
  • NekoVM
  • 闪光
  • 操作脚本 3

答案 2

由于没有一种语言可以直接编译到您的所有目标,因此不要忽视最低的公分母。您可以使用C构建插件,然后包装每个平台(PInvoke,JNI,PHP扩展)的结果。如果您不喜欢在 C 语言中编写复杂插件的想法,请考虑使用一种小巧、易于使用且可嵌入的脚本语言来完成繁重的工作。Lua似乎是合理的。您的最终结果将是一个 C 框架,它只是将请求和响应委派给主机和脚本以及从主机和脚本委派请求和响应。

程序转换是相关的,尽管构建有效转换的努力是重要的。从理论上讲,您可以从源转换到源,并使用特定于平台的编译器。看看TXLStratego / XT,以了解所涉及的内容。


推荐