首页 > 解决方案 > Julia 和 Rust 之间的交互

问题描述

有没有办法在 Julia 和 Rust 之间进行交互,一种允许:

  1. 从 Julia 调用/执行 Rust 函数
  2. 从 Rust 调用/执行 Julia

谢谢

标签: rustjulia

解决方案


从 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

我想最好为此使用juliacrate - 它为原始 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
}

推荐阅读