一、开放应用
多平台,不同语言之间的互相调用,这是任何一门想流行的语言都不能绕过去的坎儿。光想自己玩,不带大家玩,最后大家就都不和你玩儿了。在前面搞过安卓,里面有JNI;后来又搞过c#,里面也有相关调用的开发约定。再后来,又有Python、Golang等等吧。反正都接触过。正所谓在一个优秀的统帅的面前没有一个不行的将军,要因材而用。语言亦是如此,各用所长,最后大家一起搞定工程即可。正如菜刀,你看看专业的厨师那有多少种?有砍骨头的,有切肉的,有切菜的,有切鱼的。这样就明白了吧。
二、FFI
Rust当然也有自己的一个规则或者说标准,那就是FFI(Foreign Function Interface)与其它语言交互的接口。在分布式的开发中,一般会用一些服务来实现,在单机上一般用这个来实现。这样做效率高,符合传统的程序员开发的认知。特别是在Rust的领域,大多数是和固件有关系的,这都要求FFI必须、天然的存在才搞得定。
写Rust的FFI本身并没有什么多大的难度,但是它一般要求使用指针和unsafe,这其实就跳脱开了Rust的本身的优势所在,对开发者,有一定的考验。搞过C/C++编程的都知道,ABI(二进制兼容)它是王道啊,能写好这个,自然一切都不在话下。计算机才不管你啥语言,反正对它来说都是二进制的指令和数据。Rust目前支持的ABI约定有:
stdcall、aapcs、cdecl、fastcall、vectorcall、Rust、rust-intrinsic、system、C、win64、sysv64。估计写过c++调用库的一眼就看明白了,只是一种调用约定,大家不要太高看他。一时不明白,慢慢就明白了。
另外还要提到一个目前风头正劲的WASM,这玩意儿RUST也必须是不得不强力的搞一下啊,不知道啥是Wasm,去学习一下吧,真得很有用。
三、应用
FFI的应用,其实在前面提到了,说难不难,说简单也不简单,重点是多用。这个东西和技术本身没有太大关系,就是按照一系列的约定干活就可以了。下面看一个简单的例子:
#[no_mangle]
pub extern "C" fn addition(a: u32, b: u32) -> u32 {
a + b
}
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
extern uint32_t
addition(uint32_t, uint32_t);
int main(void) {
uint32_t sum = addition(1, 2);
printf("%" PRIu32 "\n", sum);
}
库的调用方式如下:
//Cargo.toml
[dependencies]
libc = "*"
[lib]
crate-type = ["cdylib"]
不过这事儿得亲自操刀搞一搞,否则可能就是纸上谈兵。这种事儿太多了,许多代级错误可能会让人欲仙欲死。更多的可以看一下下面这个官方的文档:
http://jakegoulding.com/rust-ffi-omnibus/
四、总结
团结一切可以团结的语言,互相促进,互相学习,互相支持,互相做助力,Rust这点还是做的不错。人的能力有大小,但人际交往,是个大问题。学学Rust,就明白了。
努力吧,归来的少年!