【问题标题】:Cross compilers which generate idiomatic code生成惯用代码的交叉编译器
【发布时间】:2019-06-11 18:40:37
【问题描述】:

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

我为此检查了 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用@: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) 生成器,并且能够非常接近地匹配原始结构:

      【讨论】:

        猜你喜欢
        • 2015-12-07
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        相关资源
        最近更新 更多