Vala дженерики для C кода

Я читал о языке vala и о том, что он компилируется в код Ansi C. Однако я также видел, что он поддерживает дженерики, такие как Java или Rust. Теперь мой вопрос, как это скомпилировано в C-код? Если у меня есть общий класс или функция, какой код на C генерируется для имитации общего поведения?

1 ответ

Решение

Вала дженерики основаны на gpointer а также GType,

Вы можете специализировать только универсальный класс с параметром типа на основе указателя.

class MyClass<T> {

public T val;

}

public static int main (string[] args) {
    // This wouldn't compile!
    // var il = new Gee.ArrayList<int> ();

    var il = new Gee.ArrayList<int?> ();
    var dl = new Gee.ArrayList<double?> ();
    il.add (5);
    dl.add (3.0);

    var im = new MyClass<int?>();
    im.val = 5;

    var dm = new MyClass<double?>();
    dm.val = 3.0;

    var lm = new MyClass< Gee.List<int?> > ();
    lm.val = il;

    return 0;
}

Вы можете проверить сгенерированный код самостоятельно с помощью -C параметр:

valac -C Main.vala --pkg gee-0.8

Это создаст main.c файл. Если вы внимательно прочитаете его, вы увидите, что существует только одна структура для MyClass (плюс некоторые дополнительные вспомогательные структуры, необходимые для классов на основе GObject), которая имеет член gpointer val также имеет GType t_type также как и t_dup_func и t_destroy_func,

struct _MyClass {
        // ...
        gpointer val;
};

struct _MyClassPrivate {
        GType t_type;
        GBoxedCopyFunc t_dup_func;
        GDestroyNotify t_destroy_func;
};

Чтобы убедиться, что в GLib передан правильный тип, выполняется проверка типа. Это делает тип универсального Vala безопасным (частично во время компиляции и частично во время выполнения).

Это отличается от шаблонов C++, которые расширяются во время компиляции. Так что это ближе к универсальным шаблонам C#, чем к классическим шаблонам C++.

Я написал "частично во время компиляции", потому что компилятор Vala достаточно умен, чтобы пропустить проверку типа в коде C, когда он знает, что назначение всегда будет правильным.

Также сгенерированный Vala C-код предназначен для легкого использования для других языков программирования, имеющих привязки GLib (таких как C, Python, C++, GJS и т. Д.).

Другие вопросы по тегам