Vala — язык программирования, предназначенный для прикладного и системного программирования на основе библиотек GLib Object System (GObject) рабочей среды GNOME/GTK+. Язык был разработан Йюргом Биллетером (Jürg Billeter) и Раффаэле Сандрини (Raffaele Sandrini).
Vala | |
---|---|
Семантика | структурное, императивное, объектно-ориентированное программирование |
Класс языка | объектно-ориентированный |
Появился в | 2006 |
Автор | Йюрг Биллетер, Раффаэле Сандрини |
Разработчик | Jürg Billeter[вд] |
Расширение файлов |
.vala или .vapi |
Выпуск | 0.57.0 (11 апреля 2023 ) |
Система типов | строгая, статическая |
Основные реализации | GNOME Desktop Project |
Испытал влияние | Си, C++, Groovy, Java, C# |
Лицензия | LGPL |
Сайт | vala.dev (англ.) |
ОС | кроссплатформенность |
Медиафайлы на Викискладе |
Основные особенности
править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
Работа с базами данных
правитьРазное
править- 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)
Примечания
править- ↑ Bindings Status (англ.). Дата обращения: 7 сентября 2011. Архивировано 10 марта 2012 года.
- ↑ External Bindings (англ.). Дата обращения: 7 сентября 2011. Архивировано 10 марта 2012 года.
Интегрированная среда разработки
правитьРедактор | Подсветка синтаксиса | Форматирование кода | Статический анализ кода | Авто-завершение | Перейти к определению | Комплексная документация | Интегрированная сборка, тестирование и отладка |
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:
Другие инструменты
править- 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+ (англ.).