wrecc
、スクラッチから書かれた小さく無駄のない x86-64 C99 コンパイラーです。この名前は、海底で錆びた船を表す難破船という言葉をもじったものです。コンパイラは、AT&T 構文で x86-64 アセンブリを出力します。これは、Ubuntu と Macos についてのみテストできた System V ABI に準拠しています。依存関係はなく、必要なのはアセンブラとリンカだけであり、コンパイラは最終バイナリを作成するためにこれらを呼び出します。
システムに 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 はバイナリに直接組み込まれたカスタム標準ヘッダーを使用します。
プリプロセッサは、 #line
、 #error
および#pragma
を除くすべての C99 プリプロセッサ ディレクティブを実装します。ただし、最も顕著なのは、現在予定されている関数のようなマクロも欠落していることです。
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コード | AST |
---|---|
#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
オプションを使用してカスタム検索パスを渡すことで修正できます)このコンパイラについて協力していただけるのであれば、大歓迎です。おそらく最も簡単な開始点は、「未実装の機能」セクションで説明されている不足しているキーワード/タイプの 1 つを実装することです。すべてのテストが合格することを確認し、まだテストされていない新しいものである場合は独自のテストを実装します。
コンパイラ パイプラインの概要を理解するには、ドキュメントを参照してください。
このコンパイラを構築する際には、次のリソースが役に立ちました。