Vala 0.50.4

Vala — язык программирования, предназначенный для прикладного и системного программирования на основе библиотек GLib Object System (GObject).

Vala по своему синтаксису очень похож на Java и полностью реализует объектно-ориентированный подход. Поддерживаются интроспекция, выведение типов, сборка мусора, основанная на подсчёте ссылок, лямбда-функции, концепция сигналов и слотов, подобная используемой в Qt, но реализованная на уровне языка, строковые типы, обобщённое программирование, срезы массивов, оператор перечисления элементов коллекции foreach, делегаты, замыкания, интерфейсы, свойства и исключения. 

Особенность системы разработки состоит в том, что программа на Vala транслируется в программу на языке C, которая, в свою очередь, компилируется в исполняемый код целевой платформы со стандартными библиотеками C, Glib и выполняется со скоростью откомпилированного в объектный код целевой платформы приложения C. Чтобы получить транслируемый код на языке С, нужно указать параметр -C компилятору Vala. При наличии в программе графического интерфейса пользователя во время компиляции используется библиотека GTK+ (параметр --pkg gtk+-3.0 компилятора).

Благодаря такому подходу откомпилированный код на Vala бинарно совместим с системными библиотеками, написанными на C. Для подключения сторонних библиотек к программам на языке Vala используются специальные vapi-файлы, в которых даётся описание интерфейса библиотеки. Для многих библиотек уже существуют vapi-файлы, входящие в штатную поставку компилятора Vala. Кроме того, имеются vapi-файлы для библиотек, поддерживаемые сторонними пользователями, пока не включенные в штатную поставку.

Язык Vala был создан для эффективной разработки на платформе GNOME сложных прикладных и системных приложений с графическим интерфейсом пользователя, базирующимся на стандартной библиотеке GTK+, с применением современных языковых средств и техник программирования. 

Изменения в новой версии языка программирования:

  • Добавлена дополнительная поддержка ключевого слова params для конструкторов.
  • codegen:
    • Улучшена поддержка конструкторов SimpleType struct (например используется чтобы забиндить typedef uint32_t people_inside; из C).
    • Улучшена обработка атрибута "NoWrapper".
    • Для классов разрешен CCode.type_cname и get_ccode_type_name().
    • Всегда использован G_TYPE_INSTANCE_GET_CLASS/INTERFACE для внешних символов.
    • Использован g_boxed_free в free-wrapper для размещения GLib.Value в куче.
    • Исправлена утечка памяти во время неявного анбоксинга GLib.Value (универсальный контейнер любого value типа).
    • Исправлена утечка памяти во время перемещения в стек структуры, размещённой в куче.
    • Обеспечено наследование деструктора родительской структуры
    • Налажено правильное получение symbol_reference вложенных cast-выражений.
    • Удалены все вложенные вхождения CCodeCastExpression.
    • Прекращён некорректный вызов обработчика сигналов по умолчанию.
    • Подключен "string.h" для strcmp() (POSIX профайл, режим при котором Vala генерирует код используя только стандартную С библиотеку).
  • Vala:
    • Улучшено обнаружение дубликатов исходных файлов пакетов.
    • Поля/свойства GtkChild должны быть объявлены как unowned.
    • Запрещено переназначения поля/свойства GtkChild.
    • Применено более строгое условие для лямбды при делегировании назначения.
    • Запрещено применение одноразовых структур SimpleType.
    • В GLib.Value unboxing обеспечен возврат unowned-зничения.
    • Запрещено приведение GLib.Value к типу nullable struct/simple.
    • Добавлена проверка аргументов типа в базовых типах/предусловий класса/интерфейса.
    • Запрещён захват параметров/переменных va_list.
    • Дженерики, содержащие указатель на структуру, должны быть приведены к нужному типу при доступе для избежания С UB.
    • Реализован вывод типов для "in" внутри enum.
    • Улучшена проверка контекста при присвоениях в поле writeable.
    • Подключён "stdlib.h" для Enum.to_string() (POSIX).
    • Установлен правильный source_reference для неявных переменных "this" и "result"
    • Обеспечен вывод сообщения об ошибке для недопустимого внутреннего операнда унарных выражений.
  • Сodewriter: Прекращено добавление завершающего ";" после тела WithStatement.
  • Girparser:
    • Обеспечена обработка анонимного делегата, не подкрепленного виртуальным методом или сигналом.
    • Применены метаданные "delegate_target" для методов и параметров
    • Применены метаданные "destroy_notify_cname" для полей
    • Применены метаданные "type_get_function" для классов и интерфейсов
    • Установлен CCode.type_cname для классов, если он не соответствует значению по умолчанию.
  • girwriter: Обеспечена запись элементов параметров экземпляра.
  • girwriter: Реализован вывод обработчика сигналов по умолчанию.
  • libvaladoc/html: Убрана сортировка полей структур чтобы оставить их оригинальный порядок при генерации html документации valadoc.org
  • libvaladoc: Обеспечено правильное получение значений для Api.Class.is_compact
  • libvaladoc: Добавлен врапер для "agedge" библиотеки graphviz
  • Биндинги:
    • Мелкие исправления при генерации привязок: cairo, gobject-2.0, pango, goocanvas-2.0, curses, alsa, bzlib, sqlite3, libgvc, posix, gstreamer-1.0, gdk-3.0, gdk-x11-3.0, gtk+-3.0, gtk4, fuse, libxml-2.0
    • gdk-pixbuf-2.0: Исправление Pixbuf.save_to_streamv_async()
    • gio-2.0: Исправление привязки PollableOutputStream.write*_nonblocking()
    • gio-2.0,gtk+-3.0,gtk4: Отброшены явные аттрибуты c-типа параметров va_list
    • gio-2.0: Выбран отсутствующий invoker для некоторых методов AppInfo/File.*()
    • glib-2.0: Добавлен GLib.[S]List.is_empty() convenience methods for non-null
    • glib-2.0: Биндинг функции assert_cmp* [#395]
    • glib-2.0: Улучшен тип поля OptionEntry.flags
    • glib-2.0: PtrArray теперь подкласс GenericArray
    • gstreamer-1.0: CCode.type_id мини-объекта(MiniObject) выставляется как G_TYPE_BOXED [#1133]
    • gtk+-2.0,javascriptcoregtk-4.0: Откорректировано использование атрибута CCode.type_cname
    • gtk+-3.0,gtk4: Исправлены некоторые возвращаемые делегатом значения и параметры
    • gtk4: Обновлён до версии 4.0.2.

Язык Vala активно используется для разработки приложений под GNOME, в частности для написания принципиально новых приложений.