Vala — язык программирования, предназначенный для прикладного и системного программирования на основе библиотек GLib Object System (GObject) рабочей среды GNOME/GTK+. Язык был разработан Йюргом Биллетером (Jürg Billeter) и Раффаэле Сандрини (Raffaele Sandrini).
Vala | |
---|---|
![]() | |
Семантика | структурное, императивное, объектно-ориентированное программирование |
Класс языка | объектно-ориентированный язык программирования |
Появился в | 2006 |
Автор | Йюрг Биллетер, Раффаэле Сандрини |
Расширение файлов |
.vala или .vapi |
Выпуск | 0.56.3[1] (3 сентября 2022; 2 месяца назад (2022-09-03)) |
Система типов | строгая, статическая |
Основные реализации | GNOME Desktop Project |
Испытал влияние | Си, C++, Groovy, Java, C# |
Лицензия | LGPL |
Сайт | wiki.gnome.org/Projects/… |
ОС | кроссплатформенность |
![]() |
Vala по своему синтаксису очень похож на Java и полностью реализует объектно-ориентированный подход. Поддерживаются интроспекция, выведение типов, сборка мусора, основанная на подсчёте ссылок, лямбда-функции, концепция сигналов и слотов, подобная используемой в Qt, но реализованная на уровне языка, строковые типы, обобщённое программирование, срезы массивов, оператор перечисления элементов коллекции foreach, делегаты, замыкания, интерфейсы, свойства и исключения.
Особенность системы разработки состоит в том, что программа на Vala транслируется в программу на языке C, которая, в свою очередь, компилируется в исполняемый код целевой платформы со стандартными библиотеками C, Glib и выполняется со скоростью откомпилированного в объектный код целевой платформы приложения C. Чтобы получить транслируемый код на языке С, нужно указать параметр -C компилятору Vala. При наличии в программе графического интерфейса пользователя во время компиляции используется библиотека GTK+ (параметр --pkg gtk+-3.0 компилятора). Благодаря такому подходу откомпилированный код на Vala бинарно совместим с системными библиотеками, написанными на C. Для подключения сторонних библиотек к программам на языке Vala используются специальные vapi-файлы, в которых даётся описание интерфейса библиотеки. Для многих библиотек уже существуют vapi-файлы, входящие в штатную поставку компилятора Vala[2]. Кроме того, имеются vapi-файлы для библиотек, поддерживаемые сторонними пользователями, пока не включенные в штатную поставку[3].
Существуют неофициальные сборки компилятора для ОС Windows, поддерживаемые сторонними разработчиками.
Язык Vala был создан для эффективной разработки на платформе GNOME сложных прикладных и системных приложений с графическим интерфейсом пользователя, базирующимся на стандартной библиотеке GTK+, с применением современных языковых средств и техник программирования.
Объектно-ориентированный язык Java предоставляет программисту достаточно возможностей, но программы исполняются в виртуальных машинах, что делает невозможным прямое обращение к ним из бинарного кода на языке C, как и использование в таких программах системных низкоуровневых библиотек, таких как GObject. Поэтому этот язык, как и любые другие, исполняющие байт-код в виртуальных машинах, не может быть принят в рамках платформы GNOME. Управляемые приложения имеют также ограничения в производительности, что является критичным для работы некоторых программ (например, системных), которые должны исполняться в бинарном коде (ABI). Это и стало причиной появления нового языка Vala.
Простая программа «Hello, World»
void main()
{
print("Hello, World\n");
}
Программа «Hello, World», демонстрирующая объектно-ориентированный подход
class Sample
{
void run()
{
stdout.printf("Hello, World\n");
}
static int main(string[] args)
{
var sample = new Sample();
sample.run();
return 0;
}
}
Это пример использования 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 разрабатывается:
Если у вас возникли проблемы с компиляцией примера, попробуйте последнюю версию 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);
}
}
Редактор | Подсветка синтаксиса | Форматирование кода | Статический анализ кода | Авто-завершение | Перейти к определению | Комплексная документация | Интегрированная сборка, тестирование и отладка |
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:
--debug
с valac
для включения номеров строк исходного файла![]() GNOME | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Core Applications[en] |
| ||||||||||||||||
Приложения |
| ||||||||||||||||
Компоненты |
| ||||||||||||||||
Platform Architecture |
| ||||||||||||||||
Сообщество |
| ||||||||||||||||
Люди |
| ||||||||||||||||
|
![]() Языки программирования | |
---|---|
| |
|
![]() | |
---|---|
Версии |
|
ПО |
|
Связанное |
|