unix 2010-07-27 13-02-12
Что такое Vala
Хотя проект Vala был создан еще в 2006-м году, он до сих пор остается малоизвестным как среди простых пользователей, так и среди многих разработчиков. Мало кто понимает, что это такое и, главное, зачем это нужно. А уж среди русскоязычного IT-сообщества Vala и вовсе является чем-то загадочным и статей на эту тематику исчезающе мало. Я решил немного поправить текущую ситуацию и сделать небольшой экскурс по этой технологии.Текущее положение дел в десктопостроении под Линукс
Зайдем из далека. Так уж сложилось, что в десктопном Линуксе давно господствуют две технологии (я бы сказал, два разных мира) — Qt и Gtk. Чтобы не возникло путаницы, замечу, что Qt — это далеко не только библиотека для построения GUI, а Gtk — это всего лишь одна из многих библиотек полноценного стека, который основан на GLib. Соответственно, десктоп разделен между двумя десктопными средами, основанными на этих технологиях — KDE и Gnome.
У части разработчиков, использующих Qt, все довольно гладко и безоблачно. У них есть стройные и красивые API, удобные средства разработки, шикарная документация и большое сообщество. В мире Gtk все не так радужно. Изначально разработка ведется на языке Си, на котором при помощи многих абстракций и соглашений реализуется GLib — полноценная объектная модель, которой в Си никогда не было. Код приложений, использующих GLib, выглядит очень своеобразно и совсем не похож на то, к чему привыкли разработчики большинства популярных GUI-библиотек. Кроме того, сам язык не располагает к разработке программ с графическим интерфейсом в виду своей низкоуровневости.
В итоге, разработчик для Gnome имеет несколько обходных путей. Первый — писать на Qt и надеяться, что приложение не будет выглядеть инородно на фоне остальных. Второй — использовать скриптовые языки, у которых есть привязки к Gtk. А таких существует достаточно: Python, Ruby, Lua, Lisp, Perl и даже PHP. Третий — писать на Java. У всех этих решений есть очевидные плюсы — удобство и сокращение времени разработки. Но есть и минусы. В первую очередь, это скорость исполнения, которая заметно ниже у скриптовых языков, по сравнению с Си. Скорость запуска программы тоже страдает. Qt лишен этих недостатков, но упомянутая выше инородность, пусть и существенно нивелированная в последние годы, тоже дает о себе знать.
Но главным вариантом, который нам усиленно предлагают в последнее время, является Mono. В каком-то интервью один из разработчиков сказал примерно следующее: «Нужно быть сумасшедшим, чтобы писать программы для Gnome на Си, когда у нас есть Mono». И с ним трудно не согласиться. Mono предлагает современный и высокоуровневый язык C#, удобную IDE MonoDevelop, обширное сообщество (которое, надо заметить, в основном сумеет помочь вам в вопросах непосредственно языка C#, но не разработки приложений на Gtk). Звучит замечательно. Однако Mono тянет за собой все те же проблемы. Скорость запуска и исполнения хоть достаточно приличная, но все же заметно ниже, чем у Си. К тому же, Mono не может быть панацеей для Gnome, так как на нем можно разрабатывать только отдельный софт, но не саму среду или ее части в виде библиотек.
Вот в такой ситуации оказался проект Gnome. Пользовательский софт писался на чем угодного, только не на оригинальном Си. Естественно, были и есть исключения, но это не меняет того факта, что разработчиков, готовых писать десктопный софт на Си, сравнительно мало. И с каждым годом их число явно не увеличивается. Нужно было простое и элегантное решение, и оно появилось. Как вы уже догадались, имя ему — Vala.
Что такое Vala
Прежде всего, Vala — это проект, начатый в 2006-м году всего двумя людьми — Йюргом Биллетером и Раффаеле Сандрини. Он был призван создать для Gtk-разработчиков удобный, современный инструментарий и существенно понизить порог вхождения. Проект состоит из двух языков — Vala и Genie. Оба, по сути, являют собой одно и то же, но обладают разным синтаксисом. Vala очень похож на C# и Java, в то время как Genie имеет много общего с Python и Boo. Поскольку Vala более популярен, дальше речь пойдет именно о нем.
Концепция Vala довольно проста: код пишется на удобном высокоуровневом языке и транслируется в самый обычный код на Си, который, в свою очередь, компилируется в исполняемый файл или библиотеку. Прозрачность трансляции обеспечивает полное отсутствие overhead. Другими словами, при разработке на Vala вы не тянете за собой ни одной лишней библиотеки, связанной с Vala. Эта особенность дает еще одно преимущество — полную бинарную совместимость. Это означает, что вы можете написать библиотеку на Vala и ее можно будет использовать из кода на Си (или из любого другого языка при наличии привязок). Таким образом, Vala пригодна для разработки не только пользовательского софта, но и самой среды Gnome или отдельных библиотек для этого проекта.
У любого языка программирования есть стандартная библиотека с набором функций или классов для решения самых очевидных задач. У Vala эту роль исполняет набор стандартных привязок (bindings). В распоряжении разработчика весь стек библиотек, на которых построен Gnome. Это значит, что на Vala «из коробки» можно писать довольно большие и сложные проекты. С полным списком привязок можно ознакомиться здесь. Привязки являют собой vapi-файлы, которые объясняют транслятору, как соотносятся функции и структуры библиотеки с классами, пространствами имен, методами и т.д. Можно создавать свои привязки к существующим библиотекам или к коду на Си.
Подробнее о языке
Как уже писалось выше, Vala сильно похож на C# и Java. Он имеет настоящие родные properties, сигналы, generics и delegates, абстрактные классы и интерфейсы. Множественного наследования нет, но можно одновременно наследоваться от класса и интерфейса. А поскольку интерфейсы в Vala могут иметь полноценные методы, то это отчасти решает проблему (если она вообще была). Также нету перегрузки методов. Зато есть параметры по умолчанию и именованные конструкторы. Properties посылают сигналы при изменении, что весьма удобно. Vala поддерживает замыкания и прозрачный импорт модулей. В общем, это современный и красивый язык программирования, имеющий достаточно выразительных средств и, в то же время, сохраняющий привычную для C#-разработчиков строгость. Управление паматью в Vala происходит посредством автоматического подсчета ссылок, так что разработчику не нужно постоянно думать об этом. Но также есть возможность ручного управления, как в С++, например.
Вот пример простейшей оконной программы, которая, по нажатию кнопки, выводит сообщение:
using Gtk;
public static int main (string[] args) {
Gtk.init (ref args);
Window window = new Window(WindowType.TOPLEVEL);
window.set_size_request(100, 100);
window.destroy.connect(main_quit);
Button button = new Button.with_label("Push me");
button.clicked.connect(() => {
MessageDialog msg = new MessageDialog(window, DialogFlags.MODAL,
MessageType.INFO, ButtonsType.OK, "Some message");
msg.run();
msg.close();
});
window.add(button);
window.show_all();
Gtk.main();
return 0;
}
* This source code was highlighted with Source Code Highlighter.
Я думаю, не стоит разбирать каждую строчку, все и так должно быть понятно. Более подробно с основами языка можно ознакомиться в официальном туториале. Чтобы скомпилировать этот пример, нужно ввести следующую строку в консоли (при условии, что код сохранен в файле test.vala):
valac test.vala --pkg gtk+-2.0 -o test
Инструментарий
Проект Vala поставляет транслятор языков Vala и Genie в Си. В любом популярном дистрибутиве он находится в официальных репозиториях. Но, как правило, это устаревшие версии. Поэтому я советую искать дополнительные репозитории с более свежими пакетами. Для Ubuntu, например, есть vala-team.
Для Vala есть несколько IDE (если их так можно назвать). В первую очередь, это Val(a)IDE. Умеет подсветку, дерево каталогов, список файлов проекта, автодополнение (пока что довольно слабое), собственную систему сборки и поддержку сторонних систем. Ничего не нужно настраивать, все само собирается и запускается, только успевай код писать.
Поддержка Vala заявлена в MonoDevelop и Anjuta, но лично у меня создалось впечатление, что эти среды скорее мешают писать код, нежели помогают.
И, наконец, то, чем я сам пользуюсь: Valencia — плагин для Gedit. Он привносит в стандартный редактор для Gnome автодополнение и список symbols для Vala. Конечно, этого маловато, но, по крайней мере, он не мешает писать код, что уже хорошо. С полным списком инструментов разработки для Vala можно ознакомиться на http://live.gnome.org/Vala в разделе «IDE Support».
Но для написания программ одного редактора мало. Нужна система сборки. В мире Open Source все большую популярность набирает CMake. Это очень гибкое и мощное решение, но… там нет поддержки Vala. Однако это временное явление и уже к следующему релизу обещают исправить это досадное упущение. А пока что разработчики в своих проектах могут использовать специальный макрос, который содержит скрипты, необходимые для сборки программ на Vala.
Также нельзя обойти вниманием Waf — систему сборки, написанную на Python и имеющую изначальную поддержку Vala. Чрезвычайно удобная система, содержащая все необходимое для сборки и неограниченную гибкость, так как ее скрипты пишутся на Python. Но она имеет один существенный недостаток: не все дистрибутивы к ней хорошо относятся. В частности, мейнтейнеры Debian просят разработчиков переходить на другую систему, так как Waf планируется к удалению из репозиториев.
Совсем недавно разработчики Vala анонсировали очень интересную возможность — работу Vala в режиме интерпретатора. Можно будет писать скрипты, как на любом скриптовом языке, и они будут исполняться на лету, без необходимости вручную их собирать. Это заметно упрощает знакомство с языком и делает его более приятным, так как для своих личных экспериментов не нужно заморачиваться со сборкой и оформлением проекта.
Текущее состояние и перспективы Vala
На данный момент последняя версия Vala — 0.9.3. И чем ближе к 1.0, тем быстрее идет разработка. Но не все так хорошо. Roadmap проекта перекраивался несколько раз и, согласно одной из его редакций, Vala 1.0 должен был появиться еще год-полтора назад. Сейчас же страница с Roadmap и вовсе исчезла. Тем не менее, проект живой и активно развивается. Несмотря на предфинальные стадии разработки, добавляются новые возможности, в том числе и в синтаксис языка. Это, в свою очередь, несет с собой мелкие неудобства из-за несовместимости и нужду переписывать отдельные куски кода при смене версии.
Сообщество у Vala довольно активное, хоть и маленькое. Основной тусовкой является почтовая рассылка, которая содержит в себе множество дискуссий на любые темы, связанные с Vala. Там же вы можете сами задать вопрос и, скорее всего, получите быстрый и полный ответ. Но, справедливости ради, стоит заметить, что не всякий вопрос находит отклик. Несколько месяцев назад я обнаружил в Vala абсолютно нерабочий binding для одной из библиотек. Я написал патч, но не получил никакой реакции. Вскоре, ситуация опять повторилась и мне пришлось добавлять исправленный binding прямо в свой проект.
Разработка Vala, на мой взгляд — одно из важнейших направлений для проекта Gnome. Не хочу сказать «спасение», но без шагов навстречу разработчикам пользовательского софта будет очень сложно популяризировать платформу. Тем страннее выглядит мертвая тишина со стороны Gnome по поводу Vala. Нет никаких официальных подвижек в этом направлении и со стороны главного покровителя этой среды — Canonical, разработчика Ubuntu. Пока что Vala, как технология, существует автономно и ее будущее зависит сугубо от ее же сообщества. Так что единственный путь к счастливому будущему — укреплять и расширять это сообщество, что я и попытался сделать этой заметкой. Добро пожаловать.