rust - Julia 和 Rust 之间的交互
问题描述
有没有办法在 Julia 和 Rust 之间进行交互,一种允许:
- 从 Julia 调用/执行 Rust 函数
- 从 Rust 调用/执行 Julia
谢谢
解决方案
从 Julia 调用 Rust 函数,例如 ccall
在alexcrichton/rust-ffi-examples repo 中有一个例子:
Cargo.toml
:
[package]
name = "julia-to-rust"
version = "0.1.0"
authors = ["timmonfette1 <monfette.timothy@gmail.com>"]
[lib]
name = "double_input"
crate-type = ["dylib"]
src/lib.rs
:
#[no_mangle]
pub extern fn double_input(input: i32) -> i32 {
input * 2
}
src/main.jl
:
input = Int32(10)
output = ccall((:double_input, "target/debug/libdouble_input"),
Int32, (Int32,), input)
print(input)
print(" * 2 = ")
println(output)
Makefile
:
ifeq ($(shell uname),Darwin)
EXT := dylib
else
EXT := so
endif
all: target/debug/libdouble_input.$(EXT)
julia src/main.jl
target/debug/libdouble_input.$(EXT): src/lib.rs Cargo.toml
cargo build
clean:
rm -rf target
这个想法是您导出一个未损坏的函数并将您的 rust 库编译为普通的本机共享库。然后你只需使用 Julia 的标准 C FFI。
从 Rust 调用 Julia
我想最好为此使用julia
crate - 它为原始 C API提供了一个安全的包装器。来自回购的示例:
fn main() {
use julia::api::{Julia, Value};
let mut jl = Julia::new().unwrap();
jl.eval_string("println(\"Hello, Julia!\")").unwrap();
// Hello, Julia!
let sqrt = jl.base().function("sqrt").unwrap();
let boxed_x = Value::from(1337.0);
let boxed_sqrt_x = sqrt.call1(&boxed_x).unwrap();
let sqrt_x = f64::try_from(boxed_sqrt_x).unwrap();
println!("{}", sqrt_x);
// 36.565010597564445
}
推荐阅读
- postman - 在 Postman 中进行 POST 请求时如何使用 csrf 令牌
- kubernetes - 将 k3s 集群添加到同一主机上的 argoCD 失败
- sql - JSON 函数 - 无法获取所有数据
- python - 如何处理神经网络训练中不平衡的数据集
- python - 尝试使用curve_fit制作对数回归曲线时出现RuntimeWarning。我也得到了一个未找到的最佳参数
- java - 我如何创建一个将分数写入 Java 中名为 score.csv 的文件的方法
- django - 如果 Django - SQLite 中存在具有相同凭据的多行,则仅接收一行
- javascript - 富文本值在网页中显示
- python - 将零移动到列表末尾
- java - 值类型 org.json.JSONObject 无法转换为 JSONArray