wrecc
est un petit compilateur C99 x86-64 léger écrit à partir de zéro. Le nom est un jeu de mots sur épave qui décrit un navire rouillé au fond de la mer. Le compilateur émet un assemblage x86-64 dans la syntaxe AT&T, il adhère à l'ABI System V que je n'ai pu tester que pour Ubuntu et Macos. Il n'y a pas de dépendances, vous avez seulement besoin de votre assembleur et de votre éditeur de liens que le compilateur appelle ensuite pour créer le binaire final.
Si la chaîne d'outils Rust n'est pas installée sur votre système, vous pouvez installer directement le dernier binaire (MacOs, Linux) à partir des versions :
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
Utilisation cargo binstall
cargo binstall wrecc
ou construire à partir de la source
cargo install wrecc
Étant donné que tous les mots-clés ne sont pas actuellement implémentés, wrcc utilise des en-têtes standards personnalisés qui sont directement intégrés au binaire.
Le préprocesseur implémente toutes les directives du préprocesseur C99, à l'exception de #line
, #error
et #pragma
. Plus important encore, il manque actuellement également des macros de type fonction qui sont à l'ordre du jour.
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 ];
Outre les mots-clés manquants, voici les principales fonctionnalités manquantes :
Voici une liste de toutes les choses qui manquent encore : todo
Wrecc a également de jolis messages. Le rapport d'erreurs ne s'arrête pas après la première erreur. En utilisant l'option --no-color
, vous pouvez désactiver la mise en évidence des couleurs dans les erreurs. Actuellement, il n'y a que des erreurs et aucun avertissement.
codeC | Erreurs |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
Lors de la compilation à l'aide de l'option --dump-ast
il imprime l'arbre d'analyse
codeC | 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
Cela exécute tous les appareils et les compare à l'instantané attendu
bash tests/snapshot_tests.sh
Exécute le fuzzer en utilisant afl.rs
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
Raisons pour lesquelles wrecc
ne fonctionne pas correctement sur votre machine :
-L
) Si vous souhaitez m'aider avec ce compilateur, je serais vraiment ravi. Le point de départ le plus simple est probablement d’implémenter l’un des mots-clés/types manquants mentionnés dans la section des fonctionnalités non implémentées. Assurez-vous que tous les tests réussissent toujours et implémentez les vôtres s'il s'agit de quelque chose de nouveau qui n'est pas déjà testé.
Jetez un œil à la documentation pour obtenir un aperçu général du pipeline du compilateur.
Les ressources suivantes m'ont aidé à créer ce compilateur :