wrecc
v0.2.0
wrecc
是一个从头开始编写的小型、精简的 x86-64 C99 编译器。这个名字是对“ wreck ”这个词的一个游戏,描述了海底生锈的船。编译器以 AT&T 语法生成 x86-64 程序集,它遵循 System V ABI,我只能在 Ubuntu 和 Macos 上进行测试。没有依赖项,您只需要汇编器和链接器,然后编译器调用它们来创建最终的二进制文件。
如果您的系统上没有安装 rust 工具链,您可以直接从发行版安装最新的二进制文件(MacO、Linux):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
使用cargo binstall
cargo binstall wrecc
或从源代码构建
cargo install wrecc
由于目前并非所有关键字都已实现,因此 wrecc 使用直接内置于二进制文件中的自定义标准标头
预处理器实现所有 C99 预处理器指令,除了#line
、 #error
和#pragma
。最突出的是,它目前还缺少类似函数的宏,但这些宏已提上议程。
struct {
union {
int foo ;
long baz ;
} nested ;
int array [ 16 ];
} bar = { . nested . foo = 3 , . array [ 6 ] = 1 };
#include
typedef int ( * BinaryOperation )( int , int );
typedef struct {
BinaryOperation add ;
BinaryOperation subtract ;
} Calculator ;
int add ( int a , int b ) { return a + b ; }
int subtract ( int a , int b ) { return a - b ; }
int main () {
Calculator calc = { add , subtract };
printf ( "Result of addition: %dn" , calc . add ( 10 , 5 ));
printf ( "Result of subtraction: %dn" , calc . subtract ( 10 , 5 ));
}
char * * string_offset = ( char * * ) & "hello" + ( int )( 3 * 1 );
int array [( long ) 3 * 2 - 1 ];
除了缺少关键字之外,还缺少主要功能:
以下是仍然缺少的所有内容的列表:todo
Wrecc 也有好看的信息。出现第一个错误后,错误报告不会停止。使用--no-color
选项可以关闭错误中的颜色突出显示。目前只有错误,没有警告。
C代码 | 错误 |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
使用--dump-ast
选项进行编译时,它会打印解析树
C代码 | 谷草转氨酶 |
---|---|
#define SIZE 16
void foo ( char );
int main () {
int arr [ SIZE ] = { 1 , 2 };
char p = ( char )( * arr + 3 );
switch ( p ) {
case 'c' :
foo ( p );
}
} | |
wrecc --help
检查所有选项 cargo test --workspace
这将运行所有装置并将它们与预期快照进行比较
bash tests/snapshot_tests.sh
使用 afl.rs 运行模糊器
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
wrecc
在您的机器上无法正常工作的原因:
-L
选项传递自定义搜索路径来修复)如果您想帮助我使用这个编译器,我非常欢迎。最简单的起点可能是实现未实现的功能部分中提到的缺少的关键字/类型之一。确保所有测试仍然通过并实施您自己的测试(如果它是尚未测试的新内容)。
查看文档以获取编译器管道的高级概述。
以下资源帮助我构建了这个编译器: