Просмотр исходного кода

erlang NIF wit Zig - hello world

221V 1 неделя назад
Сommit
19241acca3
3 измененных файлов с 92 добавлено и 0 удалено
  1. 29 0
      README.md
  2. 17 0
      niftest.erl
  3. 46 0
      niftest.zig

+ 29 - 0
README.md

@@ -0,0 +1,29 @@
+# erlang + Zig NIF example
+
+```
+erl 25
+zig 0.13.0
+(l)ubuntu 22.04 lts
+
+
+
+// zig build-lib -dynamic niftest.zig -I $ERL_ROOT/usr/include --library c -femit-bin=niftest.so
+$ zig build-lib -dynamic niftest.zig -I $HOME/.kerl/erlangs/25.3/usr/include --library c -femit-bin=niftest.so
+$ erl
+Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:20:20] [ds:20:20:10] [async-threads:1] [jit:ns]
+
+Eshell V13.2  (abort with ^G)
+1> c(niftest).
+{ok,niftest}
+2> niftest:hello().
+"Hello world!"
+3>q().
+
+
+
+
+https://www.erlang.org/docs/25/man/erl_nif.html
+
+https://www.erlang.org/doc/system/nif.html
+https://www.erlang.org/doc/system/debugging.html
+```

+ 17 - 0
niftest.erl

@@ -0,0 +1,17 @@
+-module(niftest).
+
+-export([init/0, hello/0]).
+
+
+-nifs([hello/0]).
+
+-on_load(init/0).
+
+
+init() ->
+  erlang:load_nif("./niftest", 0).
+
+
+hello() ->
+  erlang:nif_error("NIF library not loaded").
+

+ 46 - 0
niftest.zig

@@ -0,0 +1,46 @@
+
+
+const erl = @cImport({
+  @cInclude("erl_nif.h");
+});
+
+
+pub export fn hello(env: ?*erl.ErlNifEnv, argc: c_int, argv: [*c]const erl.ERL_NIF_TERM) erl.ERL_NIF_TERM{
+  _ = argv;
+  _ = argc;
+  //const ERL_NIF_LATIN1 = @as(c_uint, 1);
+  return erl.enif_make_string(env, "Hello world!", 1); // ERL_NIF_LATIN1);
+}
+
+
+const nif_funcs = [_]erl.ErlNifFunc{
+  .{
+    .name = "hello",
+    .arity = 0,
+    .fptr = hello,
+    .flags = 0,
+  },
+};
+
+
+export fn nif_init() ?*erl.ErlNifEntry{
+  return &nif_entry;
+}
+
+
+var nif_entry: erl.ErlNifEntry = .{
+  .major = 2,
+  .minor = 16,
+  .name = "niftest",
+  .num_of_funcs = nif_funcs.len,
+  .funcs = @constCast(&nif_funcs),
+  .load = null,
+  .reload = null,
+  .upgrade = null,
+  .unload = null,
+  .vm_variant = "beam.vanilla",
+  .options = 1, // 0,
+  .sizeof_ErlNifResourceTypeInit = @sizeOf(erl.ErlNifResourceTypeInit),
+  .min_erts = "erts-12.0", // .entry_version = 3,
+};
+