Вышла новая версия транслятора языка программирования Vala 0.51.1. Язык Vala является объектно-ориентированным языком программирования, предоставляет синтаксис, подобный языкам C# или Java. В качестве объектной модели используется Gobject (Glib Object System). Управление памятью осуществляется на основании подсчёта ссылок...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=54584
Хороший язык здорового программиста.
Слишком ориентирован на gtk+ экосистему, за это низачот.
Нормальной работы С++ и QT нету.
Никто не может нормально работать с C++/Qt. Если думаешь что это может к примеру D то это неверно, хелловорды работают, а более сложные кейсы уже нет. Как пруф - посмотри как сделаны бинды к Qt для Go и Crystal -- просто обернули все в C API генераторами и вызывают по FFI.К GTK Vala гвоздями не прибита, GLib это отдельная от GTK часть(по сути когда то давно GTK сильно разрослось и из него выделелась в отдельный проект часть не связанная с GUI, также было у WxWidgets). Кстати GLib полностью кроссплатформенна.
> Нормальной работы С++ и QT нету.в Qt нету нормальной работы ни с чем, кроме с++.
Python - PyQt
это ужас, только для хеловорлдов.
Да ладно: говорим AI, подразумеваем Python.
Брат-близнец vlang-a?
> Брат-близнец vlang-a?Да, только в отличии от vlang-a не такой смешной, появился в 2006 и юзался нокией для Maemo ( https://books.google.ru/books?id=9868DwAAQBAJ&pg=PA7&lpg=PA7... )
Синтаксически это такой C# или по желанию Python(Genie), который транслируется в C и использует в качестве STD GLib.
Runtime GC нет, память менеджит либо по владению (owned/unowned ссылки) либо через ARC(подставляет вызовы деструкторов(или дикремент счетчика ссылок) на этапе компиляции), но в этом случае нужно вручную фиксить циклические ссылки делая одну из них weak (если A -> B, и B -> A, то в одном из классов нужно добавить weak модификатор). Из этого следует что память полностью менеджится на этапе компиляции и объекты дохнут детерменированно, а значит для всего(вроде открытых сокетов/дескрипторов файлов) работает RAII.
Из-за GIR( https://gi.readthedocs.io/en/latest/ )(то почему GTK есть для всех языков) можно использовать из любого языка бесплатна получая высокоуровневые бинды.
Можно заставить генерировать чистый C без GLib, но тогда ООП пропадает (есть PR чтоб продолжили работать Compact классы)Куда высокоуровневее zig/odin/jai, так что это не замена С, я бы сказал что это такая смесь Java/C#/Go с очень простым вызовом C кода (кстати при бинде C либ ресурсами Vala управляет также как и своими, никакого unsafe). Перешел 2 года назад с Qt на Vala + GTK.
Синтаксис хуже котлина в 10 раз, хуже в 5 раз раста, в 2,5 чем С++ 2020.
Перечисли ещё языки, которые ты хотел бы знать, но башка слишком тупая
Спасибо, твой коммент побудил меня глянуть синтаксис - вполне приятный классический синтаксис, надо будет поюзать где-нибудь.
Очень рад что кому то в СНГ сообществе не пофиг на валу настолько что не поленился перевести изменения не мажорного релиза.
Думаю некоторые пункты требуют пояснений.>type narrowing
Теперь если на тип была сделана проверка, то внутри этой проверки объект будет автоматически приведен к данному типу
if (x is Obj) {x.ObjField вместо (x as Obj).ObjField}>Добавлена поддержка "непрозрачных" (opaque) компактных классов;
Compact классы нужны добавления OOP к C библиотекам при биндах к Vala или просто для оптимизации производительности. По сути это легковесные классы с хитрым slice аллокатором, почитать него можно тут же на опеннете (https://www.opennet.dev/docs/RUS/glib_api/glib-Memory-Slices.... ).
Так вот раньше такие были крайне ограничены в функционале, по сути там были только публичные поля и функции, теперь возможны private, internal, и свойства.
Можете порекомендовать готовые примеры/самоучитель по Vala?
Вот тут коллекция ссылок.
https://wiki.gnome.org/Projects/Vala/Documentation
Взял пример отсюда: https://wiki.gnome.org/Projects/Vala/GTKSample
Сделал так: valac --pkg gtk4 program_test_01.valaСыпануло ошибками. Есть ли готовые руководства по программированию GTK4 на Vala?
program_test_01.vala:4.5-4.23: error: 1 extra arguments for `void Gtk.init ()'
Gtk.init (ref args);
^^^^^^^^^^^^^^^^^^^
program_test_01.vala:8.5-8.23: error: The name `border_width' does not exist in the context of `Gtk.Window' (gtk4)
window.border_width = 10;
^^^^^^^^^^^^^^^^^^^
program_test_01.vala:9.5-9.26: error: The name `window_position' does not exist in the context of `Gtk.Window' (gtk4)
window.window_position = WindowPosition.CENTER;
^^^^^^^^^^^^^^^^^^^^^^
program_test_01.vala:11.5-11.26: error: The name `connect' does not exist in the context of `Gtk.Window.destroy'
window.destroy.connect (Gtk.main_quit);
^^^^^^^^^^^^^^^^^^^^^^
program_test_01.vala:18.5-18.14: error: The name `add' does not exist in the context of `Gtk.Window' (gtk4)
window.add (button);
^^^^^^^^^^
program_test_01.vala:19.5-19.19: error: The name `show_all' does not exist in the context of `Gtk.Window' (gtk4)
window.show_all ();
^^^^^^^^^^^^^^^
program_test_01.vala:21.5-21.12: error: The name `main' does not exist in the context of `Gtk' (gtk4)
Gtk.main ();
^^^^^^^^
Compilation failed: 7 error(s), 0 warning(s)
Пример, который Вы пытались собрать, применим только к GTK3+, и не будет собираться с GTK4. Скорее всего руководства нет, есть гид по миграции с GTK3+ на GTK4 (https://developer.gnome.org/gtk4/unstable/gtk-migrating-3-to...), но для C. Можно попытаться воспользоваться им, смотря что поменялось для C, и соответственно заменяя или используя другие подходы для Vala.
Примеры с GTK 4 есть вот тут https://github.com/aeldemery?tab=repositories
Благодарю. Всё работает.Есть ли надежды на некий базовый туториал по программированию GNOME + GTK4 на Vala?
А как с поддержкой платформ, отличных от Linux?
Qt ведь поддерживает полноценно Windows/macOS
Есть поддержка и Windows https://wiki.gnome.org/Projects/Vala/ValaOnWindows и macOS https://wiki.gnome.org/Projects/Vala/ValaOnOSX
GLib - кроссплатформенна.
Хороший язык, всем хорош, кроме излишней завязки на гтк.
> Хороший язык, всем хорош, кроме излишней завязки на гтк.Завязки на GTK нет, по дефолту единственной зависимостью является GLib которая полностью кроссплатформена(можете попробовать на своем телефоне через Termux или Windows через msys2)
Если компилировать --profile=posix то будет генерироваться чистый С с единственной зависимостью libc вашего дистрибутива. Совместив это с биндингами к WINAPI или POSIX ( https://valadoc.org/posix/index.htm ) можно писать замечательный платформо зависимый код, правда эту и множество других проблем за вас решает GLib ( https://www.opennet.dev/docs/RUS/glib_api/ ).
А что там с поддержкой XML?Ну то есть я вижу GXml, а не то, это реализация DOM4.
Вижу libxml2 - это вообще конченная... FFFFFFUUU~~~ (простите у меня вьетнамские флешбеки от этой либы)Если есть тут люди писавшие на vala дальше чем хелловорлд, подскажите есть ли в Vala поддержка современного Xpath 2.1 / Xslt 3.0 ? Если там libxml2 вместо мозгов, то очевидно что нет. Но GXml вроде реализует свежий DOM...
Или вот еще. Есть XML-документы, точнее поток сериализованных XML-объектов. Я их хочу трансформировать и десериализовать внутрь своих типов на языке Vala. Я могу это сделать? Или мне надо для этого пердолиться в DOM как это делают всякие питонисты?
И наоборот, поддерживает ли XML-сериализатор аннотирование так чтобы я могу рулить элементами и атрибутами, чтобы получить желаемый формат документа при сериализации. DOM не предлагать.
А, то есть, Java и .Net уже непопулярный энтерпрайз?!Да и вообще, вам точно нужен XML?
> Да и вообще, вам точно нужен XML?Да, по двум причинам:
1. Я не могу исправить/переписать софт который это шлёт. Теоретически это возможно, но чисто технически это невменяемый объем беспричинных изменений.
2. Если есть "обмен", это когда 2 энтерпрайзные соплекухи на бекендах шлют поток взаимосвязанных объектов разной степени упитанности, то SOAP и XML это правильный выбор.> А, то есть, Java и .Net уже непопулярный энтерпрайз?!
.Net прекрасно решает все эти задачи до тех пор пока тебе не нужно писать портянки на Xpath 1.0, видимо Vala и весь GNOME точно также как и MS со своим Windows и .Net намертво застрял в старых версиях XML, потому что обновиться сложно... от этого полетит .Net Standard и зависимости Windows от этого API и вообще они отказались обновляться причем заявили об этом публично. Да, в Java поддержка XML в разы лучше, но зато там всё остальное... Vala + GTK даст твоему приложению нормальный интерфейс. Java кроме вебни в томкате выглядит и работает так, что пользователю такое не поставишь.
Не ну чисто теоретически можно их подружить отделив и переписав куски бекенда на Java, но это не упростит работу а усложнит.
Мне просто любопытно, есть ли смысл соваться в Vala, которая сильно-сильно похожа на C#, или это маленький язык для написания приложений типа Часы и Календарь в GNOME3?...
>или это маленький язык для написания приложений типа Часы и Календарь в GNOME3Давайте приведу пару не часов и календарей
1) Ядро Frida( https://github.com/frida/frida frida-core) https://frida.re/ это такой дизасемблер с возможностью скриптинга на разных языках(как раз из-за GIR)
2) Akira ( https://github.com/akiraux/Akira/pull/485 ) сейчас в активной разработке, будет векторным редактором ориентированным на дизайнеров UI.
3) Planner ( https://github.com/alainm23/planner ) лучшая тудушка под линь из нативный, синхронит с Todoist
4) Coanda ( https://coanda.ca/ ), довольно большая АСУТП компания содержит в своих репах Vala код, в том числе SCADA систему. ( https://github.com/coanda?q=&type=&language=vala )
5) Dino ( https://github.com/dino/dino ) Jabber клиент
6) https://www.ev3dev.org/ любители перепрошить лего на дебиан( https://github.com/ev3dev/ev3devKit ), а также их brickman и grx-widgets(виджеты под чернобелые маленькие экраны) написаны на Vala
7) https://documatrix.com/ Компания специализируется на обработке документов, к сожелению большая часть софта закрыта, но в открытой видно что они используют достаточно много Vala ( https://github.com/documatrix?q=&type=&language=vala ) и она обновляется.
8) https://birdfont.org/ Программа для создания шрифтов ( https://github.com/johanmattssonm/birdfont ), кстати у них своя XML либа, тоже на Vala( https://github.com/johanmattssonm/xmlbird )
9) Rygel достаточно большое медиа-решение, у автора есть данные что оно используется некоторыми автопроизводителями https://wiki.gnome.org/Projects/Rygel/Development сурсы https://gitlab.gnome.org/GNOME/rygel/
10) DE Elementary OS и Budgie
11) Во времена N900 Nokia использовала Vala для интерфейсов, у нас сохранились биндинги к их UI фреймворку Hildon https://valadoc.org/hildon-1/Hildon.html https://valadoc.org/hildon-fm-2/Hildon.htmlТакже заявили что используют Vala, но код закрыт компании: https://www.untangle.com/ https://www.cablelabs.com/ https://www.realmacsoftware.com/
Да, GXml неплоха, кстати целиком написана на Vala ( https://gitlab.gnome.org/GNOME/gxml ) не нравится забиндите любую понравившуюся либу поддерживающую C FFI, благо это довольно просто.Вот пример ( https://gitlab.com/gavr123456789/xml-object-mapping-example ) её использования двумя способами, оба делают одно и тоже, достают отсюда ( http://www.cbr.ru/scripts/XML_daily.asp ) курс Гонконгских долларов.
Первый способ мапит объекты XML на объекты Vala(строка 44), второй способ использует упомянутый вами Xpath(строка 12)
Наткнулся на такую особенность:int main(string[] args) {
var arr = new int[1] {1, 2, 3};
int[1] arr2 = {1, 2, 3};
stdout.printf("Length of arr = %d\n", arr.length);
stdout.printf("Length of arr2 = %d\n", arr2.length);return 0;
}$ vala main.vala
Length of arr = 1
Length of arr2 = 3$ valac --version
Vala 0.48.6
>[оверквотинг удален]
> int[1] arr2 = {1, 2, 3};
> stdout.printf("Length of arr = %d\n", arr.length);
> stdout.printf("Length of arr2 = %d\n", arr2.length);
> return 0;
> }
> $ vala main.vala
> Length of arr = 1
> Length of arr2 = 3
> $ valac --version
> Vala 0.48.6v.vala:3.5-3.10: error: syntax error, no expression allowed between array brackets
int[1] arr2 = {1, 2, 3};
^^^^^^
Compilation failed: 1 error(s), 0 warning(s)valac --version
Vala 0.50.3
int[] arr в стиле C# - массив на куче, в него можно динамически добавлять данные через arr += 2;
int arr[] в стиле C - массив на стеке
Предполагаю что на твоей старой версии компилятора массив просто расширился чтобы вместить 3 элемента.
Почему-то по-разному вывел размер массива (main.c):
...
_tmp0_ = g_new0 (gint, 1);
_tmp0_[0] = 1;
_tmp0_[1] = 2;
_tmp0_[2] = 3;
arr = _tmp0_;
arr_length1 = 1;
_arr_size_ = arr_length1;
_tmp1_ = g_new0 (gint, 3);
_tmp1_[0] = 1;
_tmp1_[1] = 2;
_tmp1_[2] = 3;
arr2 = _tmp1_;
arr2_length1 = 3;
_arr2_size_ = arr2_length1;
...Но компилятор таки надо будет попробовать посвежее, ага.
А свежие версии только из исходников компилить? В ppa тоже старая версия.
Написал разрабу в IRC, обновил https://launchpad.net/~vala-team/+archive/ubuntu/next
Отлично, спасибо! (хоть я и собрал таки уже из исходников)
Погляжу поближе, что он из себя представляет.
>int arr[] в стиле C - массив на стекеmain.vala:
int main(string[] args) {
int arr3[] = {1, 2, 3};
return 0;
}main.c:
...
gint arr3[3] = {0};
gint _tmp0_[3] = {0};
FILE* _tmp1_;
gint result = 0;
_tmp0_[0] = 1;
_tmp0_[1] = 2;
_tmp0_[2] = 3;
memcpy (arr3, _tmp0_, 3 * sizeof (gint));
...
Хм, и они говорят, что нет оверхеда по сравнению с Си?
Vala делает много разных трюков для оптимизации и избегания сишного UB.
Это кстати в данном случае и то и другоеhttps://ru.wikipedia.org/wiki/SSA
https://stackoverflow.com/questions/54058529/why-valac-gener...
Проверяйте сначала ассемблер https://godbolt.org/z/c8cs5Y
Спасибо за терпеливое разъяснение.