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

问题描述 投票:0回答:2

寻找生成惯用代码的交叉编译器的建议。用例是开源项目的代码示例,但是目前这些需要用许多不同语言编写,重复工作。我们的想法是,图书馆的用户应该能够查看生成的代码并“有宾至如归的感觉”。

我为此目的检查了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行,类之间没有耦合。但我想我会首先寻找现成的解决方案。

cross-compiling code-generation haxe
2个回答
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();
})();


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

© www.soinside.com 2019 - 2024. All rights reserved.