Ini adalah port skrip VIM 8cc yang dibangun di ELVM. Dengan kata lain, ini adalah kompiler C lengkap yang ditulis dalam skrip vim.
8cc adalah kompiler C kecil yang ditulis dengan baik untuk x86_64 Linux. Ini C11-sadar dan diselenggarakan sendiri.
Elvm adalah e so l ang v irtual m achine. ELVM Retargets 8cc untuk memancarkan representasi perantara sendiri, EIR. ELVM mengkompilasi kode C ke dalam EIR dengan retargeted 8cc sebagai frontend. Dan kemudian menerjemahkan EIR ke dalam berbagai target (Python, Ruby, C, BrainFXXK, Piet, Befunge, Emacs Lisp, ...) di backend. Arsitekturnya menyerupai llvm. Presentasi ini adalah hal yang baik untuk mengetahui arsitektur ELVM lebih lanjut (meskipun dalam bahasa Jepang).
ELVM dapat mengkompilasi dirinya menjadi berbagai target. Jadi saya menambahkan backend 'vim skrip' baru dan menggunakannya untuk menerjemahkan kode C 8cc ke dalam skrip VIM.
Sekarang 8cc.vim ditulis dalam skrip VIM murni. 8cc.vim terdiri dari frontend (8cc yang disesuaikan) dan backend (ELC). Itu dapat mengkompilasi kode C ke dalam skrip vim. Dan tentu saja VIM dapat mengevaluasi kode skrip VIM yang dihasilkan.
Perhatikan bahwa ini adalah proyek mainan. 8cc.vim jauh lebih lambat. Dibutuhkan 824 (frontend: 430 + backend: 396) detik untuk mengkompilasi program putchar() paling sederhana di MacBook Pro awal 2015 (2,7 GHz Intel Core i5). Tapi sebenarnya itu berhasil!
Saat VM berjalan pada skrip VIM, 8cc.vim bekerja di windows Linux, OS X dan (semoga).
Silakan klon repositori ini dan :packadd (silakan lihat :help pack-add ).
Atau silakan gunakan manajer plugin favorit Anda (VIM-PLUG, DEIN.VIM dan sebagainya).
:EccCompile:EccRuneightcc#compile()eightcc#run()Siapkan kode C Anda di buffer saat ini. Berikut ini adalah contoh 'halo dunia'.
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} Lalu jalankan :EccCompile . Perhatikan bahwa Anda dapat menggunakan beberapa opsi seperti --verbose untuk ini. Silakan lihat :EccCompile --help untuk lebih detail.
Butuh waktu lama 20 menit atau lebih. Mari kita beristirahat dan dapatkan ☕.
Sebagai hasilnya, buffer baru dibuka dengan kode skrip VIM yang dikompilasi dari kode C. Memuatnya dengan :w putchar.vim dan :source putchar.vim .
Terakhir, jalankan kode skrip VIM di bawah dengan tangan Anda. Kode yang dikompilasi dijalankan pada VM pada skrip VIM. Fungsi SetupVM() membuat instance VM.
:let vm = SetupVM()
:call vm.run()
Jika Anda hanya ingin melihat hasil dari menjalankan skrip VIM, Anda dapat menggunakan :EccRun untuk melewatkan proses di atas.
Sesuai dengan :EccCompile dan :EccRun , Anda dapat menggunakan fungsi eightcc#compile() dan eightcc#run() . Mereka dapat mengambil satu kamus untuk opsi eksekusi.
Lisensi MIT
Hak Cipta (C) Rhysd 2016
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.