Лучшие вопросы
Таймлайн
Чат
Перспективы

Vala

Из Википедии, свободной энциклопедии

Vala
Remove ads

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

Краткие факты Семантика, Класс языка ...
Remove ads

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

Суммиров вкратце
Перспектива

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

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

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

Remove ads

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

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

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

Remove ads

Примеры кода

Пример № 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 — дистрибутив, разработчики которого большое внимание уделяют дизайну системы
  • Akira — нативное приложение для GNU/Linux, которое по замыслу создателей должно стать основным инструментом UX-протипирования и разработки для пользователей свободного программного обеспечения
  • Geary — почтовый клиент
  • Budgie — графическая оболочка на базе GTK+
  • Gee — библиотека коллекций
  • Ambition — Веб-фреймворк по модели MVC. Пример создания простого блога.
  • Valum — Веб-фреймворк
  • VDA — обертка написанной на си библиотеки GDA, которая предоставляет единый набор подключаемых API-интерфейсов, определенных как можно более универсальными, чтобы через них можно было получить доступ к любому типу источника данных (базы данных, информационные серверы, почтовые пулы). На данный момент поддерживает SQLite (и SQLCipher), MySQL, PostgreSQL, MSAccess, Berkeley Db (и является расширением SQL), Oracle и JDBC (разрешает доступ к любой базе данных через драйвер JDBC), работа ведется для других типов баз данных.
Remove ads

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

Суммиров вкратце
Перспектива

Если у вас возникли проблемы с компиляцией примера, попробуйте последнюю версию 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");
}
Чтение и запись в файл

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

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

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

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

GNOME платформа

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

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

Разное

Remove ads

Примечания

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

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

Ссылки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads