Rust的FFI

一、开放应用

多平台,不同语言之间的互相调用,这是任何一门想流行的语言都不能绕过去的坎儿。光想自己玩,不带大家玩,最后大家就都不和你玩儿了。在前面搞过安卓,里面有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,就明白了。
努力吧,归来的少年!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值