#transpiler #c #rust-to-c

rs2c

一个(非常初步)的Rust到C的转换器

1个不稳定版本

0.0.1 2024年7月25日

#50 in #transpiler

Download history 99/week @ 2024-07-20 32/week @ 2024-07-27

每月131次下载

MIT/Apache

28KB
535 代码行

rs2c

一个非常初步的Rust到C的转换器。目前并没有实现所有Rust的功能(见todo!()s)。这个转换器利用Rust和C之间的语言相似性,从Rust语法树构建C源代码。基本语言功能将随着时间的推移而可用,但像泛型或宏这样的复杂功能可能没有实际的代码分析就无法实现。

rs2c包含一个可选功能opencl,可以将Rust函数转换为OpenCL内核。

一个简单的Rust函数转换为C

fn foo(y: f32, argument: &mut [u32; 3]) -> f32 {
    if y>=10.0 {
        return y.clamp(12.0_f32, 11.0_f32);
    } else if y == 2.0_f64 as f32 { 
        barfoo(&mut argument);
    } else {
        foobar();
    }
    let z: [u32; 4] = [2; 4];
    let mut x: [f32; 3] = [y, 1.0, argument[0] as f32];
    let t: f32 = bar(&mut x);
    return x[0] * t * z[2];
}
float foo(const float y, unsigned int* argument) {
    if (y >= 10.0) {
        return clamp(y, 12.0f, 11.0f);
    } else if (y == (float)2.0) {
        barfoo(argument);
    } else {
        foobar();
    }
    const unsigned int z[4] = {2};
    float x[3] = {y, 1.0, (float)argument[0]};
    const float t = bar(x);
    return x[0] * t * z[2];
}

功能

  • 函数签名转换(不包括泛型)
  • 变量和数组初始化(需要类型注解)
  • 智能Rust到C类型转换
  • 引用转换
  • forwhile循环与简单的Rust范围
  • if-else分支
  • 函数和方法调用
  • OpenCL内核生成

目标

本项目正在开发中,旨在方便通过OpenCL编译和执行带有注释的Rust代码的crate。

依赖关系

~265–700KB
~17K SLoC