Материал из Tkabber Wiki
Содержание
- 1 Преамбула
- 2 Tcl/Tk
- 3 Почему Tcl?
- 4 Почему Tk?
- 5 Почему Tk, а не GTK/Qt/что-то ещё?
- 6 Почему не отделить интерфейс от реализации?
- 7 Почему нет "внешнего API"?
- 8 Ткаббер выглядит отвратительно!
Преамбула
В этой статье даются развёрнутые ответы на пачку различных вопросов, периодически задаваемых пользователями Ткаббера относительно языка его реализации, а также смежных вопросов — относительно его внешнего вида.
Tcl/Tk
Ткаббер написан на языке Tcl и использует библиотеку Tk для создания графического интерфейса пользователя (GUI).
Несмотря на наличие некоторых (практически беспрецедентно) мощных виджетов
(таких как text
(используются в
окнах чата) и canvas
(на нём
сделаны ростеры)), в Tk нет таких "примитивов" как: "progressbar", "notebook"
(виндовым программистам более известный как "page control" или "tab control"),
"сплиттеров", готовой поддержки стандартных диалоговоых окон. Однако для Tk
написана масса сторонних реализаций, компенсирующих этот недостаток; Ткаббер
широко использует один из подобных "наборов виджетов" —
BWidget.
Сделать: добавить про Tcllib
Почему Tcl?
Вообще говоря, здесь проще всего ответить вопросом на вопрос: "а почему нет?" — Tcl является продвинутым "скриптовым" языком; тот факт, что вокруг него значительно меньше того шума, который именуется термином "hype", и он никогда не был "в моде" у населения /., не говорит о том, что на нём нельзя создать серьёзный проект. Более того, некоторые бывают удивлены, узнав, что Ткаббер даже не является единственным Jabber-клиентом и уж тем более не единственным Instant Messenger'ом, написанном на Tcl/Tk.
Сделать: развить
Почему Tk?
Tk является "натуральным" выбором для создания GUI у приложения, написанного на Tcl, из-за того, что связка Tcl/Tk является практически уникальной (если не считать совсем уж "эзотерических" решений) в том смысле, что GUI-тулкит очень удобно состыкован с языком — как в плане философии использования, так и в плане используемых при работе с ним языковых конструкций.
Почему Tk, а не GTK/Qt/что-то ещё?
Ответы можно условно разбить на две категории:
- Стандартное заклинание: "а почему нет?";
- Технические обоснования.
А почему нет?
99% претензий к Tk касается вовсе не его технических характеристик, а того, как он выглядит (и вообще ощущается) на конкретной системе конкретного пользователя — не секрет, что на 97% "десктопов" в современном мире установлена одна из ОС, сошедших со стапелей Microsoft, а на жалких остатках, занятых, в основном, решениями на базе Linux и *BSD, царят GNOME и KDE, то есть имеет место "обоснованное засилье" приложений, использующих в виде GUI-тулкитов GTK и Qt, соответственно.
Сейчас уже поздно стенать о том, что авторы GTK и Qt не дочитали спецификации на X Window System, а также о том, что они изобрели (каждый — свою) системы конфигурации тулкитов, несовместимые с когда-то бывшей хоть каким-то стандартом систему конфигурации Xt и Motif (XRDB). В результате мы имеем то, что имеем: несовместимые между собой тулкиты, некоторые из которых борются за "мировое господство".
Отсюда и наш слабый аргумент: а почему, собственно, GTK или Qt? Потому, что он доминирует на вашей системе? Но в любом случае всем угодить не получится: GTK-приложение будет чужим в окружении Qt и наоборот. А приложение GTK или Qt никогда не будет выглядеть совершенно нативно в Windows, пусть даже оно будет ближе к "натуральному виду", чем Tk.
Наконец, Ткаббер был рождён как "иксовое" приложение, а довольно весомая часть пользователей X Window вообще не использует "desktop environments", такие как GNOME и KDE — они используют "каноническую" концепцию: window manager + набор приложений, окнами которых он позволяет управлять. Приложения при этом могут быть какими угодно, наглядно демонстрируя "разброд и шатание" иксовых тулкитов во всей его неприглядности. Tk в этом случае выглядит не хуже и не лучше других.
Следует также понимать, что у других тулкитов хватает своих "тараканов в голове", и переезд на другой тулкит запросто может создать проблем больше, чем решить.
Техническая сторона дела
У Tk есть несколько интересных особенностей, которые выделяют его в ряду GUI-тулкитов:
- Очень небольшой размер;
- Масса расширений, написанных на "чистом" Tcl;
- Tk является интегральной частью шелла
wish
, то есть программы, которая выполняет скрипты Tcl в "оконных" окружениях.
Это позволяет создавать дистрибутивы "всё-в-одном" из приложений, написанных на Tcl/Tk — старкиты и старпаки.
Другими словами, "близость" Tk к Tcl даёт этому тулкиту несколько очков форы перед другими тулкитами, для которых требуется таскать за собой:
- Специальные биндинги к тулкиту;
- Сам тулкит в виде библиотеки (или набора из десятка библиотек, как в случае с GTK2+).
Сделать: развить
Почему не отделить интерфейс от реализации?
Людям, прочитавшим пару книжек по программированию, эта идея кажется разумной. В реальности всё гораздо сложнее.
Самая главная проблема состоит в том, что разные GUI-тулкиты имеют разную философию программирования. Это приводит к тому, что для поддержки разных тулкитов нужно: а) писать "ядро" в очень общем виде, разрабатывая некие абстрактные интерфейсы для взаимодействия ядра с тулкитом; б) писать ещё по одному слою кода для каждого тулкита — для привязки этого тулкита к ядру. В результате код Ткаббера увеличится хорошо если вдвое, а его читабельность уменьшится, видимо, даже более чем вдвое. Неплохую идею о том, к каким проблемам приводит подобный подход, можно почерпнуть, глядя на GiTK.
Ещё одна проблема, незаметная при поверхностном осмотре, состоит в том, что создание "чистого" кода практически невзоможно — любая платформа имеет собственные заморочки, что требует "твиков" кода, создания "костылей" и прочих уродств в определённых случаях. К сожалению, в Ткаббере вынужденно хватает подобных мест. В случае с "многоинтерфейсным" подходом мы автоматически множим и подобные проблемы.
Наконец, подумайте о координации разработки (а одна команда не станет окучивать все направления — для этого требуются конкретные группы), а также о поддержке пользователей: даже сейчас, когда Ткаббер широко используется только на двух платформах (в Windows и Unix-based системах; в Mac OS X ситуация далека от радужной в силу отсутствия в команде Ткаббера разработчиков, заинтересованнных в улучшении ситуации), зачастую можно говорить о двух разных Ткабберах, так как эти платформы имеют слишком много собственных особенностей. Представьте теперь, что будет, если умножить число платформ на число поддерживаемых тулкитов?
Наконец, возможно, ключевой момент: разработчиков вполне устраивает Tcl/Tk, а идеи "портировать Ткаббер под <место для тулкита>" проистекают в основном от тех, кто свой труд вкладывать в это не хочет.
Почему нет "внешнего API"?
"Внешнего API" (такого, как, например, API плагинов у Миранды) в Ткаббере нет потому, что он написан на Tcl, а не на Си; соответственно, предполагается, что "скриптование" Ткаббера производится кодом на Tcl.
Обвинение в отсутствии C API обычно приводят как причину "невозможности скриптовать Ткаббер на языках, отличных от Tcl" (более конкретно — "на любимом языке"). Теоретически это обвинение обоснованно. Однако давайте посмотрим на проблему с практической точки зрения (игнорируя тот факт, что создание C API для Tcl кода относится к области ненаучной фантастики):
- Наличие C API не сделает автоматически доступными биндинги к этому API для других языков — таковые сначала кто-то должен написать. И поддерживать. Посему заявление "я не могу скриптовать/расширять Ткаббер на любимом языке" в большинстве случаев следует переводить как "я знаю только С++ и джаву, и ваш тикль учить не хочу".
- Предположив наличие C API и биндингов к другим языкам, мы видим проблемы возможностей использования и портабельности: предположим, вы написали плагин к Ткабберу, скажем, на Питоне. Много ли пользователей захотят ставить рантайм питона в систему, чтобы использовать ваш плагин? Как быть с распространением плагина в "упакованных" версиях Ткаббера? Пусть даже плагин написан прямо на Си, — возникает проблема кроссплатформенной сборки, то есть полный пакет проблем поддержки нескольких систем компиляции (имеющих, например, место в случае сборки расширений Tcl, написанных на Си).
С другой стороны, скриптование/расширение Ткаббера на его "родном" языке лишено всех этих проблем, кроме проблемы самообучения допиливающего.
Ткаббер выглядит отвратительно!
<zayza> почему говорят, что ткабер страшный? о_0
<teo> zayza: потому что видели его
Ткаббер (а точнее — Tk) находится в ловушке всех без исключения кроссплатформенных GUI-тулкитов — невозможно выглядеть "нативно", работая на ненативной платформе. К сожалению, как было сказано выше, это относится не только к проблеме "Tk в Windows", но и к "Tk в GNOME/KDE".
К сожалению, выглядеть "в струе" самых последних веяний моды Windows и прочих "desktop environments" Tk, скорее всего, не будет никогда — тяжело прочно сидеть на нескольких стульях разной высоты, формы и конструкции сразу.
Несколько подсластить пилюлю могут достаточно широкие возможности по изменению внешнего вида Tk-приложений, о которых (когда-нибудь будет) рассказано здесь.
Заодно расскажем ещё об одной часто всплывающей теме:
Tile в Ткаббере
Tile — это надстройка над Tk, призванная решить некоторые проблемы с "луком и филом", присущие Tk:
- Реализовать "нативный" вид в Windows XP (то есть использовать её движок тем);
- Реализовать несколько новых виджетов, переделать старые.
Проблема с Tile состоит в том, что она не является "drop-in replacement" для Tk. Это важно понимать: простое подключение Tile к существующему проекту, использующему Tk, не привьёт ему "волшебным образом" все преимущества Tile. В частности, если стандартные виджеты Tk ещё могут (с некоторыми приседаниями при сборке Tile) "переехать" на новый движок, то все "левые" виджеты (например, виджеты из BWidget) "сушат вёсла" — выглядят и работают по-старому.
Другими словами, Ткаббер нужно портировать под Tile, чтобы он с этой Tile нормально заработал.
Тут возникает другая проблема. Она состоит в том, что Ткаббер позиционируется разработчиками как максимально портабельное приложение. Это означает, в числе прочего, что:
- Ткаббер (формально) работает даже на Tcl/Tk 8.3;
- Ткаббер зависит (в смысле "не может работать без") только от таких программных компонентов, которые давно и широко доступны под любую из платформ, на которых работает Tcl/Tk. Причём только один из этих компонентов (собственно Tcl/Tk) написан на Си, и его нужно "собирать" на целевой платформе, если его там нет в готовом виде; остальные компоненты (Tcllib и BWidget) представляют собой код на Tcl — их достаточно "развернуть" из архивов, — и они готовы к работе.
Tile к этим компонентам не относится. Достаточно сказать о том, что в природе не существует даже такого понятия как "стабильный релиз Tile", а это означает, что его API может меняться по два раза на дню.
На сегодняшний день состояние дел таково, что если мы бросим все дела и "привяжем" Ткаббер к Tile, то это ударит как по разработчикам (им понадобится оперативно следить за изменениями в Tile), так и по пользователям (Tile, насколько нам известно, нет ни в одном серьёзном дистрибутиве Linux) — Ткаббер потеряет одно из своих главных качеств — способность работать без чрезмерно серьёзных телодвижений со стороны пользователя на любой системе, в которой есть Tcl/Tk.
Ещё одна (менее серьёзная) проблема состоит в том, что Ткаббер действительно сильно зависит от BWidget — с его помощью делаются: почти все диалоги, главное меню, интерфейс с табами (правда, в альфе 0.10.1 уже реализован другой подход), деревья, выпадающие списки так далее. Так как BWidget не поддерживает Tile и, судя по-всему, не будет её поддерживать, портирование Ткаббера под Tile — это очень серьёзный шаг: прежде чем его сделать, разработчики должны быть уверены, что Tile получила такую же доступность, как BWidget.
Посему точка зрения автора этих строк состоит в том, что вряд ли стоит ожидать подвижек в этом направлении в ближайшие два года.