wrecc
— небольшой, компактный компилятор C99 для x86-64, написанный с нуля. Название представляет собой игру слова « затонувший корабль », обозначающего ржавеющий корабль на морском дне. Компилятор генерирует сборку x86-64 в синтаксисе AT&T, он соответствует ABI System V, который я мог протестировать только для Ubuntu и Macos. Здесь нет никаких зависимостей, вам нужны только ассемблер и компоновщик, которые затем вызывает компилятор для создания окончательного двоичного файла.
Если в вашей системе не установлен набор инструментов Rust, вы можете установить последнюю версию двоичного файла (MacOs, 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
) Если вы хотите помочь мне с этим компилятором, я буду очень рад этому. Вероятно, проще всего начать с реализации одного из недостающих ключевых слов/типов, упомянутых в разделе нереализованных функций. Убедитесь, что все тесты проходят успешно, и реализуйте свои собственные, если это что-то новое, что еще не тестируется.
Ознакомьтесь с документацией, чтобы получить общее представление о конвейере компилятора.
Следующие ресурсы помогли мне в создании этого компилятора: