Какой хороший способ написать интерфейс Cocoa для приложения Erlang?

Я изучаю возможность написания приложения в Erlang, но для этого потребуется часть, написанная в Cocoa (предположительно Objective-C). Я бы хотел, чтобы интерфейс и бэк-конец могли легко общаться. Как это можно сделать лучше всего?

Я могу думать о том, как использовать порты C и связанные процессы, но я думаю, что мне нужна обратная ситуация (входной интерфейс и подключение к внутреннему контуру). Есть именованные каналы (FIFO), или я могу использовать сетевые коммуникации через порт TCP или названный BSD-сокет. У кого-нибудь есть опыт в этой области?

Ответы

Ответ 1

Один из способов заключается в том, чтобы ядро ​​Erlang приложения являлось демоном, с которым интерфейсный интерфейс Cocoa связывается с сокером Unix-домена, используя какой-то простой протокол, который вы разрабатываете.

Использование сокета Unix-домена означает, что демон Erlang можно запустить по требованию launchd, а интерфейс Cocoa может найти путь к сокету, который будет использоваться через переменную среды. Это делает рандеву между приложением и демоном тривиальным, а также упрощает разработку нескольких фронтов (или, возможно, фреймворк, который обменивает связь с демоном).

Система Mac OS X launchd действительно классная. Если вы укажете, что задание должно запускаться по требованию через безопасный сокет Unix-домена, launchd фактически создаст сам сокет с соответствующими разрешениями и опубликует его местоположение через переменную среды, названную в списке свойств работы. Задание, при запуске, фактически будет передано файловым дескриптором в сокет launchd, когда он выполнит простую регистрацию.

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

Ответ 2

Один из способов - путь Тео с NSTask, NSPipe и NSFileHandle. Вы можете начать с просмотра кода CouchDBX http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

Порты возможны, но не очень приятны.

Есть ли причина, почему эта связь не может быть просто обработана с помощью сообщений mochiweb и json?

Ответ 3

Обычно при создании приложений Cocoa, которые передними командами UNIX или другими безголовыми программами вы используете NSTask:

Используя класс NSTask, ваша программа может запускать другую программу в качестве подпроцесса и может контролировать выполнение этих программ. Объект NSTask создает отдельный исполняемый объект; он отличается от NSThread тем, что он не разделяет пространство памяти с процессом, который его создает.

Задача работает в среде, определяемой текущими значениями для нескольких элементов: текущим каталогом, стандартным вводом, стандартным выходом, стандартной ошибкой и значениями любых переменных среды. По умолчанию объект NSTask наследует свою среду от процесса, запускающего его. Если есть какие-либо значения, которые должны отличаться для задачи, например, если текущий каталог должен измениться, вы должны изменить значение перед запуском задачи. Среда заданий не может быть изменена во время ее работы.

Вы можете взаимодействовать с бэкэнд-процессом с помощью stdin/stdout/stderr. Bascially NSTask - это обертка высокого уровня вокруг exec (или fork или system, я всегда забываю разницу).

Как я понимаю, вы не хотите, чтобы программа Erland была фоновым демоном, который работает непрерывно, но если вы это сделаете, перейдите с предложением @Chris.

Ответ 4

Подходы к сокетам домена NSTask и Unix - отличные советы. Что-то, на что нужно следить, - это реализация FFI Erlang, которая в работах:

http://muvara.org/crs4/erlang/ffi

Ответ 5

erl_call должен использоваться из NSTask. Я использую его из команды Textmate, и это очень быстро. Объединение erl_call с OTP gen_server позволит вам сохранять постоянное бэкэнд-состояние с относительной легкостью. См. Мой пост на erl_call в моем блоге для более подробной информации.

Ответ 6

Используя NSTask, вы также можете использовать PseudoTTY.app (который позволяет интерактивную связь)!

Другим примером кода может быть BigSQL, клиент PostgreSQL, который позволяет пользователю отправлять SQL-сервер на сервер и отображать результат.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml