Erlang Language
NIFs
खोज…
परिभाषा
आधिकारिक दस्तावेज: http://erlang.org/doc/tutorial/nif.html
एनआईएफ को एक प्रायोगिक विशेषता के रूप में एरलांग / ओटीपी आर 13 बी03 में पेश किया गया था। इसका उद्देश्य एर्लांग कोड के अंदर से सी-कोड को कॉल करने की अनुमति देना है।
एर्लांग के बजाय सी में एनआईएफ को लागू किया जाता है, लेकिन वे एर्लांग कोड के दायरे में किसी अन्य कार्य के रूप में दिखाई देते हैं क्योंकि वे उस मॉड्यूल से संबंधित हैं जहां शामिल हुआ था। NIF पुस्तकालयों को संकलन पर जोड़ा जाता है और रनटाइम में लोड किया जाता है।
क्योंकि NIF पुस्तकालयों को गतिशील रूप से एमुलेटर प्रक्रिया में जोड़ा जाता है, वे तेज़ होते हैं, लेकिन खतरनाक भी होते हैं, क्योंकि NIF में दुर्घटनाग्रस्त होने से एमुलेटर भी नीचे आ जाता है।
उदाहरण: वर्तमान यूनिक्स समय
यहाँ एक बहुत ही सरल उदाहरण दिया गया है कि एक एनआईएफ कैसे लिखें।
निर्देशिका संरचना:
nif_test
├── c_src
│ ├── Makefile
│ └── nif_test.c
├── rebar.config
└── src
├── nif_test.app.src
└── nif_test.erl
इस संरचना को Rebar3 का उपयोग करके आसानी से आरंभ किया जा सकता है:
$ rebar3 new lib nif_test && cd nif_test && rebar3 new cmake
nif_test.c
सामग्री:
#include "erl_nif.h"
#include "time.h"
static ERL_NIF_TERM now(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
return enif_make_int(env, time(0));
}
static ErlNifFunc nif_funcs[] = {
{"now", 0, now}
};
ERL_NIF_INIT(nif_test,nif_funcs,NULL,NULL,NULL,NULL);
nif_test.erl
सामग्री:
-module(nif_test).
-on_load(init/0).
-export([now/0]).
-define(APPNAME, nif_test).
-define(LIBNAME, nif_test).
%%====================================================================
%% API functions
%%====================================================================
now() -> nif_not_loaded.
%%====================================================================
%% Internal functions
%%====================================================================
init() ->
SoName = case code:priv_dir(?APPNAME) of
{error, bad_name} ->
case filelib:is_dir(filename:join(["..", priv])) of
true -> filename:join(["..", priv, ?LIBNAME]);
_ -> filename:join([priv, ?LIBNAME])
end;
Dir -> filename:join(Dir, ?LIBNAME)
end,
erlang:load_nif(SoName, 0).
rebar.config
सामग्री:
{erl_opts, [debug_info]}.
{deps, []}.
{pre_hooks, [
{"(linux|darwin|solaris)", compile, "make -C c_src"},
{"(freebsd)", compile, "gmake -C c_src"}
]}.
{post_hooks, [
{"(linux|darwin|solaris)", clean, "make -C c_src clean"},
{"(freebsd)", clean, "gmake -C c_src clean"}
]}.
अब आप उदाहरण चला सकते हैं:
$ rebar3 shell
===> Verifying dependencies...
===> Compiling nif_test
make: Entering directory '/home/vschroeder/Projects/nif_test/c_src'
cc -O3 -std=c99 -finline-functions -Wall -Wmissing-prototypes -fPIC -I /usr/local/lib/erlang/erts-7.3.1/include/ -I /usr/local/lib/erlang/lib/erl_interface-3.8.2/include -c -o /home/vschroeder/Projects/nif_test/c_src/nif_test.o /home/vschroeder/Projects/nif_test/c_src/nif_test.c
cc /home/vschroeder/Projects/nif_test/c_src/nif_test.o -shared -L /usr/local/lib/erlang/lib/erl_interface-3.8.2/lib -lerl_interface -lei -o /home/vschroeder/Projects/nif_test/c_src/../priv/nif_test.so
make: Leaving directory '/home/vschroeder/Projects/nif_test/c_src'
Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V7.3.1 (abort with ^G)
1> nif_test:now().
1469732239
2> nif_test:now().
1469732264
3>
एरलैंग सी एपीआई (सी से एर्लांग)
आधिकारिक दस्तावेज : http://erlang.org/doc/man/erl_nif.html
एर्लांग सी एपीआई के सबसे महत्वपूर्ण संरचना, प्रकार और मैक्रो निम्नलिखित हैं:
-
ERL_NIF_TERM
:ERL_NIF_TERM
शब्दों के लिए प्रकार। यह रिटर्न प्रकार है जिसे एनआईएफ फ़ंक्शन का पालन करना चाहिए। -
ERL_NIF_INIT(MODULE, ErlNifFunc funcs[], load, reload, upgrade, unload)
: यह वह मैक्रो है जो वास्तव में एक निश्चित C फ़ाइल में परिभाषित NIF बनाता है। इसका वैश्विक दायरे में मूल्यांकन किया जाना चाहिए। आम तौर पर यह सी फ़ाइल में अंतिम पंक्ति होगी। -
ErlNifFunc
: वह प्रकार जिसके साथ प्रत्येकERL_NIF_INIT
को निर्यात किया जाने वालाERL_NIF_INIT
पास किया जाता है। यह संरचना सी फ़ंक्शन और झंडे के लिए एक नाम, आरती, एक कवि से बना है। सभीERL_NIF_INIT
परिभाषाओं के साथ इस प्रकार का एक सरणीERL_NIF_INIT
को पारित करने के लिए बनाया जाना चाहिए। -
ErlNifEnv
: Erlang वातावरण जहांErlNifEnv
निष्पादित किया जा रहा है। पर्यावरण को हर एनआईएफ के लिए पहले तर्क के रूप में पारित करना अनिवार्य है। यह प्रकार अपारदर्शी है और केवल उन कार्यों का उपयोग करके हेरफेर किया जा सकता है जो Erlang C API प्रदान करता है।