wrecc
é um compilador C99 x86-64 pequeno e enxuto escrito do zero. O nome é uma brincadeira com a palavra naufrágio , que descreve um navio enferrujado no fundo do mar. O compilador emite assembly x86-64 na sintaxe AT&T, ele segue o System V ABI que só pude testar para Ubuntu e Macos. Não há dependências, você só precisa do montador e do vinculador que o compilador invoca para criar o binário final.
Se você não possui o conjunto de ferramentas Rust instalado em seu sistema, você pode instalar o binário mais recente (MacOs, Linux) diretamente das versões:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
Usando cargo binstall
cargo binstall wrecc
ou construindo a partir da fonte
cargo install wrecc
Como nem todas as palavras-chave estão implementadas atualmente, o wrecc usa cabeçalhos padrão personalizados que são incorporados diretamente no binário
O pré-processador implementa todas as diretivas do pré-processador C99, exceto #line
, #error
e #pragma
. Mais importante ainda, atualmente também faltam macros funcionais que estão na agenda.
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 ];
Além das palavras-chave ausentes, estes são os principais recursos ausentes:
Aqui está uma lista de todas as coisas que ainda faltam: todo
Wrecc também tem mensagens bonitas. O relatório de erros não para após o primeiro erro. Usando a opção --no-color
você pode desativar o realce de cores em caso de erros. Atualmente existem apenas erros e nenhum aviso.
Código C | Erros |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
Ao compilar usando a opção --dump-ast
ele imprime a árvore de análise
Código 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
Isso executa todos os fixtures e os compara com o snapshot esperado
bash tests/snapshot_tests.sh
Executa o fuzzer usando afl.rs
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
Razões para wrecc
não funcionar corretamente em sua máquina:
-L
) Se você quiser me ajudar com este compilador, eu realmente agradeceria. O lugar mais fácil para começar é provavelmente implementando uma das palavras-chave/tipos ausentes mencionadas na seção de recursos não implementados. Certifique-se de que todos os testes ainda sejam aprovados e implemente o seu próprio, se for algo novo que ainda não esteja sendo testado.
Dê uma olhada na documentação para obter uma visão geral de alto nível do pipeline do compilador.
Os seguintes recursos me ajudaram na construção deste compilador: