生成惯用代码的交叉编译器

时间:2019-01-17 14:27:24

标签: cross-compiling code-generation haxe

正在为生成惯用代码的交叉编译器寻找建议。用例是开放源代码项目的代码示例,但是当前需要用许多种不同的语言来编写这些代码,这需要很多工作。这样的想法是,图书馆的用户应该能够查看生成的代码并“感觉在家”。

我为此目的签出了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行,而类之间没有耦合。但是以为我会先寻找现成的解决方案。

2 个答案:

答案 0 :(得分:2)

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();
})();

答案 1 :(得分:0)

使用@: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)生成器,并且能够使其与原始结构非常接近: idiomatic output with Haxe->GML