Interested Article - Vala

Vala язык программирования , предназначенный для прикладного и системного программирования на основе библиотек GLib Object System ( GObject ) рабочей среды GNOME / GTK+ . Язык был разработан Йюргом Биллетером (Jürg Billeter) и Раффаэле Сандрини (Raffaele Sandrini).

Основные особенности

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

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

Существуют неофициальные сборки компилятора для ОС Windows , поддерживаемые сторонними разработчиками.

Причины создания

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

Объектно-ориентированный язык Java предоставляет программисту достаточно возможностей, но программы исполняются в виртуальных машинах , что делает невозможным прямое обращение к ним из бинарного кода на языке C , как и использование в таких программах системных низкоуровневых библиотек, таких как GObject. Поэтому этот язык, как и любые другие, исполняющие байт-код в виртуальных машинах, не может быть принят в рамках платформы GNOME . Управляемые приложения имеют также ограничения в производительности, что является критичным для работы некоторых программ (например, системных), которые должны исполняться в бинарном коде ( ABI ). Это и стало причиной появления нового языка Vala.

Примеры кода

Пример № 1

Простая программа « Hello, World »

void main()
{
    print("Hello, World\n");
}

Пример № 2

Программа « Hello, World », демонстрирующая объектно-ориентированный подход

class Sample
{
    void run()
    {
        stdout.printf("Hello, World\n");
    }
 
    static int main(string[] args)
    {
        var sample = new Sample();
        sample.run();
        return 0;
    }
}

Пример № 3

Это пример использования GTK+ для создания GUI -программ на языке Vala:

using Gtk;
 
int main(string[] args)
{
    Gtk.init(ref args);
 
    var window = new Window();
    window.title = "Hello, World!";
    window.border_width = 10;
    window.window_position = WindowPosition.CENTER;
    window.set_default_size(350, 70);
    window.destroy.connect(Gtk.main_quit);
 
    var label = new Label("Hello, World!");
 
    window.add(label);
    window.show_all();
 
    Gtk.main();
    return 0;
}

Применение

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

  • Elementary OS — дистрибутив, разработчики которого большое внимание уделяют дизайну системы
  • — нативное приложение для GNU/Linux , которое по замыслу создателей должно стать основным инструментом UX-протипирования и разработки для пользователей свободного программного обеспечения
  • — почтовый клиент
  • Budgie — графическая оболочка на базе GTK+
  • — библиотека коллекций
  • — Веб-фреймворк по модели MVC . создания простого блога.
  • — Веб-фреймворк
  • — обертка написанной на си библиотеки , которая предоставляет единый набор подключаемых API-интерфейсов, определенных как можно более универсальными, чтобы через них можно было получить доступ к любому типу источника данных ( базы данных , , почтовые пулы). На данный момент поддерживает SQLite (и SQLCipher), MySQL , PostgreSQL , MSAccess , Berkeley Db (и является расширением SQL), Oracle и JDBC (разрешает доступ к любой базе данных через драйвер JDBC ), работа ведется для других типов баз данных.


Расширенные примеры кода

Если у вас возникли проблемы с компиляцией примера, попробуйте последнюю версию Vala.

Характеристики языка и вводные примеры

Основные примеры

Простой Hello, World:

void main () {
    print ("Hello, world\n");
}

Компиляция и запуск:

$ valac hello.vala

$ ./hello

В режиме "скриптинга":

#!/usr/bin/vala
print ("hello, world\n");

Запуск: сделать файл исполнительным использовать команду vala (тогда первая строчка не обязательна)

$ vala hello.vala

Чтение ввода пользователя
void main () {
    stdout.printf ("Введите свое имя: ");
    string name = stdin.read_line ();
    stdout.printf (@"Привет, $name!\n");
}
Чтение и запись в файл

Это очень простая обработка текстовых файлов. Для продвинутого ввода/вывода используйте .

void main () {
    try {
        // Запись
        string content = "hello, world";
        FileUtils.set_contents (data.txt, content);

        // Чтение
        string read;
        FileUtils.get_contents (filename, out read);

        stdout.printf (@"The content of file '$filename' is:\n$read\n");
    } catch (FileError e) {
        stderr.printf (@"$(e.message)\n");
    }
}
Порождение процессов
void main () {
    try {
        // Non-blocking
        Process.spawn_command_line_async ("ls");

        // Blocking (waits for the process to finish)
        Process.spawn_command_line_sync ("ls");

        // Blocking with output
        string standard_output, standard_error;
        int exit_status;
        Process.spawn_command_line_sync ("ls", out standard_output,
                                               out standard_error,
                                               out exit_status);
        //print output of process exec
        stdout.printf (standard_output);
    } catch (SpawnError e) {
        stderr.printf ("%s\n", e.message);
    }
}

Продвинутый пример

/* class derived from GObject */
public class AdvancedSample : Object {

    /* automatic property, data field is implicit */
    public string name { get; set; }

    /* signal */
    public signal void foo ();

    /* creation method */
    public AdvancedSample (string name) {
        this.name = name;
    }

    /* public instance method */
    public void run () {
        /* assigning anonymous function as signal handler */
        this.foo.connect ((s) => {
            stdout.printf ("Lambda expression %s!\n", this.name);
        });

        /* emitting the signal */
        this.foo ();
    }

    /* application entry point */
    public static int main (string[] args) {
        foreach (string arg in args) {
            var sample = new AdvancedSample (arg);
            sample.run ();
            /* "sample" is freed as block ends */
        }
        return 0;
    }
}

Работа со строками

  • void println (string str) {
        stdout.printf ("%s\n", str);
    }
    
    void main () {
    
        /* Strings are of data type 'string' and can be concatenated with the plus
         * operator resulting in a new string:
         */
    
        string a = "Concatenated ";
        string b = "string";
        string c = a + b;
        println (c);
    
        /* If you want to have a mutable string you should use StringBuilder.
         * With its help you are able to build strings ad libitum by prepending,
         * appending, inserting or removing parts. It's faster than multiple
         * concatenations. In order to obtain the final product you access the
         * field '.str'.
         */
    
        var builder = new StringBuilder ();
        builder.append ("built ");
        builder.prepend ("String ");
        builder.append ("StringBuilder");
        builder.append_unichar ('.');
        builder.insert (13, "by ");
        println (builder.str);      // => "String built by StringBuilder."
    
        /* You can create a new string according to a format string by calling the
         * method 'printf' on it. Format strings follow the usual rules, known from
         * C and similar programming languages.
         */
    
        string formatted = "PI %s equals %g.".printf ("approximately", Math.PI);
        println (formatted);
    
        /* Strings prefixed with '@' are string templates. They can evaluate
         * embedded variables and expressions prefixed with '$'.
         * Since Vala 0.7.8.
         */
    
        string name = "Dave";
        println (@"Good morning, $name!");
        println (@"4 + 3 = $(4 + 3)");
    
        /* The equality operator compares the content of two strings, contrary to
         * Java's behaviour which in this case would check for referential equality.
         */
    
        a = "foo";
        b = "foo";
        if (a == b) {
            println ("String == operator compares content, not reference.");
        } else {
            assert_not_reached ();
        }
    
        /* You can compare strings lexicographically with the < and > operators: */
    
        if ("blue" < "red" && "orange" > "green") {
            // That's correct
        }
    
        // Switch statement
    
        string pl = "vala";
        switch (pl) {
        case "java":
            assert_not_reached ();
        case "vala":
            println ("Switch statement works fine with strings.");
            break;
        case "ruby":
            assert_not_reached ();
        }
    
        /* Vala offers a feature called verbatim strings. These are strings in
         * which escape sequences (such as \n) won't be interpreted, line breaks
         * will be preserved and quotation marks don't have to be masked. They are
         * enclosed with triple double quotation marks. Possible indentations
         * after a line break are part of the string as well. Note that syntax
         * highlighting in this Wiki is not aware of verbatim strings.
         */
    
        string verbatim = """This is a so-called "verbatim string".
    Verbatim strings don't process escape sequences, such as \n, \t, \\, etc.
    They may contain quotes and may span multiple lines.""";
        println (verbatim);
    
        /* You can apply various operations on strings. Here's a small selection: */
    
        println ("from lower case to upper case".up ());
        println ("reversed string".reverse ());
        println ("...substring...".substring (3, 9));
    
        /* The 'in' keyword is syntactic sugar for checking if one string contains
         * another string. The following expression is identical to
         * "swordfish".contains ("word")
         */
    
        if ("word" in "swordfish") {
            // ...
        }
    
        // Regular expressions
    
        try {
            var regex = new Regex ("(jaguar|tiger|leopard)");
            string animals = "wolf, tiger, eagle, jaguar, leopard, bear";
            println (regex.replace (animals, -1, 0, "kitty"));
        } catch (RegexError e) {
            warning ("%s", e.message);
        }
    }
    

Основы: Коллекции, файлы, ввод/вывод, работа с сетью, IPC

  • (Коллекции: lists, sets, maps, iterables)
  • (Ввод/вывод, файловые операции)
  • (упаковка/распаковка файлов)
  • (Параметры приложения)
  • (Работа с сетевыми сокетами)
  • (HTTP клиент / сервер)
  • (Взаимодействие между процессами)
  • (пример клиента D-Bus "real world")
  • (использование специального синтаксиса Vala для асинхронных операций)

Интерфейс пользователя

  • (GUI toolkit)
  • by doublehourglass
  • (Docking widgets)
  • (MeeGo netbook UX toolkit)
  • (Embeddable web browser engine)
  • (Showing icons in the systray/notification area)

Мультимедиа и графика

  • (Multimedia: Audio, Video)
  • (2D vector graphics)
  • (Animation framework)
  • (Font rendering)
  • (PDF rendering)
  • (Full screen graphics and game programming)
  • (2D and 3D graphics)
  • (Audio playback)

GNOME платформа

  • (Inspecting the application menu)

Использование GLib

  • (Parsing simple XML files)
  • (Loading modules at runtime)
  • (Concurrency and Synchronization)
  • — динамический контейнер переменных

Работа с базами данных

Разное

  • (Terminal control library)
  • (Deflating ZIP archives)
  • (Numerical calculations)
  • (Jabber instant messaging)
  • (Scripting)
  • (Image loading/saving)
  • Shared Library Sample and how to call Vala code using GObject introspection
  • WIN32 Cross Build Sample
  • Using GUPnP
  • Deprecated Samples (Examples using deprecated libraries such as GNOME 2 panel applets)

Примечания

  1. . из оригинала 28 августа 2023 . Дата обращения: 19 августа 2023 .
  2. (англ.) . Дата обращения: 7 сентября 2011. 10 марта 2012 года.
  3. (англ.) . Дата обращения: 7 сентября 2011. 10 марта 2012 года.

Интегрированная среда разработки

Редактор Подсветка синтаксиса Форматирование кода Статический анализ кода Авто-завершение Перейти к определению Комплексная документация Интегрированная сборка, тестирование и отладка
Anjuta Yes Yes Yes
Atom
Yes
Emacs
Geany Yes Yes Yes
gedit Yes
Yes Yes Yes Yes
IntelliJ IDEA
medit Yes
SublimeText
TextMate
Vim
Visual Studio Code Video("Vala Debug" on YouTube)
Kate Yes

В настоящее время существует 4 разрабатываемые реализации языкового сервера для Vala:

  • (Работает с VS Code)

Другие инструменты

  • - генерирует документацию из VAPI, GIR и других файлов
  • - отчёты о покрытии кода, используйте ключ --debug с valac для включения номеров строк исходного файла
  • - авто-форматирование исходного кода
  • - проверяет код на соответствие правилам оформления кода от elementary —

Ссылки

  • (англ.) (23 августа 2011). — официальный сайт. Дата обращения: 16 августа 2011. 10 марта 2012 года.
  • (англ.) (9 марта 2008). — A collections of some simples benchmarks written in Vala. Дата обращения: 2 мая 2009. 10 марта 2012 года.
  • (англ.) . — Документация по языку Vala. Дата обращения: 9 февраля 2010. 10 марта 2012 года.
  • на русском
  • . Дата обращения: 19 июля 2013.
  • Снастин, Алексей (27 января 2010). Дата обращения: 9 февраля 2010. 10 марта 2012 года.
    • (4 февраля 2010). Дата обращения: 9 февраля 2010. 10 марта 2012 года.
    • (9 февраля 2010). Дата обращения: 9 февраля 2010. 10 марта 2012 года.
  • (23 июля 2010). Дата обращения: 31 июля 2010.
  • (англ.) (16 августа 2011). Дата обращения: 16 августа 2011.
  • (англ.) (7 сентября 2011). Дата обращения: 17 сентября 2011. 10 марта 2012 года.
  • (англ.) .
Источник —

Same as Vala