Pull to refresh

Что такое язык Vala и почему я его выбрал


В последнее время на каждом десктопе с ОС 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.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.