[erlang] кросс-языковая интеграция, написание расширений
От: Бабошин Андрей Германия http://andreybaboshin.livejournal.com/
Дата: 25.04.08 19:25
Оценка:
Добрый день,

есть некоторое количество приложений, написанных на C, которые хочется
сделать доступными из erlang'а в виде функций (т.е. есть приложение
testApp с двумя параметрами и хочется обеспечить его вызов в виде функции
testFunc также с двумя аргументами).
Я вижу следующие пути решения:
1. Сделать что-то типа system ("testApp a b"). Но я пока не понял — можно
ли из erlang'а делать такие вызовы?
2. Написать расширения (что-то типа extensions в php), т.е. я пишу некий код
на C и со своим модулем собираю erlang либо динамически его подгружаю, а затем
уже из erl-файла делаю вызовы в виде обычных функций.

Если кто занимался подобными вещами на практике, то какие есть минусы/плюсы
у приведенных подходов (скорость выполнения, устойчивость к ошибкам, т.е. testApp упало и др.).

Спасибо.
Re: [erlang] кросс-языковая интеграция, написание расширений
От: Cyberax Марс  
Дата: 25.04.08 22:20
Оценка: 2 (1)
Здравствуйте, Бабошин Андрей, Вы писали:

БА>Если кто занимался подобными вещами на практике, то какие есть минусы/плюсы

БА>у приведенных подходов (скорость выполнения, устойчивость к ошибкам, т.е. testApp упало и др.).
Посмотри в сторону http://www.erlang.org/doc/tutorial/cnode.html — оно скорее всего тебе лучше всего подойдёт.
Sapienti sat!
Re: [erlang] кросс-языковая интеграция, написание расширений
От: Аноним  
Дата: 27.04.08 01:22
Оценка:
Здравствуйте, Бабошин Андрей, Вы писали:

БА>Я вижу следующие пути решения:

БА>1. Сделать что-то типа system ("testApp a b"). Но я пока не понял — можно
БА>ли из erlang'а делать такие вызовы?
БА>2. Написать расширения (что-то типа extensions в php), т.е. я пишу некий код
БА>на C и со своим модулем собираю erlang либо динамически его подгружаю, а затем
БА>уже из erl-файла делаю вызовы в виде обычных функций.

Собственно вариантов решения такой задачи в эрланге 3.

1. Port Drivers. Оформляется динамическая библиотека (DLL в винде, .so в юниксе). Работает in-VM, поэтому если важна скорость или необходимо во внешние функции передавать большие объёмы данных, этот вариант предпочтительней. Из недостатков — если внешний модуль глюканёт, потянет за собой всю VM.

2. Ports. Внешняя программа работает отдельным процессом, передача данных между ней и эрлангом через stdin/stdout. Плюсы и минусы с точностью до наоборот первого варианта. Медленнее, но надёжнее.

3. C-nodes. Внешний процесс, передача данных по сети. Из эрланга программа видится как hidden node. Плюсы/минусы думаю понятны.

Это всё описано в Interoperability Tutorial.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.