Habr
Last updated
Was this helpful?
Last updated
Was this helpful?
Предыдущая обзорная на хабре об этом языке была в 2011. Язык с тех пор окреп, обзавелся инструментарием, и я думаю самое время написать о нем подробнее.
Это моя первая статья на хабре и в ней я попытаюсь разобрать Vala максимально подробно, можно даже считать это гайдом т.к. Vala не особо выделяется синтаксисом от других Си подобных языков.
Чего в языке нет:
Мета-программирования
Ad-hoc полиморфизма
Compile Time Function Evaluation
Runtime GC
UB
А теперь о том что в языке есть:
... Спустя 40 минут после начала написания статьи я понял что статей будет несколько, конкретно эта будет обзорной, а остальные короткие и конкретные
Основы <- вы здесь
Системы типов
Управление памятью
C Interop
Библиотекb GLib
Библиотека GObject
Библиотека GIO
Библиотека Gee
Библиотека GTK
...
Остальные статьи будут маленькими.
В последнем примере используется альтернативный синтаксис, похожий на Python.
Запуск: vala filename
Компиляция: valac filename
Компиляция в C: valac -C filename
Вместе с .h файлом: valac filename -C -H hello.h
Пробросить флаг O3
в C компилятор: valac filename -X -O3
Скомпилировать используя только libc(многие фичи будут недоступны): valac filename --profile=posix
Скомпилировать с помощью вашего C компилятора: valac filename --cc=tcc
Синтаксис Vala будет очень хорошо знаком всем кто когда-нибудь видел любой C-подобный язык. Я не просто так привел первым примером копию hello world из C#. Языки крайне похожи, что может сильно упростить обучение, можно сказать вы уже знаете Vala и простенькие проги можно начать писать прочитав до этого места статьи. Знаю джависта который пришел в наше сообщество писать игровой движок в качестве хобби, по его словам он даже не заметил что пишет на другом языке.
Стилистика нейминга однако отличается, могу придумать 2 причины:
Совместимость с C где чаще используется snake_case
Использование различных *case для улучшения читабельности
C#
classes, structs, delegate types: CamelCase
methods, properties, events: CamelCase
local variables, fields: mixedCamelCase
constants, enum values: CamelCase
Java
classes, interfaces, enums: CamelCase
methods, local variables, fields: mixedCamelCase
constants, enum values: UPPER_CASE
Vala
classes, structs, delegate types: CamelCase
methods, properties, signals: lower_case
local variables, fields: lower_case
constants, enum values: UPPER_CASE
Основные управляющие структуры для протокола:
Switch работает со строками и проверяет наличие break.
Замечание для C-программистов: условия всегда должны возвращать логическое значение. Это значит, что если вы хотите проверить переменную на равенство null
или нулю, вы должны сделать это явно: if (object != null) { }
или if (number != 0) { }
.
Вы можете быть знакомы с этим по другим языкам
;
в Smalltalk
..
в Ruby, Dart
with
в visual basic
Синтаксис with был предпочтительным так как он будет близок к уже имеющимся стейтменту lock.
Пример с UI
Арифметика: +, -, /, *, %, +=, -=, /=, *=, %=, ++, --
Битовые операторы: или, исключающее или, и, не. Второе множество включает присвоение и аналогичные арифметические версии. Они могут быть применены к любому простому значению типов. (Нет оператора присвоение для ~, так как это унарный оператор. Эквивалентом является a=~a
): |, ^, &, ~, |=, &=, ^=
Побитовые сдвиги: <<, >>, <<=, >>=
Логические: ==, <, >, >=, <=, !=, !, &&, ||
Тернарный: ? :
Null оператор: a ?? b
эквивалентно a != null ? a : b
Этот оператор особенно полезен, например, для предоставление дефолтного в том случае, если ссылка равна null:
in проверяет на наличия элемента в коллекции
in, ??,
Планируется добавить .?
Не вижу особого смысла перечислять базовые типы, но вроде как сложилась традиция.
Struct: bool, char, double, float, int, int16, int32, int64, int8, intptr, long, short, size_t, ssize_t, time_t , uchar, uint, uint16, uint32, uint64, uint8, uintptr, ulong, unichar, unichar2, ushort, va_list
Class:
string — cstring(UTF-8)
string16 — UTF-16
string32 — Тип, который может содержать любой UTF-32 или UCS-4 символ, также известен как Unicode code point
Стандартный тип string является cstring для совместимости, для активной конкатенации есть тип StringBuilder.
В Vala используется строгая статическая типизация.
Присутствуют Value, Reference типы и Pure указатели для ручного контроля.
Здесь будет объяснение почему в предыдущем разделе были использованы слова Struct и Class вместо Value type, Reference Type
Дело в том что все типы в vala это биндинги к типам GLib. Это не значит что используя int мы имеем какой то overhead:
В vala очень продвинутая система биндингов к C коду, можно сказать vala на половину из нее состоит.
Тогда откуда тогда у взялись int методы?
Вот отсюда:
Все верно, даже базовые value типы на самом деле являются биндингами к типам GLib. То что тип содержит внутри себя функции это иллюзия из-за того что при биндинге их туда положили. Также здесь видно что некоторые функции отсутствующие в GLib пишут на месте(try_parse
).
--------------
СПОЙЛЕР
На самом деле никаких строенных конкретно в Vala типов нет, хотя их можно так назвать. Все типы это биндинги к GLib, по сути в Vala нет ничего кроме высокоуровневых биндингов к GLib, подробнее об этом я расскажу позже, но вот пример того как внутри выглядит начало типа int для затравки:
Вот список некоторых типов из GLib просто чтобы пробежаться глазами, самые скучные я удалил.
Про Slice аллокатор
C++
Vala
ARC
Compact класс с ARC
Compact класс с копированием
Примеры передачи владения
Arch: yay -S vala
Fedora: sudo dnf install vala
CentOS: sudo yum install vala
Debian: sudo apt install valac
MSYS2:
brew install vala
Termux: pkg install vala
Vala каким либо образом зависит от GTK
Нет, только от GLib, о ней будет отдельная статья, вкратце GLib полностью кроссплатформенна, её можно найти в Qt, Android, Windows (dll на Windows весит 2 МБ) и даже на QNX:
Также можно генерировать код без зависимостей, тогда не будет классов, зато есть vapi для posix
Есть PR на добавление compact классов.
В Vala используется строгая статическая типизация.
Присутствуют Value и Reference типы
Но также есть возможность использовать pure указатели
базовые типы данных, строки, массивы, срезы nullability
Функции, делегаты, ref, out, проверки на нулл, ООП ARC, owned unowned дженерики, наследование от дженериков
С интероп, Vapi, фичи при си интеропе вроде noReturn GIR интероп(тут рассказать про GObject)
Кодогенерация with, regexp, async, [Flag] enum, Variable(с toJsonом),
Vala является в C, поэтому флаги соответствующие.
В Vala поддерживается
Было добавлено в PR
GLib structs: , , , , , , , , , , , , , , , , , , , , , , .
GLib classes: , , , , , , , , , , , , (Lexical) , , , , , , , , .
Для старых deb подобных дистрибутивов есть репа где публикуются последние версии.