5 个不稳定版本

0.3.1 2023年11月1日
0.3.0 2023年11月1日
0.2.1 2023年9月14日
0.2.0 2023年9月14日
0.1.0 2023年6月24日

#965编程语言

每月 26 次下载

MIT/Apache

560KB
14K SLoC

cxc

cxc 是一种高性能脚本语言,旨在速度:无论是编写代码还是运行代码。它被构建为用作 Rust 主机脚本语言,因此它具有与 Rust 的完全互操作性。cxc 是关于在低级别上玩软件——即使不戴手套也能摸到东西,只是因为它很有趣。像 Rust 一样,cxc 编译成 MIR,然后可以被包括 LLVM 和 Cranelift 在内的多个后端编译或解释。因此,cxc 具有接近 Rust 的性能,但可以在运行时编译和修改。

安装

将以下内容放入你的 Cargo.toml

[dependencies]
cxc = "0.3"

该软件包的默认功能使用 cranelift 作为编译器后端。或者,你可以激活 "backend-llvm" 功能,它使用 LLVM,但它要求你已安装 LLVM,并且 llvm/includesllvm/bin 这两个子目录都位于你的路径中。两个后端都具有完整的功能兼容性。Cranelift 后端具有更快的编译时间,并且更易于移植,但生成的代码较慢。LLVM 后端不太易于移植,因为它要求用户安装 LLVM,但生成的代码更快。

你可以通过在 Cargo.toml 中放入以下内容来访问 LLVM 后端

[dependencies]
cxc = {
    version = "0.3",
    default-features = false, 
    features = ["backend-llvm", "ffi-assertions"]
}

示例

prime.cxc

# function that takes a 32 bit integer and returns a boolean
is_prime(num: i32); bool {
    divider := 2 # declare divider (type is inferred as i32)

    @ divider < num { # while divider is less than num
        ? num % divider == 0 { # if num is divisible by divider
            ; false # number is not prime, so return false
        }

        divider = divider + 1 # increment divider
    }

    ; true # num is not divisible by any numbers, so return true
}

main.rs

fn main() {
    let mut unit = cxc::Unit::new();

    let prime_code: String = 
        include_str!("../README.md").lines().skip(27).take(14).collect::<Vec<_>>().join("\n");
    unit.push_script(&*prime_code).unwrap();

    let is_prime = unit.get_fn("is_prime").unwrap().downcast::<(i32,), bool>();

    assert_eq!(unsafe { is_prime(29) }, true);
}

⚠️ 警告 ⚠️(自行承担风险使用)

  • 编译器非常年轻,还有很多错误。(如果你在使用此语言,请随时向我发送任何问题报告!任何类型的反馈都备受赞赏。)
  • cxc 是一种低级语言,因此它在运行时执行大量的低级和不安全操作。这意味着 cxc 和 Rust 代码之间的通信是不安全和不稳定的。
  • "ffi-assertions" 功能旨在在你不正确匹配 Rust 和 cxc 类型或函数时捕获问题,但它不是万能的。cxc_derive 宏有助于此,但它很容易出错。
  • 最低支持的 Rust 版本(MSRV)是最新 nightly。 该软件包使用不稳定特性,如果你使用任何其他版本,将 会发生 FFI 错误。
  • 没有文档,因为语言仍在变化。请查看测试文件夹中的示例以了解相关信息。

如果您认为这些因素是决定性的,您可以尝试一个不同的Rust脚本解决方案:不同的Rust脚本解决方案

依赖项

~4–16MB
~144K SLoC