当前位置: 首页 > 软件库 > 开发工具 > 编译器 >

C2Rust

编程语言转译器
授权协议 BSD
开发语言 Rust
所属分类 开发工具、 编译器
软件类型 开源软件
地区 不详
投 递 者 戎泰
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

C2Rust工具能够将大多数C模块翻译成语义上等价的rust代码。这些模块将单独编译,以生成兼容的对象文件。支持C99标准。
在我们的工具翻译C源代码之前,使用clang对其进行分析和类型检查。

帮助您将符合C99的代码迁移到Rust。它提供:

  • C to Rust翻译器
  • Rust代码重构工具
  • 对照新的Rust代码并交叉检查C代码执行情况的工具

架构图如下:

转换示例:

C 语言源码:

void insertion_sort(int const n, int * const p) {

    for (int i = 1; i < n; i++) {
        int const tmp = p[i];
        int j = i;
        while (j > 0 && p[j-1] > tmp) {
                p[j] = p[j-1];
                j--;
        }
        p[j] = tmp;
    }
}

转换后的 Rust 代码:

#![allow(dead_code,
         mutable_transmutes,
         non_camel_case_types,
         non_snake_case,
         non_upper_case_globals,
         unused_mut)]
#![feature(libc)]
extern crate libc;
#[no_mangle]
pub unsafe extern "C" fn insertion_sort(n: libc::c_int, p: *mut libc::c_int) {
    let mut i: libc::c_int = 1i32;
    while i < n {
        let tmp: libc::c_int = *p.offset(i as isize);
        let mut j: libc::c_int = i;
        while j > 0i32 && *p.offset((j - 1i32) as isize) > tmp {
            *p.offset(j as isize) = *p.offset((j - 1i32) as isize);
            j -= 1
        }
        *p.offset(j as isize) = tmp;
        i += 1
    };
}

 

  • 一个用 rust 编写的命令和控制框架 link 是一个用 rust 编写的命令和控制框架。目前处于测试阶段。link 提供了 MacOS、Linux 和 Windows 植入程序,这些植入程序可能缺乏其他更成熟的命令和控制框架提供的必要规避技术。构建过程: git clone repo cargo run cargo build --release #构建链接服务器可执行文件 https://

  •  pdf版本方便阅读 前言   "FFI"是" Foreign Function Interface"的缩写,大意为不同编程语言所写程序间的相互调用。鉴于C语言事实上是编程语言界的万国通,世界通用语,所以本文主要围绕着C和Rust之间的互通来学习。 单刀直入,话不啰嗦,好比学外语, 先要从认字开始, 对于编程语言来说就是各种“基础类型”, 因为类型代表了:可操作集和布局, 有人会疑问“类型布局”是

  • Rust 枚举 Enum 枚举 (enum 或 enumeration) 允许你通过列举可能的成员来定义一个枚举类型;枚举出所有的可能值,例如扑克牌花色: enum PokerSuit { Clubs, Spades, Diamonds, Hearts, } 因为枚举值只可能是其中某一个成员,可以把它们当作相同的类型进行传参。 枚举类型是一个类型,它会包含所有可能的枚举成员, 而

  • 基本数据类型(标量类型) 在rust里数据类型可以分为标量(scalar)和复合(compound)类型,标量类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。rust是静态强类型语言,它在编译时就需要知道所有变量的类型,并且不同类型的数据之间是不允许进行运算的。 整数类型 rust根据整数占据的二进制位数,提供了以下多种整数类型。可以根据业务的实际场景进行选

  • 本文节选自<<Rust语言圣经>>一书 欢迎大家加入Rust编程学院,一起学习交流: QQ群:1009730433 枚举 枚举(enum或enumeration)允许你通过列举可能的成员来定义一个**枚举类型**,例如扑克牌花色: enum PokerSuit { Clubs, Spades, Diamonds, Hearts, } 如果在此之前你没有在其它语言中使用过枚举,那么

  • This issue appears in the nightly compiler since toolchain version nightly-2020-08-14 (rustc 1.47.0-nightly (81dc88f88 2020-08-13)). It does not appear with toolchain nightly-2020-08-13 (rustc 1.47.0-

  • 使用nightly rust的asm!宏 Rust的内联汇编基础语法如下(需要启用#!(feature(asm))) asm!( assembly template : 输出操作数 : 输入操作数 : Clobber : 选项 ); assembly template assembly template是唯一需要的参数并且必须是原始字符串例如asm!("nop"),该指令不需要任何

  • 改代码将十六进制字符串转化元祖结构,需要在toml文件中dependencies目录下引入thiserror, 知识点:from_str_radix将十六进制字符串切片转换成数字, 将标准库error转化成自定义error, use std::convert::TryFrom; use thiserror::Error; #[derive(Debug, Error)] enum RGBerror

 相关资料
  • 问题内容: 我正在尝试更好地理解它们之间的区别。我在网上找到了很多解释,但是它们倾向于抽象的差异,而不是实际的含义。 我的大部分编程经验都来自CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可以从以编译语言编写的程序中分发可执行文件这一事实之外,每种类型是否有优点/缺点?通常,我听到人们争辩说解释语言可以交互使用,但是我相信编译语言也可以

  • 问题内容: 我正在尝试更好地理解它们之间的区别。我在网上找到了很多解释,但它们倾向于抽象的差异,而不是实际的含义。 我的大部分编程经验都来自CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可以从以编译语言编写的程序中分发可执行文件这一事实之外,每种类型是否有优点/缺点?通常,我听到人们争辩说解释语言可以交互使用,但是我相信编译语言也可以具

  • 问题内容: 过去,我使用C 作为编程语言。我知道用C 编写的代码会经过编译过程,直到成为目标代码“机器代码”为止。 我想知道Java在这方面如何工作。用户编写的Java代码如何由计算机运行? 问题答案: Java实现通常使用两步编译过程。Java编译器将Java源代码编译为字节码。字节码由Java虚拟机(JVM)执行。现代JVM使用称为即时(JIT)编译的技术将字节码编译为硬件CPU在运行时即时理

  • 主要内容:#if 的用法,#ifdef 的用法,#ifndef 的用法,三者之间的区别假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢? 这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出不同的平台。 Windows 有专有的宏 ,Linux 有专有的宏 ,以现有的知识,我们很容易就想到了 if else,请看下面的代码: 但这段代码是错误的,在 Windows 下提示 __linu

  • 上一个小节 C 语言的程序结构中我们简单的认识了一下 C 语言的程序到底由那些部分组成,但是仅仅了解 C 语言的程序结构还不够,仅仅是万里长征走完了第一步,后面还需要进行很多的步骤才能让程序成为一个可以使用的工业产品。还记的上一个小节中我们提到的 gcc 吗?其实这是一个 C 语言的编译器,这一个小节我们就来学习一下编译器这个概念。 1. C 语言编译器 每个语言都需要编译器,甚至包括可以直接操作

  • 本文向大家介绍简述解释型和编译型编程语言相关面试题,主要包含被问及简述解释型和编译型编程语言时的应答技巧和注意事项,需要的朋友参考一下