Комментарии 25
Поэтому, через пару лет, когда мы с (другим) коллегой коротали вечер за пирожками в одном из кофешопов Амстердама
Что то не припомню я пирожков в Амстердамских кофешопах, разве что с мухаморчиками.
Или это сейчас так называется? :)
Между прочим после этих самых «пирожков» очень прет на умные мысли :)
Если эта статья хоть кому-то будет интересна, мы можем продолжить рассматривать наше видение QML
Конечно продолжайте!
Правда некоторые примеры не работают
Еще интересует транслятор QML в C++, можно немного подробнее.
Про C++, к сожалению, вся интеллектуальная собственность осталась в той корпорации, и у нас даже был зеленый свет на открытие частей, но мы так и не собрались, ну и там ничего интересного нет, оно просто достаточно аккуратно написано, имеет постоянный memory footprint, и не аллоцирует больше чем 8 мегабайт, вместе со всеми картинками и приложениями. :)
По идее, вы можете взять грамматику и промежуточное представление из нашего проекта. Но проблема смены языка в том, что весь рантайм придется полностью переписать, так как код во вставках станет c++. Но это, возможно, не такая уж и большая проблема. Мы использовали дополнительные native блоки, которые могли вставлять свое содержимое в код результирующего класса или прямо в header/cpp файл.
В этот раз мы решили зайти с другой стороны. Сделать layout-независимый javascript-движок, который может исполнятся в нашем нативном браузере (не-html, см. скриншот ниже).
Попутно мы исследуем возможность компиляции js в бинарный кросс-платформенный код и свою библиотеку исполнения js, и мы даже некоторых успехов уже достигли, когда будет используемо, выложим в открытый доступ.
В html с помощью элемента div, джаваскрипта и классов стилей (!) делают компоненты графического интерфейса, которые по идее должны быть стандартными.
А непонятно откуда взявшийся javascript из инструмента для выведения alert окошек превратился в что-то типа языка программирования, хотя и отягощённого родовыми травмами.
Всё это печально, лучше бы питон и qml былы на их месте.
Вашей смелости и амбициозности остается только позавидовать.
Большое спасибо за статью и код, весьма любопытно.
Программирование по хардкору — это очень круто.
Но все-таки остаются вопросы.
Прежде всего поддержу комментатора выше: очень интересует трансляция QML в С++.
Делали ли вы какое-то сравнение с родным QtQuickCompailer-ом?
Как прогнозы относительно существующей и грядущей генерации кэша?
Планируете ли Вы продолжать крестовые походы в этом направлении?
Большое недоумение вызывает выбор в пользу HTML\JS и всей остальной обвязки.
Вы начинали с того, что вывели в мир новую связку QML+С++(вместоJS), я так понимаю в 10-м году это был еще Qt Quick 1.0. В результате QML-код не стал компилироваться в полноценный бинарник, а добавилась еще одна прослойка интерпретации\трансляции. То есть то, о чем сейчас много шумят: между нативным фреймворком и кросплатформенным Вы выбрали кросплатформенный.
Почему? Поправьте, если я где-то неправильно понял.
Хотелось бы еще узнать о том, как решен\решается вопрос с Native Look & Feel.
Если говорить о телевизорах, те же Android-TV и AppleTV, то они таки имееют определенные особенности.
Буду очень признателен, если поможете найти это в примерах.
Касательно производительности. Очень хочется больше Цифръ(!). Очень сложно поверить, что транслирование в HTML дало такой существенный прирост (говорю о дне сегодняшнем) по сравнению с QML.
У ребят из SpbTv имеется нативный низкоуровненый фремворк с поддержкой того же Qt: в этой обвязке они запускают стримовое видео на старых чернобелых Palm-ах, а там всего около 10 Мб памяти.
Хотелось бы также узнать сколько сейчас разработчиков трудятся над проектом?
Какие у вас перспективы? Простите, если вопрос лишний.
Еще раз спасибо за статью и код.
Надеюсь это не последний рассказ.
Сравнение с оригинальным qtquickcompiler'ом не делали, у нас главный сравнитель была та железка на armv5, по мощности как древние фичернокии, но разрешение побольше. Мы не использовали код Qt, всё было свое, включай транспайлер в C++. Изначально мы транслировали Qml в c++ и использовали нативный код, без всяких прослоек. Сейчас мы делаем по другому, т.к. вектор немного изменился, а выбор в пользу html был сделан только потому что это позволит сразу же расширить количество платформ на браузеры, мобильные браузеры, и телевизоры. В большинстве smartTV сейчас html/js API, а если возиться с нативом, то можно очень быстро устать, и вряд ли вендоры позволяют так легко нативные куски запускать на телеках.
Вопрос с Native Look & Feel можно решить двумя способами: вы/мы можем создать qml компоненты вокруг нативных контролов, или эмулировать стилями, как это делает Qt. AppleTV мы пока не поддерживаем, к сожалению. У нас пока не было задачи такой, мне кажется в телевизоре вектор больше на создание индивидуального стиля для приложения, чтобы он соответствовал корпоративному стилю, и т.п.
Цифры я к сожалению, не могу предоставить, я уже больше года не работаю в той корпорации, но memory footpring ui, сравнимого с телефонным, лаунчер, менюшки, приложения простые, потреблял постоянное количество памяти, устанавливаемое заранее, у нас было 8Мб.
Разработчика сейчас всего три, включая меня. Перспектив никаких нет, ахаха. Мы просто используем это в небольших коммерческих и некомерческих проектах, ну и для баловства тоже используем.
- qml расширен native { } вставками в тело компоненты и тело файла, если native мимо компоненты, чтобы можно было легко колбасить нативные компоненты, например:
Image { native { qml::DiscardableSurfaceHolder _image } }
большая часть рантайма написана на таком qml, чтобы долго не возиться - парсер парсит, создается промежуточное представление, генерятся классы 1-в-1 компонента-класс, практически как бы вы руками писали
class Rectangle : Item { qml::Property<int> x; qml::Property<int> y; };
- …
- profit!
Мне больше интересно, зачем вам нужен декларативный C++, мы делали из бедности, т.к. Qt не лезло.
Мы сейчас ведем разработку ультра-лайтового js, который залезет везде где есть c++, без депенденсов, и вроде даже каких-то результатов добились. 10-15 раз меньше памяти, работает 20-120% скорости v8 на arm :) 300к либа, пока без рантайма (но с практически готовым языком)
Если смотреть глобально, то и у pureqml, и у qmlweb, общая цель — облегчить разработку UI для современных платформ. Но подходы к достижению этой цели несколько разнятся.
QmlWeb ориентируется на полную совместимость с Qt QML, что безусловно имеет свои плюсы, в PureQML, мы тоже стараемся поддерживать совместимость, но скорее в одну сторону, чтобы можно было оригинальные Qt QML приложения запускать на PureQML. Поскольку браузеры, десктопные, мобильные или телевизионные заточены определенным образом, в PureQML используется ряд расширений для пущей производительности, если использовать их в разработке, то в обратную сторону, на оригинальном Qt QML, приложение не заработает, ну или придется кое что переписать. Ну или же не использовать расширения и есть кактус.
QmlWeb целится на HTML-based платформы. В PureQML HTML хоть и самая проработанная из платформ, но есть еще и нативная и планы по влезанию на Android/iOS по тому что принципу, что и, например, React Native.
Есть конечно же еще множество отличий, но это уже, больше, детали.
Я бы сказал, что PureQML и QmlWeb, на данном этапе, дружественно дополняют друг друга, неся изящество декларативного программирования в массы.
а-ля Integrating QML and C++ не предусмотрено?
Платформа называется pure.femto, можно сгенерировать код под неё используя либо ключ -p , либо прописав в манифесте.
Пример реализации на java под Android есть в
github.com/pureqml/qmlcore-android/tree/master/app/src/main/java/com/pureqml/android/runtime
Аналогично можно пробросить любые объекты которые вы хотите.
речь идёт о классическом клиент-серверном взаимодействии — фронтенд на qml\javascript, бакенд на чём придётся.
я увидел только автономное выполнение javascript(qml\javascript) на браузерах платформ(html5,web...), без бакенда.
Backend и интеграцию с ним мы не предоставляем, все делают по разному, обобщить практически невозможно. Вы можете использовать любые современные технологии для бэкенда.
У нас есть в roadmap обобщение простых способов работы с REST (CRUD), и других эндпоинтов, как SSE, WS, но пока не очень понятно как сделать так, чтобы угодить всем.
Как я перестал бояться и переизобрел QML