AMACC adalah kompiler arsitektur lengan 32-bit yang dibangun dari awal. Ini berfungsi sebagai versi C yang dilucuti, yang dirancang sebagai alat pedagogis untuk belajar tentang kompiler, penghubung, dan loader.
Ada dua mode eksekusi AMACC implement:
Perlu disebutkan bahwa AMACC dirancang untuk menyusun subset C yang diperlukan untuk menjadi tuan rumah diri dengan mode eksekusi di atas. Misalnya, ini mendukung variabel global, khususnya array global.
Pohon sintaks abstrak berbasis tumpukan sederhana (AST) dihasilkan melalui fungsi parsing stmt() dan expr() kooperatif, keduanya diumpankan oleh fungsi yang menghasilkan token. Fungsi expr() melakukan beberapa optimasi konstan literal. AST diubah menjadi representasi perantara VM berbasis tumpukan (IR) menggunakan fungsi gen() . IR dapat diperiksa melalui opsi baris perintah. Akhirnya, fungsi codegen() menghasilkan instruksi ARM32 dari IR, yang dapat dieksekusi melalui jit() atau elf32() generasi yang dapat dieksekusi
AMACC menggabungkan penurunan rekursif klasik dan penguraian prioritas operator. Parser prioritas operator terbukti jauh lebih cepat daripada parser keturunan rekursif (RDP) untuk ekspresi ketika prioritas operator didefinisikan menggunakan produksi tata bahasa yang seharusnya diubah menjadi metode.
AMACC mampu menyusun file sumber C yang ditulis dalam sintaks berikut:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };Dukungan arsitektur menargetkan ARMV7HF dengan Linux ABI, dan telah diverifikasi pada Raspberry Pi 2/3/4 dengan GNU/Linux.
Generator kode di AMACC mengandalkan beberapa perilaku GNU/Linux, dan perlu untuk memasang ARM/Linux di lingkungan build Anda.
Instal GNU Toolchain untuk arsitektur A-profil
arm-linux-none-gnueabihf (target AARCH32 dengan Hard Float)Instal QEMU untuk emulasi pengguna ARM
sudo apt-get install qemu-user Jalankan make check dan Anda harus melihat ini:
[ C to IR translation ] Passed
[ JIT compilation + execution ] Passed
[ ELF generation ] Passed
[ nested/self compilation ] Passed
[ Compatibility with GCC/Arm ] ........................................
----------------------------------------------------------------------
Ran 52 tests in 8.842s
OK
Periksa pesan yang dihasilkan dengan make help mempelajari lebih lanjut.
AMACC dapat menghasilkan kode mesin dengan sangat cepat dan menyediakan 70% kinerja gcc -O0 .
Lingkungan Uji:
File Sumber Input: amacc.c
| driver kompiler | Ukuran biner (kib) | mengkompilasi waktu |
|---|---|---|
GCC dengan -O0 -ldl (Compile+Link) | 56 | 0.5683 |
GCC dengan -O0 -c (hanya kompilasi) | 56 | 0.4884 |
| Amacc | 100 | 0,0217 |
Periksa Representasi Menengah (IR) untuk kompilasi AMACC.
AMACC didasarkan pada infrastruktur C4.