Rustler 项目还不是很成熟, 基本可用. 有兴趣的可以给作者提 Issue.

Rustler 是一个在安全的用 Rust 编写 Erlang NIF 的库. 这里安全的含义是, 它不会导致 BEAM(Erlang 虚拟机)的崩溃. 该库提供了一个设施用于生成与BEAM交互的模板, 处理Erlang Term的编码和解码. Rustler 适用于 Erlang 和 Elixir, Elixir 是首选的.

功能

  • 安全性 - 用 Rust 编写的NIF绝不会导致BEAM崩溃.

  • 互操作性 - 编码和解码Rust值到Erlang Term就像调用函数一样容易.

  • 复合类型 - 可以用属性指定某个 Rust 结构为 Encodable, Decodable

  • 资源对象 - 可以安全地传递Rust结构到Erlang代码, 该结构不再被引用时自动删除.

入门

最简单的入门方法是, 使用Mix项目生成器

运行下面的命令安装Rustler的Mix项目生成器

mix archive.install https://github.com/hansihe/rustler_archives/raw/master/rustler_installer.ez

运行下面的命令创建一个rustler项目

mix rustler.new

需要安装 Nightly 版本的 Rust. 首先安装 rustup. 并在项目目录下执行 rustup override add nightly-2016-05-07-x86_64-apple-darwin.

Rust NIF

下面是一个最小的Rust NIF实现, 它只是简单的实现了一个加法函数返回两个数字的和.

#![feature(plugin)]
#![plugin(rustler_codegen)]#![feature(link_args)]
#[link_args = "-flat_namespace -undefined suppress"]
extern {}#[macro_use]
extern crate rustler;
use rustler::{ NifEnv, NifTerm, NifResult, NifEncoder };rustler_export_nifs!("Elixir.Test",[("add", 2, add)],None
);fn add<'a>(env: &'a NifEnv, args: &Vec<NifTerm>) -> NifResult<NifTerm<'a>> {let num1: i64 = try!(args[0].decode());let num2: i64 = try!(args[1].decode());Ok((num1 + num2).encode(env))
}

OSX下面的编译问题参考 https://github.com/hansihe/Ru...

与 Mix 项目集成

对于使用Mix的项目, 在Hex上有一个助手包. 这个包包含一个Mix编译器, 进行自动环境检查, crate 编译和nif加载. 如果使用mix,极其推荐使用这个包, 它使你基于Rust开发Erlang NIF更加方便.

要启动用Rust NIF的自动编译, 完成如下步骤:

  • 添加 rustler 到 mix.exs 依赖

  • 添加 :rustler 编译器到项目的 compilers 列表. compilers: [:rustler] ++ Mix.compilers

  • 添加一个 rustler_crates: ["CRATE_PATH"]project 函数, CRATE_PATH 应该是一个到包含 Cargo.toml文件的相对于mix项目更目录的相对路径.

完成后 mix.exs 文件看起来像这样:

defmodule YourProject.Mixfile douse Mix.Projectdef project do[app: :your_project,[...]compilers: [:rustler] ++ Mix.compilers,rustler_crates: ["."],deps: deps]end[...]defp deps do[{:rustler, "~> 0.0.7"}]end
end

然后可以通过 mix compile编译项目, 如果环境设置有任何问题, rustler编译器插件应该能够提示相关的说明如何解决.

加载NIF

加载一个Rust NIF和普通的NIF没什么区别. 实际的加载是通过调用 Rustler.load_nif(<LIBRARY_NAME>)完成的, 通常在Elixir用@on_load钩子来实现.

defmodule MyProject.NativeModule do@on_load :load_nifdefp load_nif do:ok = Rustler.load_nif("<LIBRARY_NAME>")end// When loading a NIF module, dummy clauses for all NIF functions are required.// NIF dummies usually just error out when called when the NIF is not loaded, as that should// never normally happen.def my_native_function(_arg1, _arg2), do: exit(:nif_not_loaded)
end

注意 <LIBRARY_NAME>Cargo.toml文件中[lib]中的库名字.

关于Rustler 的依赖

打开 RustlerCargo.toml 文件我们看到下面的代码

[dependencies]
ruster_unsafe = ">=0.4"
libc = ">=0.1"
lazy_static = "0.1.*"

它依赖 ruster_unsafe 了去实现用 Rust 开发 NIF, ruster_unsafe 是一个底层的Erlang NIF的语言绑定, Rustler 只是一个集成到 Elixir 的助手工具.

使用 Rust 语言开发 Erlang NIF相关推荐

  1. cs架构用什么语言开发_用Rust语言开发微信小程序

    由于stdweb已经好久没有更新了,本人又写了另外一篇: JiaYe:用Rust语言开发微信小程序:wasm-bindgen​zhuanlan.zhihu.com stdweb可以轻松将Rust代码编 ...

  2. rust做嵌入式开发_Redox:一款纯用Rust语言开发的操作系统

    Redox:一款用Rust语言开发的操作系统 汪明军 崔广章 译 Redox是纯用rust实现的通用操作系统.目标是提供一个功能完整的类Unix微内核,既安全又是免费的.Redox操作系统兼容POSI ...

  3. 【erlang】吃螃蟹 rust 开发 erlang nif 的正确方式 rustler

    用rust编写erlang的nif方案,以下几个star比较高 Rustler ( https://github.com/hansihe/rustler ) 这个比较火,但是没有关于如何在 Erlan ...

  4. Rust语言开发基础(六)基础语法

    2019独角兽企业重金招聘Python工程师标准>>> 一.变量的定义和使用 其它常见的编程语言对变量的定义通常是通过声明类型和使用关键new来创建一个变量,但Rust不是,Rust ...

  5. Rust语言开发环境搭建详细教程

    目录 一.Rust简介 1.rust历史 2.rust吉祥物 二.Rust开发环境搭建 1.C++环境安装 2.Rust下载 3.rust安装 4.rust环境检测 查看rust版本 查看cargo版 ...

  6. Rust语言开发基础(八)Rust的接口及其实现

    2019独角兽企业重金招聘Python工程师标准>>> trait(特征)类似于其他语言中的interface或者protocol,指定一个实际类型必须满足的功能集合 一.如何理解t ...

  7. Rust交叉编译开发环境的搭建

    为嵌入式开发引入新的编程语言 对于嵌入式系统软件和应用软件的开发而言,编程语言的重要性次于整体的软件架构设计的重要性.不过仍有必要谨慎地选择编程语言,因为这涉及开发效率.软件性能,以及团队成员的技术能 ...

  8. Rust语言教程(1) - 一门没有GC的语言

    缘起 本来这一系列文章并不在计划中.昨天跟赵磊和七哥讨论没有GC管理内存的问题. 讨论到没有GC情况下管理内存的学习曲线,七哥认为学习曲线不陡而是使用曲线陡.诚然,如果只有malloc和free,确实 ...

  9. 我持续推动Rust语言支持Windows XP系统

    前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发者明确的拒绝了.他们的对话大致上是以这样的形式开始和结束的(其中乙方代表官方及其拥趸 ...

最新文章

  1. php中怎么过滤器_PHP 过滤器(Filter)
  2. MongoDB使用小结:一些常用操作分享
  3. Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
  4. 别看360完成私有化 仍有三因素阻碍中概股回归
  5. react学习(53)--传参payload
  6. 帮助子女成功的十大路径
  7. C语言逗号表达式 - C语言零基础入门教程
  8. 在公司拿了奖,发了点奖金
  9. LINUX系统中动态链接库的创建和使用
  10. MongoDB中MapReduce介绍与使用
  11. iOS开发UI篇—Quartz2D简单使用(二)
  12. 索引大小对语句执行速度的影响
  13. MySQL表设计(表的关联关系)
  14. LayaAir WebSocket 通信
  15. 目前自己的几种脱壳方式
  16. 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
  17. 新手学习易语言必须掌握的命令
  18. 算法训练 递归输出数字三角形
  19. 手把手教你搭建docker环境
  20. 计算机如何格式化和重装系统,怎样格式化c盘重新安装系统_重装系统时如何格式化C盘...

热门文章

  1. 关联分析python牛奶面包_Python数据分析基础ReadingDay13_关联分析Apriori
  2. 初识Silverlight 4及其架构
  3. GitChat · 安全 | 聊聊 「密码找回」
  4. 后3Q大战时代的防护选择
  5. 网银测试软件,光大银行网盾检测工具
  6. 倍压电路详解-以六倍压为例
  7. GO语言————5.4 for 结构
  8. piinyin4j的使用 把中文转成拼音
  9. ESP-MESH网络的简单理解图
  10. 笔记:无线传感器网络知识点