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
選項傳遞自訂搜尋路徑來修復)如果您想幫助我使用這個編譯器,我非常歡迎。最簡單的起點可能是實現未實現的功能部分中提到的缺少的關鍵字/類型之一。確保所有測試仍然通過並實施您自己的測試(如果它是尚未測試的新內容)。
查看文件以取得編譯器管道的高級概述。
以下資源幫助我建立了這個編譯器: