1个不稳定版本
0.0.1 | 2024年7月25日 |
---|
#50 in #transpiler
每月131次下载
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类型转换
- 引用转换
for
和while
循环与简单的Rust范围if-else
分支- 函数和方法调用
- OpenCL内核生成
目标
本项目正在开发中,旨在方便通过OpenCL编译和执行带有注释的Rust代码的crate。
依赖关系
~265–700KB
~17K SLoC