Набор инструментов и компонентов, позволяющие писать программы на javascript для разных окружений и платформ используя один API без каких-либо нюансов. Важно отметить, что главная цель это действительно единый API, для достижения этой цели зачастую приходится чем-то жертвовать. В этом смысле есть большая разница между capsule и различными кросплатформенными фреймворками типа Qt, которые стараются максимально охватить возможности поддерживаемых платформ.
Изначально capsule создавался как основа для проекта dsa(ныне caravan), цель которого предоставить инструменты для мигрируемых приложений в реальном времени. Поэтому никаких различий между разными платформами для caravan не должно было быть. Эта цель является основной и сейчас. Кому может понадобиться столь экзотическая вещь? Например тому, кто хочет сосредоточится на разработке единого программного комплекса, который бы имел поддержку самых разных устройств, но при этом вся эта поддержка была бы сосредоточена в едином модульном приложении или группе взаимо-интегрированных приложений. Звучит сложно? Попробую по-проще. Сейчас, для того чтобы иметь одно и тоже приложение на смартфоне и компьютере надо сделать три вещи:
- написать основное приложение backend, которое реализует б’ольшую часть логики и предоставит API
- написать десктопное клиентское приложение, используя backend API
- написать приложение для смартфона, используя backend API
В случае capsule мы можем как иметь 3и разных приложения, так и иметь всего одно(и клиент и сервер в одном флаконе или два(клиент и сервер). При этом клиентское приложение просто будет иметь несколько частей интерфейсов для разных диагоналей устройства и средств ввода. Будет активировать ту или иную часть динамически. Но никакого определения что за платформа, какая программная начинка и способности есть - ничего подобного, а значит прощай native.
Быть максимально легковесной и native - это цель номер 2 Вот здесь capsule занимает своё место, специфическое. Мы пытаемся сделать так, чтобы не дублировать возможности поддерживаемой платформы настолько, насколько это возможно при создании единого API. Например мы используем разные media фреймворки в зависимости от платформы, смотря что доступно и что уже предустановлено. Но самое главное: стараемся максимально использовать возможности самих платформ для наших целей. Следующий пример, как мне кажется, всё прояснит: Для создания ui мы используем родные(если они есть) window, surfaces,widget,controls и тд платформ. То есть кнопка будет input в web, Gtk.Button в gjs, winapi button на windows и тд. Frame будет div в web, Clutter.Actor в gjs, window в windows. Тоже касается и других объектов, например animation в gjs использует встроенные возможности Clutter для создания анимаций. Конечно, чтобы создать единый API приходится всё таки делать обвязку и реализовывать что-то самим, но это необходимый минимум. Главный результат - это максимальная производительность, сопоставимая с интерфейсами, созданными родными средствами, потому как наши интерфейсы и создаются родными средствами. Подобная производительность и отзывчивость недостижима многими кросплатформенными фреймворками и я уж не говорю про javascript фреймворки, которые зачастую стараются просто использовать web для отрисовки интерфейса на всех устройствах.
Причины две:
- он динамический, подходит для распространения программ прямо с данными, то есть живой миграции
- есть почти везде так или иначе. По этому пункту есть два конкурента: С и Java. С не подходит потому, что он не динамический и абстракции на нём выглядят некрасиво. Java также не динамична и увы, есть сегодня на меньшем числе платформ которые нас интересуют, чем javascript(например её нет в браузерах, по крайней мере если не захватить с собой компилятор:))