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 ];
누락된 키워드 외에 누락된 주요 기능은 다음과 같습니다.
아직 누락된 모든 항목의 목록은 다음과 같습니다.
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를 사용하여 fuzzer를 실행합니다.
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
wrecc
컴퓨터에서 제대로 작동하지 않는 이유:
-L
옵션을 사용하여 사용자 정의 검색 경로를 전달하여 수정할 수 있음). 이 컴파일러로 나를 도와주고 싶다면 정말 환영합니다. 시작하기 가장 쉬운 방법은 아마도 구현되지 않은 기능 섹션에 언급된 누락된 키워드/유형 중 하나를 구현하는 것입니다. 아직 테스트되지 않은 새로운 테스트인 경우 모든 테스트가 통과했는지 확인하고 직접 구현하세요.
컴파일러 파이프라인에 대한 높은 수준의 개요를 보려면 설명서를 살펴보세요.
다음 리소스는 이 컴파일러를 구축하는 데 도움이 되었습니다.