对于大学课程,我编写了一些 c/c++ 程序,然后将其发送给在线法官并根据输入进行测试。
我讨厌c++。我正在研究将 rust 编译为 c 的方法。据我所知,您可以直接在 C 程序中嵌入汇编代码片段。通过一点点探索,我应该能够弄清楚组装的风格(或者我会问制作在线评判的人)。 我应该能够将 Rust 编译为程序集。
但是这实际上可行吗?任何意味着编写编译器部分的事情都是不可能的。可以这么简单吗:
类似:
# main.c
int main() {
asm {
<rust binary piped through some pretty printer?>
}
}
有办法让它发挥作用吗?
我只需要在 rust 中定义
main
,我不关心任何互操作性或向 rust 函数传递参数。
重要的是,rust 二进制文件需要静态编译。然后
C
代码被编译为
gcc -static -O2 -Wall solution.c -lm -osolution.x # gcc 5.4.0
通过在线测试仪。
另外我假设法官不允许任何系统调用,是否可以指示 Rust 发出这样的二进制文件?
谢谢!
编辑:法官类似于 codeforces。您提交单个源代码文件。它无法执行诸如生成进程或打开文件之类的操作。
可以这么简单吗:
- 将 Rust 编译到定义的目标
- 仅通过字符串替换从 rust 二进制文件创建一个 C 程序?
不。一旦某些东西被编译成二进制文件,就很难返回源代码。字符串替换还不够。
反编译本质上是一个开放的研究问题。从任意二进制文件获取可读源实际上是不可能的。
将二进制文件反编译为与原始源不同的语言可能会很糟糕。
尝试将反编译的源代码编译回二进制文件几乎肯定会导致程序行为发生变化。
有办法让它发挥作用吗?
您最好的选择可能是转译器,或源到源编译器。
这些通常通过将源语言编译为某种中间表示形式来工作,然后而不是降低为输出另一种目标语言的汇编。
像 C2Rust 这样的项目将 C 转换为 Rust,但据我所知,没有任何东西具有真正朝另一个方向发展的能力(因为一般来说它并没有真正意义)。
正如评论中提到的,有一些旧的实现可以将 LLVM IR 转换为 C,但它们没有维护,并且具有 限制,可能会使其无法工作。
对于大学课程,我编写了一些 C/C++ 程序。我讨厌c++。
老实说,将小型 Rust 程序“转换”为 C++ 的最简单且最有效的方法可能是手动。
或者尝试要求 ChatGPT 为您转换它,看看会发生什么 😂