Vala
Vala | |
---|---|
![]() | |
Семантика | структурное, императивное, объектно-ориентированное программирование |
Класс языка | объектно-ориентированный |
Появился в | 2006 |
Автор | Йюрг Биллетер, Раффаэле Сандрини |
Разработчик | Jürg Billeter[вд] |
Расширение файлов | .vala или .vapi |
Выпуск | 0.57.0 (11 апреля 2023; 16 месяцев назад (2023-04-11)) |
Система типов | строгая, статическая |
Основные реализации | GNOME Desktop Project |
Испытал влияние | Си, C++, Groovy, Java, C# |
Лицензия | LGPL |
Сайт | vala.dev (англ.) |
ОС | кроссплатформенность |
![]() |
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[1]. Кроме того, имеются vapi-файлы для библиотек, поддерживаемые сторонними пользователями, пока не включенные в штатную поставку[2].
Существуют неофициальные сборки компилятора для ОС 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 — дистрибутив, разработчики которого большое внимание уделяют дизайну системы
- 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), работа ведется для других типов баз данных.
Расширенные примеры кода
Если у вас возникли проблемы с компиляцией примера, попробуйте последнюю версию 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
- Gee (Коллекции: lists, sets, maps, iterables)
- GIO (Ввод/вывод, файловые операции)
- Сжатие GIO (упаковка/распаковка файлов)
- Настройки GIO (Параметры приложения)
- Работа с сетью GIO (Работа с сетевыми сокетами)
- Примеры Soup (HTTP клиент / сервер)
- Базовые примеры работы с D-Bus клиент/сервер (Взаимодействие между процессами)
- Пример клиента D-Bus (пример клиента D-Bus "real world")
- Методы Async (использование специального синтаксиса Vala для асинхронных операций)
Интерфейс пользователя
- GTK+ (GUI toolkit)
- GTK+ Custom Widget Samples
- GTK+ Custom CellRenderer Samples
- GTK+ Drag and Drop
- GTK DnD Order ListBox widget by doublehourglass
- GDL Sample (Docking widgets)
- Mx Samples (MeeGo netbook UX toolkit)
- WebKit Sample (Embeddable web browser engine)
- StatusIcon Sample (Showing icons in the systray/notification area)
Мультимедиа и графика
- GStreamer Samples (Multimedia: Audio, Video)
- Cairo Sample (2D vector graphics)
- Clutter Sample (Animation framework)
- Pango Sample (Font rendering)
- Poppler Sample (PDF rendering)
- SDL Samples (Full screen graphics and game programming)
- OpenGL Samples (2D and 3D graphics)
- PulseAudio Samples (Audio playback)
GNOME платформа
- Gnome-Desktop и GMenu (Inspecting the application menu)
- Gedit 3.0 Plugin
Использование GLib
- Date and Time Sample
- IO Channels Sample
- List Sample
- MarkupParser Sample (Parsing simple XML files)
- Plugin Sample (Loading modules at runtime)
- Threading Samples (Concurrency and Synchronization)
- Unit Tests Sample
- Value Sample — динамический контейнер переменных
- TypeModule Sample
Работа с базами данных
- SQLite Sample
- PostgreSQL Sample
- GNOME Data Access library Sample
Разное
- Curses Sample (Terminal control library)
- GSF Sample (Deflating ZIP archives)
- GSL Samples (Numerical calculations)
- Input Samples
- Implementing Vala interfaces in C
- Loudmouth Sample (Jabber instant messaging)
- Lua Sample (Scripting)
- Tiff Sample (Image loading/saving)
- USB Sample
- XML Sample
- Json Sample
- 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)
Примечания
Интегрированная среда разработки
Редактор | Подсветка синтаксиса | Форматирование кода | Статический анализ кода | Авто-завершение | Перейти к определению | Комплексная документация | Интегрированная сборка, тестирование и отладка |
Anjuta | Yes | Yes | Yes | ||||
Atom | Yes | Yes | Yes | ||||
elementary OS Code | Yes | ||||||
Emacs | Yes | ||||||
Geany | Yes | Yes | Yes | ||||
gedit | Yes | Yes | |||||
GNOME Builder | Yes | Yes | Yes | Yes | Yes | ||
IntelliJ IDEA | Yes | ||||||
medit | Yes | ||||||
SublimeText | Yes | Basic | |||||
TextMate | Yes | Basic | |||||
Vim | Yes | Yes | Yes | ||||
Visual Studio Code | Yes | Yes | Yes | Yes | Yes | Partial Video("Vala Debug" on YouTube) | |
Kate | Yes |
В настоящее время существует 4 разрабатываемые реализации языкового сервера для Vala:
- benwaffle/vala-language-server
- davidmhewitt/vala-language-server
- Daniel Espinosa/GNOME Vala Language Server
- philippejer/vala-language-server-alpha (Работает с VS Code)
Другие инструменты
- Valadoc - генерирует документацию из VAPI, GIR и других файлов
- Gcovr - отчёты о покрытии кода, используйте ключ
--debug
сvalac
для включения номеров строк исходного файла - Uncrustify - авто-форматирование исходного кода
- vala-lint - проверяет код на соответствие правилам оформления кода от elementary — Code-Style guidelines
Ссылки
- The Vala Programming Language, on GNOME Live! (англ.) (23 августа 2011). — официальный сайт. Дата обращения: 16 августа 2011. Архивировано 10 марта 2012 года.
- Benchmark of Vala versus C# and C (англ.) (9 марта 2008). — A collections of some simples benchmarks written in Vala. Дата обращения: 2 мая 2009. Архивировано 10 марта 2012 года.
- valadoc.org (англ.). — Документация по языку Vala. Дата обращения: 9 февраля 2010. Архивировано 10 марта 2012 года.
- Учебник Vala на русском
- Учебник Vala (рус.). Дата обращения: 19 июля 2013.
- Снастин, Алексей Обзор языка программирования Vala. Часть 1: Общие свойства и характеристики языка Vala (рус.) (27 января 2010). Дата обращения: 9 февраля 2010. Архивировано 10 марта 2012 года.
- Часть 2. Объектно-ориентированное программирование на языке Vala (рус.) (4 февраля 2010). Дата обращения: 9 февраля 2010. Архивировано 10 марта 2012 года.
- Часть 3. Расширенные возможности языка Vala (рус.) (9 февраля 2010). Дата обращения: 9 февраля 2010. Архивировано 10 марта 2012 года.
- Что такое Vala (рус.) (23 июля 2010). Дата обращения: 31 июля 2010.
- Неофициальная сборка для ОС Windows (англ.) (16 августа 2011). Дата обращения: 16 августа 2011.
- Поддержка подключения библиотек написанных на C (англ.) (7 сентября 2011). Дата обращения: 17 сентября 2011. Архивировано 10 марта 2012 года.
- Сообщество в Google+ (англ.).