В последнее время на каждом десктопе с ОС GNU/Linux и X-сервером установлены такие библиотеки, как GTK, GLib, GIO и прочие. Они являются наиболее часто используемыми библиотеками в пользовательской среде. Чтобы в этом убедиться, достаточно позапускать несколько программ с аргументом --help. На выходе увидим примерно следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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.
РЕКОМЕНДУЕМ:
Язык программирования Julia
Изначально данные библиотеки написаны для языка 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 на этом языке выглядит так:
1 2 3 4 |
int main(){ //Объявляем функцию main, возвращающую значение типа int - код выхода. print("Hello, world\n"); //Печатаем текст "Hello, world" - как и в С, символ \n на конце требуется return 0; //Возвращаем 0 в качестве кода выхода. В отличие от С, если вы указали тип int для функции main (а она может быть только int и void), требуется возвращать код выхода } |
С использованием ООП этот код может немного увеличиться, однако при написании сложных приложений это может быть полезно:
1 2 3 4 5 6 7 |
class ClassMain { //Объявляем класс с названием ClassMain - рекомендую называть классы именно так - удобнее будет читать. Объекты (а именно - классы с конструкторами), если вы не пишете библиотеку, рекомендую называть ObjButton - с "Obj" в начале. int main(){ //Дальше всё так-же print("Hello, wold\n"); return 0; } } |
Комментарии в Vala выглядят так:
1 2 3 4 5 6 7 8 9 10 11 12 |
//Однострочный комментарий ///Однострочный комментарий для документации /* Многострочный комментарий */ /* * Демонстрация */ /** Многострочный комментарий для документации **/ /** * Демонстрация **/ |
За компиляцию кода на vala отвечает такая программа, как valac — она парсит код в C (благодаря чему достигается скорость и простота создания привязок, о которых позже), а затем, пользуясь программой cc, компилирует готовый код. После она удаляет файлы .c, которые были сгенерированы во время парсинга.
РЕКОМЕНДУЕМ:
Язык программирования Ада
А теперь о пакетах: библиотеки в vala являются ни чем иным, как отпарсенными в C библиотеками и привязками для них. Чтобы подключить такой пакет, достаточно передать компилятору аргумент --pkg имя_пакета, после чего он станет доступен внутри приложения.
Вот так выглядит простая программа на Gtk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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