есть некоторое количество приложений, написанных на C, которые хочется
сделать доступными из erlang'а в виде функций (т.е. есть приложение
testApp с двумя параметрами и хочется обеспечить его вызов в виде функции
testFunc также с двумя аргументами).
Я вижу следующие пути решения:
1. Сделать что-то типа system ("testApp a b"). Но я пока не понял — можно
ли из erlang'а делать такие вызовы?
2. Написать расширения (что-то типа extensions в php), т.е. я пишу некий код
на C и со своим модулем собираю erlang либо динамически его подгружаю, а затем
уже из erl-файла делаю вызовы в виде обычных функций.
Если кто занимался подобными вещами на практике, то какие есть минусы/плюсы
у приведенных подходов (скорость выполнения, устойчивость к ошибкам, т.е. testApp упало и др.).
Здравствуйте, Бабошин Андрей, Вы писали:
БА>Если кто занимался подобными вещами на практике, то какие есть минусы/плюсы БА>у приведенных подходов (скорость выполнения, устойчивость к ошибкам, т.е. testApp упало и др.).
Посмотри в сторону http://www.erlang.org/doc/tutorial/cnode.html — оно скорее всего тебе лучше всего подойдёт.
Здравствуйте, Бабошин Андрей, Вы писали:
БА>Я вижу следующие пути решения: БА>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. Плюсы/минусы думаю понятны.