GPUI

Материал из Абсурдопедии
Перейти к навигацииПерейти к поиску

GPUI — это новейший, ультрамодный, написанный на расово верном Расте графический фреймворк прямого действия, порожденный сумрачным гением создателей текстового редактора Zed и призванный окончательно, бесповоротно и с особым цинизмом закопать стюардессу по имени Electron. В теории представляет собой Святой Грааль десктопного софта: аппаратно ускоренное, отрисовываемое со скоростью 120 кадров в секунду прямо на чипах вашей видеокарты нечто, сочетающее в себе псевдодекларативный синтаксис в духе Tailwind CSS и бескомпромиссную системную производительность. На практике же это монументальный памятник человеческой гордыне, в котором разработчики, 10 лет кормившие планету пожирающим гигабайты оперативной памяти браузерным франкенштейном, внезапно испытали экзистенциальный стыд, покаялись, ушли в монастырь системного программирования и в попытках убежать от веба… с нуля переписали веб на макросах, сырых указателях и слезах компилятора.

Aquote1.png

Представьте себе мир без крутящихся спиннеров загрузки. Вообще без них. Разве это не прекрасно? Но каждый раз, когда вы жмете клавишу, компьютер заявляет: Погоди, я занят. Что значит занят?! Ты всего лишь прославленный молоток!

Aquote2.png
— Конрад Ирвин, сооснователь Zed Industries, на исповеди перед хипстерами
Aquote1.png

Прощай, Electron. Прощай, Tauri. Я чувак из веба, я люблю веб, но я собираю десктопные приложения на Расте и больше никогда не оглянусь назад!

Aquote2.png
— Скотт Толински, подкастер, в приступе религиозного экстаза свитчера
Aquote1.png

Эти форки создают проблемы вместо того, чтобы их решать. Я с самого начала не испытывал по поводу них оптимизма. Только проекты, проверенные реальным бизнесом, имеют право на жизнь.

Aquote2.png
— Джейсон Ли, китайский брокер и автор GPUI Kit, отлучает форк GPUI-CE от церкви чистого кода

Предыстория[править]

Чтобы понять, зачем вообще на свет появился еще 1 фреймворк для рисования прямоугольников с закругленными краями, необходимо совершить экскурсию в 2014 год. В те былинные времена троица благочестивых программистов — Натан Собо, Макс Брунсфельд и Антонио Скандурра — трудилась в недрах GitHub над амбициозным проектом. Идея была проста до безобразия: взять движок Chromium, оторвать от него адресную строку, прикрутить внутрь Node.js и позволить легионам фронтендеров клепать нативные оконные программы на связке из HTML, CSS и ванильного JavaScript. Так на свет появился текстовый редактор Atom, а вместе с ним и его темная инкарнация — платформа Electron.

Последствия для IT-индустрии напоминали взрыв грязной ядерной бомбы. Внезапно выяснилось, что любой вчерашний выпускник трехнедельных курсов верстки может за 2 часа сварганить корпоративный мессенджер, музыкальный плеер или калькулятор, который весит 350 мегабайт в упакованном виде и при запуске отжирает 1 гигабайт оперативной памяти на отрисовку 1 мигающего курсора. Прогрессивное человечество взвыло, кулера ноутбуков взревели на ультразвуковых частотах, а Microsoft внимательно посмотрела на эту вакханалию, аккуратно скопировала идею, назвала ее VS Code, а затем цинично купила весь GitHub со всеми его потрохами за 7500000000 вечнозеленых президентов.

Дальнейшая судьба отцов-основателей была предрешена корпоративной диалектикой. Корпорация зла обнаружила, что содержать 2 конкурирующих редактора на 1 и том же тормозящем движке — это даже для них перебор, и выкинула Atom на мороз цифровой истории. Оставшись у разбитого корыта, лишенные своего детища создатели испытали жесточайшую душевную травму. Каждый раз, когда Натан Собо или Конрад Ирвин пытались зайти в Zoom на важное собеседование, их встречало унылое колесо загрузки. Каждый раз, когда в их коде падала автоматическая система обновлений, билд компилировался по 30 минут, а подписывание сертификатов у Apple вылетало с ошибкой 500 на 75 процентах шкалы прогресса, отцы Электрона возвращались домой морально уничтоженными, срывались на жен и детей и рыдали в подушку, осознавая, что они лично привели этот мир в ад бесконечных спиннеров.

Осознание вины перед человечеством породило жажду очищения через страдание. Было решено: чтобы вернуть кармический долг, нужно построить новый редактор. Но на этот раз — никакой виртуальной машины, никакого JavaScript, никакого сборщика мусора и, упаси господь, никакого DOM-дерева. Только хардкор, только компиляция в машинный код и прямое насилие над графическим ускорителем. Так зародился проект Zed, а его железным хребтом стал фреймворк GPUI.

Рождение из пучины Metal[править]

В 2020 году мир выглядел иначе, чем в эпоху зарождения Атома. Во-первых, созрел язык Rust, авторы которого обещали скорость языка C, безопасность памяти без сборщика мусора и строгий компилятор, бьющий разработчика по рукам за любую попытку выстрелить себе в колено. Во-вторых, даже в самых дешевых ультрабуках завелись мощные многоядерные видеокарты. Демиурги рассудили здраво: если современный дисплей с разрешением 4K насчитывает почти 8000000 пикселей, а модный экран обновляется с частотой 120 герц, то у системы есть ровно 8.3 миллисекунды на отрисовку кадра. Если попытаться заставить центральный процессор попиксельно пересчитывать интерфейс на такой скорости, он попросту расплавится и стечет в штаны пользователю. Вывод? Считать треугольники должен графический чип.

Легенда гласит, что первейшим артефактом будущего фреймворка был одинокий красный прямоугольник, нарисованный на сырых шейдерах Metal в macOS без единой строчки на Расте. Он отрисовывался с такой дьявольской скоростью, что авторы прослезились. Однако писать весь редактор на низкоуровневых шейдерах видеокарты оказалось задачей, граничащей с клиническим безумием: рисовать каждую букву и вычислять перенос строк через матрицы трансформации могли только 3 калеки на всем белом свете.

Тогда проект вступил в стадию великого болонского переворота. Накануне прихода в команду новых сотрудников разработчики собрались в Италии, в унылом коворкинге Болоньи под жужжащими люминесцентными лампами. Натан Собо встал во главе стола и объявил: за 1 неделю мы полностью выбрасываем старый UI-код и пишем новый модульный фреймворк GPUI 2, который совместит низкоуровневую мощь видеокарты с удобством… верстки на веб-страницах. Сказано — сделано. Команда не спала ночами, глушила эспрессо ведрами и через 2 недели выкатила работающую бету, в которой интерфейс собирался из элементов, пугающе похожих на старый недобрый HTML.

Архитектурный франкенштейн[править]

Создатели гордо величают GPUI гибридным иммедиейт- и ретейнед-мод фреймворком. Для непосвященных это звучит как заклинание высшей магии, но на практике отражает фундаментальный раскол в сознании авторов.

В классическом retained-подходе вроде классических GTK или Qt программист создает долгоживущее дерево объектов: вот кнопка, вот текстовое поле, они сидят в памяти годами, накапливают мох и меняют свои свойства по сигналу. В immediate-моде вроде Dear ImGui или egui каждый кадр интерфейс заново собирается из ничего: функция выполняется 120 раз в секунду, рисует кнопку, тут же забывает про нее и идет на следующий круг. Создатели GPUI скрестили ужа с ежом. На верхнем уровне вы каждый кадр строите дерево легких легковесных элементов, которое моментально умирает после рендеринга, но под капотом всё состояние завязано на долгоживущие сущности — Entity, хранящиеся в специальной глобальной арене под строгим присмотром умных указателей фреймворка.

Чтобы заставить эту адскую машину двигаться, разработчику предлагаются 3 уровня погружения в пучину архитектуры:

Самый верхний уровень — это так называемые Вьюхи (Views). Вьюха представляет собой обычную растовую структуру данных, для которой реализован трейт Render. Внутри метода render программист обязан вернуть дерево элементов. Здесь царит мнимый рай: можно писать цепочки методов, компоновать блоки и делать вид, что вы пишете на реакте.

Средний уровень — это Сущности (Entities). Так как Rust категорически запрещает циклические ссылки и заставляет разработчика страдать от владения данными, фреймворк объявляет себя абсолютным монархом вашего состояния. Любой объект, желающий жить дольше 1 кадра и общаться с другими частями программы, помещается в специальный контейнер Entity. Доступ к нему возможен только через контекст и умные указатели, отдаленно напоминающие Rc, но сдобренные щедрой порцией специфической внутренней кухни самого GPUI.

Нижний уровень — это Элементы (Elements). Сюда спускаются только бородатые системщики и авторы сложных редакторов. Элемент — это кирпич, который вручную берет границы экрана, запускает алгоритм верстки Taffy, рассчитывает отступы и превращает абстрактные понятия вроде синей рамки в набор вертексов и текстурных координат, скармливаемых бэкенду отрисовки.

Особого упоминания заслуживает механика пробуждения интерфейса. В мире GPUI не существует никакой магии реактивности, которая сама догадается, что вы инкрементировали счетчик. Если вы изменили поле структуры, фреймворку на это плевать с высокой колокольни. Чтобы пиксели на экране сдвинулись с места, вы обязаны явно воззвать к небесам и вызвать метод cx.notify(). Этот крик души помечает сущность как грязную, и только на следующем такте цикла отрисовки система снизойдет до вызова метода render. Забыли написать заветную строчку? Поздравляем: данные изменились, юзер яростно долбит по кнопке, но перед его глазами застыл вечный монумент неизменности.

Стилизация[править]

Главный парадокс GPUI заключается в том, как именно выглядит написанный на нем код. Разработчики, бежавшие от веб-технологий как черт от ладана, не придумали ничего лучше, чем скопировать концепцию тега div и философию утилитарных CSS-классов популярнейшей библиотеки Tailwind CSS.

Типичный компонент на GPUI выглядит как бесконечный, простирающийся за пределы видимой вселенной паровоз из вызовов методов. Чтобы нарисовать тривиальный блок с текстом и закругленными уголками, растоман вынужден выстраивать монструозные конструкции. Вы берете функцию div, прицепляете к ней вызов flex, затем flex_col, следом gap_3, потом bg с передачей шестнадцатеричного цвета, набрасываете rounded_lg, подкручиваете backdrop_blur, вешаете обработчик hover_style и венчаете сие великолепие методом child. В результате файл с описанием простейшей формы авторизации или списка задач растягивается на 700 строк чистейшего чейнинга, при взгляде на который у ветеранов jQuery 2008 года выпуска наворачиваются ностальгические слезы умиления.

Отдельного памятника заслуживает изобретение велосипедов в именовании свойств. Создатели фреймворка с гордостью подчеркивают, что цвет шрифта у них задается не богомерзким свойством color, как в CSS последние 30 лет, а логичным методом text_color. Зато вместо интуитивного выравнивания разработчик получает целую россыпь методов вроде justify_center, items_center, size_full и p_4, запомнить которые без постоянного заглядывания в исходники ядра невозможно физически.

Поскольку писать такие простыни вручную нормальный человек в здравом уме и твердой памяти быстро устает, сообщество мгновенно нашло выход: отдавать написание GPUI-кода на откуп нейросетям. Внезапно выяснилось, что современные большие языковые модели щелкают этот синтаксис как семечки. Причина проста до колик: искусственный интеллект обучали на миллиардах строк веб-кода, напичканного Tailwind CSS. Видя знакомые цепочки названий, искусственный идиот радостно генерирует километры растовых оберток, а счастливый хипстер гордо заявляет в Твиттере, что он за 1 вечер навайбкодил революционный менеджер заметок на системном языке, даже не открывая документацию по управлению памятью.

Великая схизма[править]

Как и в любой уважающей себя открытой экосистеме, в мире GPUI не могло обойтись без кровопролитной гражданской войны, раскола церквей и взаимного метания отходами жизнедеятельности на гитхабе. Драма развернулась вокруг простого факта: фреймворк GPUI формально является опенсорсным, но фактически разрабатывается коммерческой конторой Zed Industries исключительно ради 1-й цели — обслуживать нужды редактора кода Zed.

Если разработчикам редактора не нужны закругления углов со сглаживанием по кривым Безье, градиенты на тенях, декларативные CSS-анимации или возможность размывать фон окна, этих функций в апстриме не будет никогда. Любой пулл-реквест со стороны стороннего энтузиаста, пытающегося сделать на GPUI нормальное приложение с блэкджеком и плюшками, зависает в воздухе на долгие месяцы или безжалостно реджектится со словами: нам это в редакторе не требуется, поддерживать чужой код нам недосуг, идите лесом.

Такая политика партии породила немедленный бунт на корабле. Обиженная общественность объединилась под знаменами проекта GPUI-CE, то есть Community Edition. Повстанцы форкнули репозиторий, объявили себя истинными хранителями заветов свободного софта и принялись стахановскими темпами впиливать все то, на что забила болт материнская компания. В форке тут же появились суперэллипсы-сквирклы в стиле iOS, продвинутое размытие заднего плана, поддержка нормальных переходов между стилями и сборка под чистый Wayland без костылей. При этом авторы форка ударились в другую крайность: они приняли драконовскую анти-ИИ политику, заставляя каждого контрибьютора доказывать, что он человек из плоти и крови, и внедрили систему поручительств, автоматически закрывающую тикеты от неподтвержденных пользователей.

В этот самый момент из-за кулис с грацией товарного поезда выкатился 3-й игрок — китайская инвестиционная компания Longbridge. Китайские финансисты не стали тратить время на философские споры о чистоте кода. Им требовалось быстро написать терминал для биржевой торговли Longbridge Pro, чтобы ворочать миллиардами юаней, отображать графики акций с частотой 120 кадров в секунду и не позориться перед трейдерами лагающим интерфейсом на Электроне.

Оценив обстановку, китайский разработчик Джейсон Ли взял сырой GPUI и поверх него воздвиг монументальный фреймворк GPUI Kit, ставший де-факто стандартом для всего сообщества. Они взяли концепцию модной веб-библиотеки shadcn/ui и перенесли ее на Раст, выкатив каталог из более чем 75 готовых компонентов: от кнопок и чекбоксов до гигантских виртуализированных таблиц данных на 100000 строк, вкладок, док-панелей и встроенных редакторов кода на базе Tree-sitter.

Когда повстанцы из GPUI-CE пришли к автору GPUI Kit с предложением объединить усилия и перевести библиотеку компонентов на их народный форк, Джейсон Ли публично выкатил холодный, как сибирская зима, манифест. Он заявил, что форки без реального коммерческого продукта за душой обречены на вымирание, что они лишь плодят сущности и отвлекают людей от дела, и демонстративно намертво привязал свою библиотеку к официальным релизам от Zed Industries. Сообщество испытало мощнейший баттхерт, но проглотило пилюлю: писать собственные кнопки и календари с нуля никому не хотелось, поэтому 90 процентов всех новых приложений в экосистеме сегодня базируются на китайском наборе компонентов.

Под капотом титана[править]

Если заглянуть под глянцевую обертку красивых функций GPUI, взору открывается титанический труд по преодолению сопротивления материалов операционных систем. Чтобы вывести на монитор банальную строку текста, современный компьютер должен совершить подвиг, о сложности которого среднестатистический веб-разработчик даже не догадывается.

В браузерах отрисовкой глифов занимаются гигантские подсистемы с тридцатилетней историей, учитывающие субпиксельное сглаживание, лигатуры, кернинг, эмодзи и диакритические знаки древнеарамейского языка. В GPUI создателям пришлось наступать на все грабли самостоятельно. Под macOS фреймворк опирается на нативный графический API Metal и библиотеку font-kit. Если вы случайно забудете включить нужный флаг компиляции, программа запустится, бодро выделит место под текст, но вместо букв нарисует идеальную, девственно чистую пустоту. Под Windows отрисовка ведется через DirectX 11 и системный движок DirectWrite, а на многострадальном Linux в бой вступает абстракция wgpu, пытающаяся подружить между собой зоопарк из серверов Wayland и древних протоколов X11.

Особая гордость авторов — полный отказ от стандартных механизмов компоновки операционной системы. Фреймворк не использует нативные виджеты Windows или Cocoa. Каждая кнопка, каждый скроллбар, каждая всплывающая подсказка и даже рамка окна с кнопками закрытия рисуются видеокартой попиксельно с нуля. Для пользователя это означает абсолютную идентичность интерфейса на всех платформах: программа будет выглядеть одинаково хипстерски как на макбуке за 3000 долларов, так и на пропахшем нафталином системнике под управлением Arch Linux. Однако обратная сторона медали сурова: забудьте о системных диалогах выбора файлов с вашими любимыми закладками, забудьте об интеграции с нативными темами оформления и приготовьтесь к тому, что любое нестандартное поведение придется кодить вручную.

При этом разработчики умудрились встроить в свое детище полноценную поддержку доступности через проект AccessKit. Программа транслирует дерево элементов в системный семантический граф для экранных дикторов. Но самое смешное применение этой технологии нашли не инвалиды по зрению, а хитроумные программисты нового поколения: они скармливают дерево доступности локальным нейросетевым агентам, позволяя искусственному интеллекту нажимать на кнопки и тестировать интерфейс без необходимости делать скриншоты экрана и распознавать картинки зрением.

Радости разработки[править]

Разработка приложения на GPUI — это медитативный процесс, закаляющий характер и тренирующий терпение до уровня буддийского монаха. Начинается все с редактирования файла Cargo.toml. Поскольку проект находится в вечной фазе пре-альфа-версии с номером меньше 1.0, любые мысли о стабильности выкидываются в мусорную корзину. API меняется по 3 раза на дню: то, что компилировалось в прошлый вторник, в среду выдает 48 ошибок компиляции, потому что авторы решили переименовать замыкание контекста или изменить сигнатуру возвращаемого типа трейта Render.

Вы запускаете сборку простейшего проекта с 1 кнопкой. Компилятор Cargo бодро начинает выкачивать из сети 350 транзитивных зависимостей. Процессор вашего ноутбука нагревается до температуры кипения чайника, вентиляторы выходят на околозвуковую скорость, а полоса компиляции медленно ползет вперед в течение долгих 15 минут. В этот момент разработчик отчетливо осознает величие идеи избавления от тормозов: приложение, конечно, будет работать со скоростью 120 кадров в секунду, но чтобы увидеть 1-й кадр, придется провести треть часа в благоговейном созерцании терминала.

Затем наступает этап священной войны со сборщиком мусора, точнее — с его отсутствием. В вебе вы привыкли просто повесить функцию на клик мыши и забыть обо всем. В GPUI такое святотатство не пройдет. Если обработчик события попытается захватить ссылку на родительский компонент напрямую, компилятор Rust немедленно огреет вас бревном Borrow Checker по голове, заявив о недопустимости пересекающихся мутабельных заимствований. Вместо этого программист обязан погрузиться в пучину слабых указателей, контекстных слушателей cx.listener и аккуратного жонглирования аргументами, напоминающего сборку механических часов в боксерских перчатках.

Если вам вдруг понадобится сделать банальное поле для ввода текста, вас ждет незабываемое открытие: готового полноценного инпута в базовом фреймворке нет. В официальных примерах сиротливо лежит файл на 600 строк кода, где авторы вручную обрабатывают нажатия стрелочек на клавиатуре, высчитывают смещение курсора в байтах UTF-8 строки, отслеживают выделение мышью и рисуют мигающую вертикальную палочку через таймер. Вы копируете этот священный монолит себе в проект, молитесь, чтобы он не сломался, и начинаете понимать, за что создатели веб-браузеров получают свои космические зарплаты.