Я попробовал написать на этом чуде кое-что посложнее Hello World, и мне кажется, я понял основной на данный момент его недостаток.
Это отсутствие документации к байндингам.
Дело в том, что, когда требуется обратиться к функциям GLib/GTK с каким-то нестандартным синтаксисом, сразу же начинаются выкрутасы в стиле "абракадабра - достаём из шляпы кролика". Глядя только на сишную документацию, этого в жизни не понять - приходится лезть в файлы .vapi и там смотреть.
Самое противное, что зачастую уже _после_ такого подглядывания метод вызова кажется вполне себе интуитивным. Ну кто мог бы предположить, что g_strdup_printf(format, ...) вызывается в Vala как format.printf(...) и возвращает строку? Даже глядя на прототип функции, я это не сразу понял. Также далеко не очевидно само _существование_ конструкции типа 5.to_string(), не говоря уже о том, что она вызывает всё тот же g_strdup_printf.
При этом ещё вызовы периодически ломаются между версиями, причём так, что "разбор полётов" требует знания не только Vala, но и того, что там, под капотом, творится. Простой пример: в ранних версиях Glade.XML.signal_autoconnect_full работал с методами, объявленными как [InstanceLast]. Сама необходимость добавления такого атрибута объясняется тем, что this передаётся как user_data, последним параметром. Само по себе неочевидно. Но в какой-то момент эти чудилы из Нижнего Тагила сделали так, что методы [InstanceLast] превращаются в открытые функции, в которых this стоит первым параметром, но они _внутри себя_ вызывают _закрытые_ функции, у которых this стоит уже последним параметром! С передачей указателей на функции это прокатывает, но не с libglade. В итоге теперь нужно писать [CCode (instance_pos = -1)], что уже и вовсе тёмный лес.
Да, при этом имена вызываемых функций в самом редакторе glade приходится писать как имя_класса_имя_метода. Причём, кроме одного примера файла .glade на live.gnome.org, это никак не документировано!
Или, например, в функции, передаваемой параметром Gtk.AboutDialog.set_url_hook, в байндинге сначала был последний параметр типа gpointer, а потом его убрали. Естественно, всё перестало компилироваться. А Gtk.ListStore.set_column_types была изначально объявлена с параметрами (int, GLib.Type[]), но этот вызов был поломан, потому что Vala при всех вызовах после массива неявно добавляет параметром его длину, а для подавления этого нужен специальный атрибут, которого в файле vapi не было. В следующих версиях они перенесли длину первым параметром, на место int. Так что теперь этот int указывать не нужно, ибо он указывается неявно...
Я думаю, что этим дело далеко не ограничивается.
В общем, подводя итоги: я считаю, что у Vala есть будущее. Но не сейчас - не раньше, чем заморозят API и напишут нормальную документацию. А это произойдёт не раньше сентября.