OCaml + Qt/QML

В мире OCaml всё странно с проектированием GUI. Много фреймворков реализуют GUI с помощью реактивного программирования, но они специфичные для OCaml. Из общеприменимого можно называть Melange/ReasonML, который включает в себя поддержку программирования для Web с помощью ReactJS. Но HTML-движок имеет свои недостатки, в частности размер образа и производительность, по этому появились проекты React Native, Revery (свой нативный фреймворк для десктопа, где входной синтаксис повторяет проектирование на ReasonML для React, на данный момент заброшен) и Bogue (чисто OCaml, SDL2, GPU acceleration, по сути клон WinForms/Delphi/Swing).

Qt/QML остался без внимания. Это фреймворк для проектирования кроссплатформенных приложений для десктопа и смартфонов. Если не вдаваться в детали, то в нём три части: язык разметки, скрипты на JavaScript для написания простых преобразований GUI, и большое количество библиотек на С++.

Цель работы: скрестить Qt/QML и OCaml. Из этого можно выделять задачи и подзадачи на неопределенное количество человек.

частично сделано - Хочется, чтобы была возможность описывать всё (GUI и бизнес-логику) не уходя сильно от языка OCaml. Сейчас в Qt/QML GUI описывается на языке QML, хотелось бы, чтобы всё переехало внутрь OCaml. Как вдохновение можно посмотреть как совмещается Javascript и HTML тэги (так называемый JSX). - Я сделал эксперимент на эту тему с Camlp5. Там HTML тэги в коде раскрываются в вызовы функций. Информации о типах там, правда, нет, но может она на первых порах и не нужна. Если таки нужна будет -- придется делать как в ReasonML. - Когда у нас будет поддержка описания разметки GUI в OCaml, нужно будет перегонять эту разметку в вид, понятный Qt/QML. Для начала предлагаю порождать код на QML напрямую, и вставлять в код на OCaml показ окошка с соответствующим кодом. Сложности: - Надо придумать, как именно использовать одни QML компоненты в других QML компонентах - В QML можно вставлять код на JavaScript, но это можно оставить на потом - Это частично сделано в рамках учебных практик.

конь не валялся

  • В Qt/QML можно писать мелкие скрипты на Javascript. Очень не хотелось бы, чтобы код на OCaml перемешивался с нетипизированным кодом на Javascript. Гораздо лучше, если бы эти GUI-ориентированные скрипты писались на OCaml, и конвертировались в JavaScript вместе с получением QML файлов. ReasonML уже научился порождать по файлу на OCaml модуль на JavaScript, надо попробовать прикрутить это всё к Qt/QML и понять какие подводные камни там будут.
  • На данный момент Qt/QML с JavaScript частично интерпретируется и частично JITится. Из-за этого могут возникать некоторые проблемы с производительностью кода и скоростью старта программы. На практике это решается несколькими способами:
  • компилировать всё ahead-of-time;
  • перегонять QML в С++ и потом запускать, частично или целиком (раз, два).

В принципе можно сразу порождать С++ из OCaml, но из соображений - отладки и, - трудностей и неожиданных подводных камней, связанных с таким подходом думаю, что целесообразней начать с порождения QML

В зависимости от задач можно защищать как разное. Публикабельность пока не понятна, если удастся удачно встроиться в систему типов OCaml и навернуть типизацию -- может быть.

Первые задачи выглядят как курсовые. Публикабельность не понятна.

Ознакомительная задача про lablqml

Можно заниматься менее амбициозными задачами, а именно обязать пользователя писать на QML на QML, а логику на OCaml. Такой подход предлагается в проекте lablqml. Там осталось некоторое количество не очень сложных задач, я вижу их как ознакомительные или вводные для постепенного погружения в мир Qt/QML и OCaml. По сути надо взять некоторые прикольные особенности QML последних версий и поддержать примеры с оными в lablqml.

На семестр, для второго курса.

Это копия текста с https://kakadu.github.io/2024/topics#ocaml-qml. Исправления этой и другие тему будут публиковаться в первую очередь там. Также там можно найти и другие темы.

Уровень

2 курс, 3 курс


Руководитель

Kosarev Dmitry


Консультант

Kosarev Dmitry


Источник

От себя лично