Proposal C Bahasa (DRAFT) Mengaktifkan Fungsi Generik dan Jenis Parametrik dalam C; Prototipe tersedia di sini.
Psyche-C adalah frontend kompiler untuk bahasa C. Ini dirancang sebagai perpustakaan, dengan fokus pada implementasi alat analisis statis dari program C, tanpa memerlukan pemahaman tentang pengaturan build mereka. Di bawah adalah karakteristik utama Psyche-C:
struct , union , enum , dan typedef yang hilang (karena kegagalan #include ).API asli Psyche-C ada di C ++, tetapi API untuk bahasa lain direncanakan.
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psyche-C hadir dengan driver CNIPPET dan dapat digunakan sebagai parser biasa untuk cuplikan C. Misalnya, jika Anda mengkompilasi cuplikan di bawah ini dengan CNIPPET , Anda akan melihat diagnostik yang mirip dengan yang Anda lihat dengan GCC atau Clang.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-C dapat secara opsional (sejauh ini hanya tersedia di cabang asli) menyimpulkan jenis cuplikan C yang hilang. Misalnya, untuk cuplikan di bawah ini, Psyche-C dapat menyimpulkan deklarasi A (dapat dikompilasi) untuk T dan mensintesisnya selama kompilasi.
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;Anda mungkin ingin menggunakan fungsi ini untuk:
Kecuali untuk inferensi tipe, yang ditulis dalam Haskell, Psyche-C ditulis dalam C ++ 17; CNIPPET ditulis dalam Python 3.
Untuk membangun:
cmake CMakeLists.txt && make -j 4
Untuk menjalankan tes:
./test-suite
Dari Psyche-C itu sendiri:
Jenis inferensi untuk C: Aplikasi untuk analisis statis program yang tidak lengkap
Transaksi ACM pada Bahasa dan Sistem Pemrograman - Toplas , Volume 42, Edisi 3, Artikel No. 15, Desember 2020.
Kesimpulan Semantik Statis untuk Program C Tidak Lengkap
Prosiding ACM tentang Bahasa Pemrograman, Volume 2, Masalah Popl , Januari 2018, Artikel No. 29.
Yang menggunakan Psyche-C:
Slade: Dekompiler Model Bahasa Kecil Portabel untuk Majelis yang Dioptimalkan
Prosiding Simposium Internasional IEEE/ACM tentang Pembuatan dan Optimalisasi Kode - CGO , 2024.
Anghabench: Suite dengan satu juta tolok ukur C yang dapat dikompilasi untuk pengurangan ukuran kode
Prosiding Simposium Internasional IEEE/ACM tentang Pembuatan dan Optimalisasi Kode - CGO , 2021.
Generasi input in-bound untuk array dalam bahasa yang tidak aman
Prosiding Simposium Internasional IEEE/ACM tentang Pembuatan dan Optimalisasi Kode - CGO , Februari 2019, hlm. 136-148.
Anotasi tugas otomatis dalam kode terstruktur
Prosiding Konferensi Internasional tentang Arsitektur Paralel dan Teknik Kompilasi - Pact , November 2018, Artikel No. 31.