English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

البرامج التوجيهية في Erlang

في بعض الأحيان نريد تشغيل برنامج بلغة أخرى في نظام التشغيل إيرلانغ. في هذه الحالة، يتم كتابة البرنامج كحزمة مشتركة، وربطها بشكل ديناميكي بنظام تشغيل إيرلانغ. من وجهة نظر البرمجية، يعتبر برنامج التوجيه الموصلة برنامجًا للمنفذ ويتبع نفس البروتوكول الذي يتبعه برامج المنفذ.

إنشاء برنامج التوجيه

إن إنشاء برامج التوجيه الموصلة هو أكثر الطرق فعالية للوصول إلى برمجة لغات أخرى من خلال واجهة إيرلانغ، ولكنها أيضًا أكثر خطورة. أي خطأ قاتل في برامج التوجيه الموصلة يمكن أن يؤدي إلى انهيار نظام إيرلانغ.

هذا مثال على تنفيذ برنامج التوجيه في إيرلانغ -

النموذج

-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.

يرجى الانتباه، أن استخدام البرامج التوجيهية معقد للغاية، ويجب توخي الحذر الشديد عند استخدام البرامج التوجيهية.