खोज…


परिभाषा

आधिकारिक दस्तावेज: 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 प्रदान करता है।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow