English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في بعض الأحيان نريد تشغيل برنامج بلغة أخرى في نظام التشغيل إيرلانغ. في هذه الحالة، يتم كتابة البرنامج كحزمة مشتركة، وربطها بشكل ديناميكي بنظام تشغيل إيرلانغ. من وجهة نظر البرمجية، يعتبر برنامج التوجيه الموصلة برنامجًا للمنفذ ويتبع نفس البروتوكول الذي يتبعه برامج المنفذ.
إن إنشاء برامج التوجيه الموصلة هو أكثر الطرق فعالية للوصول إلى برمجة لغات أخرى من خلال واجهة إيرلانغ، ولكنها أيضًا أكثر خطورة. أي خطأ قاتل في برامج التوجيه الموصلة يمكن أن يؤدي إلى انهيار نظام إيرلانغ.
هذا مثال على تنفيذ برنامج التوجيه في إيرلانغ -
-module(helloworld). -export([start/0, stop/0]). -export([twice/1, sum/2]). start() -> start("example1_drv"). start(SharedLib) -> case erl_ddll:load_driver(".", SharedLib) of ok -> ok; {error, already_loaded} -> ok; _ -> exit({error, could_not_load_driver}) end, spawn(fun() -> init(SharedLib) end). init(SharedLib) -> register(example1_lid, self()). Port = open_port({spawn, SharedLib}, []). loop(Port). stop() -> example1_lid ! stop. twice(X) -> call_port({twice, X}). sum(X, Y) -> call_port({sum, X, Y}). call_port(Msg) -> example1_lid ! {call, self(), Msg}, receive {example1_lid, Result} -> Result end. LINKED-IN DRIVERS 223 loop(Port) -> receive {call, Caller, Msg} -> Port ! {self(), {command, encode(Msg)}}, receive {Port, {data, Data}} -> Caller ! {example1_lid, decode(Data)} end, loop(Port); stop -> Port ! {self(), close}, receive {Port, closed} -> exit(normal) end; {'EXIT', Port, Reason} -> io:format("~p ~n", [Reason]), exit(port_terminated) end. encode({twice, X}) -> [1, X]; encode({sum, X, Y}) -> [2, X, Y]. decode([Int]) -> Int.
يرجى الانتباه، أن استخدام البرامج التوجيهية معقد للغاية، ويجب توخي الحذر الشديد عند استخدام البرامج التوجيهية.