
В последнее время на каждом десктопе с ОС GNU/Linux и X-сервером установлены такие библиотеки, как GTK, GLib, GIO и прочие. Они являются наиболее часто используемыми библиотеками в пользовательской среде. Чтобы в этом убедиться, достаточно позапускать несколько программ с аргументом --help
. На выходе увидим примерно следующее:
ancient@NickolayPC:~$ gtkcreator --help
Usage:
gtkcreator [OPTION...]
Help Options:
-h, --help Show help options
--help-all Show all help options
--help-gtk Show GTK+ Options
Application Options:
-v, --version Display version
-g, --git Start git-client
-t, --term=CMD Start small terminal with command CMD
-d, --dir=DIR Start at directory DIR
--display=DISPLAY X display to use
Как видим, у программы есть несколько категорий: Help Options, Application Options, а, также, могут быть и свои. Например, --help-gtk
выведет список аргументов, которые влияют на работу библиотеки GTK.
Изначально данные библиотеки написаны для языка C, который, однако, не годится для написания полноценных графических (и не только) приложений. Объясню, почему:
- C не является ООП языком, в связи с чем все элементы, которые мы создаём — не объекты, что очень сильно усложняет написание приложений. Это легко заметить, просто попробовав написать программу на Gtk — изменяемый виджет (именно так именуются элементы интерфйса в gui-тулкитах) передаётся в качестве аргумента, а сама функция для изменения выглядит примерно так:
gtk_window_set_title(win, "Test")
. - В C очень легко получить такую ошибку, как
Segmentation Fault
— по сути, отстрелить себе ногу. А найти её можно полноценно только с помощью отладчика. Профессионалы со мной могут не согласиться, но у новичков это может быть серьёзной проблемой. - И, наконец, собрать программу на C с использованием такой библиотеки, как Gtk может быть не очень просто, т. к. у компилятора нет такого аргумента, как
--pkg
, который сам находит, где находятся файлы библиотеки.
Да, существует Gtk# — библиотека для разработки GTK приложений на C#. Но из нативных средств остаётся только C и, возможно, С++ с его gtkmm.
В данной статье я хочу рассказать о таком языке, как Vala — на хабре их практически нет, а язык годный. Доказательство этому — приложения из проекта GNOME переезжают на этот язык, а некоторые на нём изначально написаны.
Итак. Vala — язык программирования с тремя парадигмами: Структурная, Императивная и ООП. Типизация — строгая, статическая. Существует вместе с ЯП Genie, у которого функционал похож, однако является приближенным к Python, в отличие от Vala, который больше похож на Java. Разработан был в 2006 году.
В качестве своей основы Vala использует GLib. Поэтому, разрабатывая приложение на Vala, вы точно знаете, что используете GLib.
Hello World на этом языке выглядит так:
int main(){ //Объявляем функцию main, возвращающую значение типа int - код выхода.
print("Hello, world\n"); //Печатаем текст "Hello, world" - как и в С, символ \n на конце требуется
return 0; //Возвращаем 0 в качестве кода выхода. В отличие от С, если вы указали тип int для функции main (а она может быть только int и void), требуется возвращать код выхода
}
С использованием ООП этот код может немного увеличиться, однако при написании сложных приложений это может быть полезно:
class ClassMain { //Объявляем класс с названием ClassMain - рекомендую называть классы именно так - удобнее будет читать. Объекты (а именно - классы с конструкторами), если вы не пишете библиотеку, рекомендую называть ObjButton - с "Obj" в начале.
int main(){ //Дальше всё так-же
print("Hello, wold\n");
return 0;
}
}
Комментарии в Vala выглядят так:
//Однострочный комментарий
///Однострочный комментарий для документации
/* Многострочный комментарий */
/*
* Демонстрация
*/
/** Многострочный комментарий для документации **/
/**
* Демонстрация
**/
За компиляцию кода на vala отвечает такая программа, как valac — она парсит код в C (благодаря чему достигается скорость и простота создания привязок, о которых позже), а затем, пользуясь программой cc, компилирует готовый код. После она удаляет файлы .c, которые были сгенерированы во время парсинга.
А теперь о пакетах: библиотеки в vala являются ни чем иным, как отпарсенными в C библиотеками и привязками для них. Чтобы подключить такой пакет, достаточно передать компилятору аргумент --pkg имя_пакета
, после чего он станет доступен внутри приложения.
Вот так выглядит простая программа на Gtk:
using Gtk; //Работает как и в других языках
int main(string[] args){ //В отличие от предыдущих примеров, в программу можно передавать аргументы
Gtk.init(ref args); //Инициализируем GTK
var win = new Gtk.Window(); //Создаём окно
win.destroy.connect(Gtk.main_quit); //При закрытии окна будет завершаться процесс
var label = new Gtk.Label("Hello, world!"); //Создаём виджет для отображения текста, добавляя в него текст "Hello, world!"
win.add(label); //Добавляем виджет с предыдущей строки в окно (окно может содержать лишь один виджет. Для решения этой проблемы существует Gtk.Box
win.show_all(); //Рекурсивно отображаем все виджеты (включая окно) на экране. За постоянный рендеринг и обновление состояния отвечает GTK
Gtk.main(); //Запускаем GTK
return 0;
}
Для компиляции этого кода достаточно добавить аргумент --pkg gtk+-3.0
(или gtk+-2.0, если предпочитаете писать на Gtk 2, однако я пишу на Gtk 3, что и вам советую)
Выглядеть же оно будет вот так:

Чтобы результат назывался не именем случайного файла из компилируемых, а так, как вы захотите, достаточно передать аргумент -o имя_файла
.
В языке Vala нет такой директивы, как "#include" — для этой цели необходимо указать все файлы, которые необходимо скомпилировать. Wildcard'ы поддерживаются.
В Vala также присутствуют такие вещи, как дословные строки. Они работают так-же, как и в Python — в них можно использовать символ переноса строки (выводящийся клавишей return), а все ascii последовательности (включая \n) пишутся точно так-же, как их видно в коде.
Также существует способ вызывать пременные из строк. Для этого перед первой кавычкой необходимо поставить @
, а перед названием нужной переменной — $
. Не работает с дословными строками.
Решили начать писать на этом языке? Тогда Вам могут понадобиться следующие сайты:
ValaDoc — сборник документации для библиотек: https://valadoc.org
Офф. страница языка на вики gnome: https://wiki.gnome.org/Projects/Vala
Примеры приложений на Vala: https://wiki.gnome.org/Projects/Vala/Documentation#Sample_Code
P. S.: В данный момент последняя версия данного языка присутствует только под Linux.