Подтвердить что ты не робот

OCaml: эффективный путь к графическому интерфейсу?

Я видел несколько потоков, которые касаются программирования GUI в OCaml, но я не чувствую, что они явно приводят к четкому решению, когда требуется интерфейс GUI.

Мой вопрос, если быть более конкретным, заключается в следующем: какой самый эффективный (и легко подбираемый) подход при программировании GUI для программного обеспечения OCaml? Кто-нибудь вступает в контакт с простыми и эффективными модулями графического интерфейса пользователя в OCaml или обнаруживает эффективный пакет языка или бесплатного программного обеспечения, в котором это можно сделать, и который хорошо взаимодействует/играет с OCaml?

Я написал интерпретатор в OCaml, поэтому мои функции lexer, parser, core interpreter и т.д. - это модули OCaml. В настоящее время у меня есть решение командной строки ( "main.ml" ), которое позволяет пользователю взаимодействовать с интерпретатором, введя выражения в командную строку и получая распечатанный вывод терминала, который показывает разобранное и сокращенное выражение и т. решение командной строки предназначено только для тестирования. Я хочу, чтобы пользователи взаимодействовали через графический интерфейс, это может быть просто (Java-фреймы приходят на ум с прошлого года), но нужно каким-то образом взаимодействовать с модулями OCaml, которые я закодировал. В OCaml, который я нашел до сих пор, есть одна библиотека: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html. Кто-нибудь знает, эффективен ли он и полезен? (Я думаю, что я получил отрицательные комментарии об этой библиотеке)

Если бы я решил запрограммировать GUI на более оптимальном языке, будет ли взаимодействие с программным обеспечением: писать графический интерфейс на подходящем языке (возможно, С++, Python и т.д.), а затем скомпилировать письменный интерпретатор OCaml в исполняемый файл, а затем подключить GUI каким-то образом исполняемому файлу? Меня не интересует какое-то слабосвязанное или странное решение через трубы (я все время думаю о межпроцессной коммуникации для них, например, о том, что касается дизайна операционной системы) или сокетов (я склонен думать об этом для сетевого программирования), я представьте, что должен каким-то образом "разместить" мой интерпретатор, закодированный OCaml, в другом языке GUI-кода, если не сам OCaml. Любые мысли, рекомендации или предложения?

EDIT: Я был бы рад, если бы смог получить графический интерфейс для Linux-подобной операционной системы (то есть Linux RedHat). Если бы я мог заставить графический интерфейс работать в Windows, это было бы здорово, но, как минимум, я нацелен на Linux.

РЕДАКТИРОВАТЬ 2: Просто нашел это, есть ли у кого-нибудь мысли о "OCaml-Java"? http://ocamljava.x9c.fr/ Это звучит довольно интересно, так как оно "... возможность запускать объектные объекты Caml, которые были скомпилированы с использованием ocamlc, во-вторых, возможность компилирования Объективные источники Caml в исполняемые файлы jar." Меня беспокоит, что мне никогда не приходило в голову, что Java будет лучшим способом получить быстрый, но полезный графический интерфейс...

ТЕКУЩЕЕ РЕШЕНИЕ: рассмотрев различные варианты публикации решения, которые @Jeffrey Scofield поставил ниже, я выбрал в настоящее время глубже изучить LablGtk (что позволило бы мне оставаться в OCaml). Следующим перспективным вариантом для тех, кто смотрит на этот пост, было бы изучение интерфейса на иностранном языке с C, так как C и OCaml уже имеют отношения для начала. По-видимому, существуют способы вызова кода C в OCaml и OCaml в C (хотя это может быть очень сложно, поскольку вы по существу завершаете вызовы функций OCaml с несколько сложными функциями оболочки, которые будут более специфичны для типа функций, которые вы вызываете из в OCaml → то есть вам придется иметь дело с "отображением" каждой функции OCaml и ее аргументов внутри C). Взгляните на: http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html, для получения дополнительной информации. Первоначально OCaml-Java считалась отличной идеей, поскольку мне было удобно программировать Java GUI, но взаимодействие между двумя языками было не таким прямым, как с C и OCaml, плюс документация для этого оказалась тонкой (и с использованием OCaml -Java не был чем-то, что вы только что подобрали и добрались до материала Java GUI...). OCaml-JavaScript выглядел интересным, но имейте в виду, что вам, скорее всего, придется потратить время на хорошую кодировку HTML 5 в дополнение к некоторому JavaScript, если вы выберете этот путь. Кроме того, в SO есть несколько сообщений, в которых рассказывается о трубах и сокетах, которые являются действительными методами создания GUI-back-end системы. Однако это хорошая идея, если вы не возражаете, что ваша программная система/продукт будет "слабо связан". Я обновлю это решение, как только выясню LablGtk, и убедитесь, что он дает приемлемый интерфейс графического интерфейса для моего внутреннего кода OCaml.

4b9b3361

Ответ 1

Я думаю, что инструментарий LablGtk является достаточно современным и поддерживается в настоящее время. Так что это будет один из вариантов. Однако я не использовал его сам.

Не сложно связать набор модулей OCaml с основной программой, написанной на C, С++ или Objective C. Вы можете совершать более или менее прямые вызовы функций OCaml и получать результаты. Для этого вам нужно изучить интерфейс внешней функции, что не так сложно, как только вы попадете в паз. Затем вы можете использовать любую библиотеку графического интерфейса, которая вам нравится, со стороны семьи C. Если вас интересует такой подход, вы можете начать с главы 19 руководства OCaml.

Вы можете связать другие языки с помощью C-посредника, в зависимости от языка. Для интерпретируемого языка вы, вероятно, можете добавить свои OCaml-функции в качестве новых примитивов. (Переводчики обычно пишутся на C или С++ по моему опыту.)

Для Java существует OCaml-Java (как вы упоминаете). Я не использовал его сам, но это интригует. Я считаю, что существует несколько ограничений, наложенных JVM, поэтому вам может потребоваться немного осторожно в вашей кодировке.

Для веб-приложения есть js-of-ocaml, который компилирует OCaml в JavaScript.

Ответ 2

В настоящее время в моем проекте у моего работодателя я использую С++ и OCaml с Qt, а часть C добавлена ​​в OCaml для взаимодействия. Часть OCaml вызывается С++ как процесс, а две - с общей памятью Qt. Он работает для нашего проекта, но для более частого обмена данными он не будет эффективным.

Здесь возможно другое решение, использующее транспилятор: https://github.com/bloomberg/bucklescript

Этот проект переводит ваши OCaml-коды в JavaScript, поэтому вы можете сделать GUI на базе GUI базы данных HTML5 таким образом.

Главный автор этого транспилятора в течение некоторого времени также работал основным компилятором OCaml. Команда React также получила много отзывов об этом проекте.