Кросс-компиляторы, которые генерируют идиоматический код - PullRequest
0 голосов
/ 17 января 2019

Поиск рекомендаций для кросс-компилятора, который генерирует идиоматический код. Вариант использования - это примеры кода для проекта с открытым исходным кодом, однако в настоящее время они должны быть написаны на разных языках, дублируя усилия. Идея заключается в том, что пользователи библиотеки должны иметь возможность смотреть на сгенерированный код и «чувствовать себя как дома».

Я проверил 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 голосов
/ 18 февраля 2019

Использование @: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 ++ включают множество неявных приведений, чтобы исключить любой риск двусмысленности кода.

Можно использовать API CustomJSGenerator Haxe для написания пользовательских генераторов для языков, отличных от JS (и преобразования кода в соответствии с соглашениями / многословием) - например, я создал Haxe-> GML (сценарий таким образом, язык напоминал смесь генератора плоских C и JS), и ему удалось достаточно близко соответствовать исходной структуре: imageGML">

0 голосов
/ 11 февраля 2019

Качество вывода 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();
})();

...