Interested Article - Vala
- 2021-02-01
- 1
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)
Примечания
- . из оригинала 28 августа 2023 . Дата обращения: 19 августа 2023 .
- (англ.) . Дата обращения: 7 сентября 2011. 10 марта 2012 года.
- (англ.) . Дата обращения: 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 года.
- (англ.) .
- 2021-02-01
- 1