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

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

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

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

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

РЕДАКТИРОВАТЬ: Я был бы счастлив, если бы смог получить графический интерфейс для Linux-подобной операционной системы (например, Linux RedHat). Если бы я мог заставить графический интерфейс работать в Windows, это было бы здорово, но как минимум я стремлюсь к Linux.

РЕДАКТИРОВАТЬ 2: Только что нашел, есть ли у кого-нибудь мысли по поводу «OCaml-Java»? http://ocamljava.x9c.fr/ Звучит довольно интересно, так как "... возможность запускать Objective Caml исходники, которые были скомпилированы с использованием ocamlc; во-вторых, возможность компилировать исходные коды Objective 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 казалась отличной идеей, учитывая, что мне было комфортно программировать GUI на Java, но взаимодействие между двумя языками было не таким прямым, как с C и OCaml, к тому же документация для этого оказалась тонкой (и с использованием OCaml -Java - это не то, что вы просто берете и получаете доступ к материалам графического интерфейса Java ...). OCaml-JavaScript выглядел интересно, но имейте в виду, что вам, скорее всего, придется потратить время на хорошую настройку кодирования HTML 5 в дополнение к некоторому JavaScript, если вы выберете этот путь. В качестве альтернативы, здесь, в SO, есть несколько сообщений, в которых говорится о каналах и сокетах, которые являются допустимыми методами создания серверной системы с графическим интерфейсом пользователя. Однако это хорошая идея, если вы не возражаете против того, чтобы ваша программная система / продукт была «слабо связанной». Я обновлю это решение, как только разберусь с LablGtk и гарантирую, что оно дает приемлемый интерфейс GUI для моего внутреннего кода OCaml.


person 9codeMan9    schedule 27.03.2013    source источник
comment
Было бы полезно узнать, какова ваша целевая платформа или платформы. Как бы то ни было, вполне разумно использовать сокеты на одном хосте. Если вы работаете в Unix-подобной системе, существуют сокеты домена Unix.   -  person Jeffrey Scofield    schedule 27.03.2013
comment
Только что обновил свой пост информацией о целевой платформе в соответствии с вашим комментарием! Кроме того, @JeffreyScofield, хотя вы правы в том, что сокеты могут не исключать, мне было бы очень интересно, есть ли какое-то решение, в котором я мог бы упаковать графический интерфейс и интерпретатор (написанный на OCaml) в одну программу / исполняемый файл, но если это не возможный путь, тогда сокеты могут быть подходящим вариантом ... но я думаю, что это более слабосвязанная система, если бы я мог держать вещи более тесно связанными, это было бы идеально!   -  person 9codeMan9    schedule 27.03.2013


Ответы (2)


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

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

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

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

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

person Jeffrey Scofield    schedule 27.03.2013
comment
Хотя все эти варианты привлекательны, мне действительно нравится интерфейс OCaml с внешними функциями и C. Какие ресурсы вы рекомендуете мне проконсультироваться, чтобы изучить FFI, написанный на C? Я знаю, как программировать на C, но как интегрировать FFI? С чего мне начать учиться это делать? - person 9codeMan9; 27.03.2013
comment
Я узнал все, что знаю об этом, из главы 19 документа Руководство по OCaml! - person Jeffrey Scofield; 27.03.2013
comment
Представленные вами пути решения хороши. Я добавлю вверху примечание о том, что я решил делать. Спасибо за понимание! - person 9codeMan9; 29.03.2013
comment
Эта ссылка теперь ведет к главе 19 руководства, Взаимодействие C с OCaml. - person semperos; 05.11.2013

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

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

Этот проект переводит ваши коды OCaml в JavaScript, чтобы вы могли создавать графический интерфейс на базе HTML5 таким образом.

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

person Enzojz    schedule 11.06.2017