寻找生成惯用代码的交叉编译器的建议。用例是开源项目的代码示例,但是目前这些需要用许多不同语言编写,重复工作。我们的想法是,图书馆的用户应该能够查看生成的代码并“有宾至如归的感觉”。
我为此目的检查了Haxe,但没有得到我需要的结果。例如,这段代码:
class HelloWorld {
static public function main() {
trace("Hello World");
}
}
为最终用户生成相当差的IDE体验:
@SuppressWarnings(value={"rawtypes", "unchecked"})
public class HelloWorld extends haxe.lang.HxObject
{
public HelloWorld(haxe.lang.EmptyObject empty)
{
}
public HelloWorld()
{
//line 1 "/usr/local/google/home/nbirnie/git/test/HelloWorld.hx"
haxe.root.HelloWorld.__hx_ctor__HelloWorld(this);
}
public static void __hx_ctor__HelloWorld(haxe.root.HelloWorld __hx_this)
{
}
public static void main()
{
//line 3 "/usr/local/google/home/nbirnie/git/test/HelloWorld.hx"
haxe.Log.trace.__hx_invoke2_o(0.0, "Hello World", 0.0, new haxe.lang.DynamicObject(new java.lang.String[]{"className", "fileName", "methodName"}, new java.lang.Object[]{"HelloWorld", "HelloWorld.hx", "main"}, new java.lang.String[]{"lineNumber"}, new double[]{((double) (((double) (3) )) )}));
}
}
总是可以选择为此编写域特定语言 - 生成的代码的实际量非常小,每个类可能有100行,类之间没有耦合。但我想我会首先寻找现成的解决方案。
Haxe的输出质量取决于每个语言后端(在所有后端中具有一致的行为),但总是可以改进。当你把它编译成JavaScript时,它确实得到了“我回家”的感觉。
class HelloWorld {
static public function main() {
trace("Hello World");
}
}
结果:
(function () { "use strict";
var HelloWorld = function() { };
HelloWorld.main = function() {
console.log("Hello World");
};
HelloWorld.main();
})();
使用@:nativeGen
和特定于平台的打印功能(而不是需要位置信息的Haxe特定打印功能)通常是一个良好的开端,
@:nativeGen class Main {
static function main() {
cs.system.Console.WriteLine("hi!");
}
}
public class Main {
public Main() {
}
public static void main() {
global::System.Console.WriteLine(((string) ("hi!") ));
}
}
正如已经提到的,详细程度因平台而异 - 例如Haxe-> JS或Haxe-> AS3产生相当手写的代码,而Haxe-> C#和Haxe-> C ++包含许多隐式转换以消除代码模糊的任何风险。
可以使用Haxe的CustomJSGenerator API为非JS语言编写自定义生成器(并转换代码以匹配约定/详细程度) - 例如,我制作了一个Haxe->GML(一种类似于平面C和JS混合的脚本语言)生成器方式,并能够使它与原始结构非常接近: