使用 Rust 语言开发 Erlang NIF
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 的依赖
打开 Rustler
的 Cargo.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相关推荐
- cs架构用什么语言开发_用Rust语言开发微信小程序
由于stdweb已经好久没有更新了,本人又写了另外一篇: JiaYe:用Rust语言开发微信小程序:wasm-bindgenzhuanlan.zhihu.com stdweb可以轻松将Rust代码编 ...
- rust做嵌入式开发_Redox:一款纯用Rust语言开发的操作系统
Redox:一款用Rust语言开发的操作系统 汪明军 崔广章 译 Redox是纯用rust实现的通用操作系统.目标是提供一个功能完整的类Unix微内核,既安全又是免费的.Redox操作系统兼容POSI ...
- 【erlang】吃螃蟹 rust 开发 erlang nif 的正确方式 rustler
用rust编写erlang的nif方案,以下几个star比较高 Rustler ( https://github.com/hansihe/rustler ) 这个比较火,但是没有关于如何在 Erlan ...
- Rust语言开发基础(六)基础语法
2019独角兽企业重金招聘Python工程师标准>>> 一.变量的定义和使用 其它常见的编程语言对变量的定义通常是通过声明类型和使用关键new来创建一个变量,但Rust不是,Rust ...
- Rust语言开发环境搭建详细教程
目录 一.Rust简介 1.rust历史 2.rust吉祥物 二.Rust开发环境搭建 1.C++环境安装 2.Rust下载 3.rust安装 4.rust环境检测 查看rust版本 查看cargo版 ...
- Rust语言开发基础(八)Rust的接口及其实现
2019独角兽企业重金招聘Python工程师标准>>> trait(特征)类似于其他语言中的interface或者protocol,指定一个实际类型必须满足的功能集合 一.如何理解t ...
- Rust交叉编译开发环境的搭建
为嵌入式开发引入新的编程语言 对于嵌入式系统软件和应用软件的开发而言,编程语言的重要性次于整体的软件架构设计的重要性.不过仍有必要谨慎地选择编程语言,因为这涉及开发效率.软件性能,以及团队成员的技术能 ...
- Rust语言教程(1) - 一门没有GC的语言
缘起 本来这一系列文章并不在计划中.昨天跟赵磊和七哥讨论没有GC管理内存的问题. 讨论到没有GC情况下管理内存的学习曲线,七哥认为学习曲线不陡而是使用曲线陡.诚然,如果只有malloc和free,确实 ...
- 我持续推动Rust语言支持Windows XP系统
前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发者明确的拒绝了.他们的对话大致上是以这样的形式开始和结束的(其中乙方代表官方及其拥趸 ...
最新文章
- php中怎么过滤器_PHP 过滤器(Filter)
- MongoDB使用小结:一些常用操作分享
- Android上常见度量单位【xdpi、hdpi、mdpi、ldpi】解读
- 别看360完成私有化 仍有三因素阻碍中概股回归
- react学习(53)--传参payload
- 帮助子女成功的十大路径
- C语言逗号表达式 - C语言零基础入门教程
- 在公司拿了奖,发了点奖金
- LINUX系统中动态链接库的创建和使用
- MongoDB中MapReduce介绍与使用
- iOS开发UI篇—Quartz2D简单使用(二)
- 索引大小对语句执行速度的影响
- MySQL表设计(表的关联关系)
- LayaAir WebSocket 通信
- 目前自己的几种脱壳方式
- 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
- 新手学习易语言必须掌握的命令
- 算法训练 递归输出数字三角形
- 手把手教你搭建docker环境
- 计算机如何格式化和重装系统,怎样格式化c盘重新安装系统_重装系统时如何格式化C盘...