Tujuan dari proyek ini adalah untuk mengimplementasikan pipa dekompilasi yang terdiri dari komponen independen yang berinteraksi melalui antarmuka yang jelas, seperti yang dijelaskan lebih lanjut dalam dokumen desain proyek.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...Lihat contoh penggunaan pada contoh/demo, dan komentar ini untuk perincian lebih lanjut.
Dari perspektif tingkat tinggi, komponen pipa dekompilasi dikelompokkan secara konseptual menjadi tiga modul. Pertama, front-end menerjemahkan bahasa sumber (mis. Perakitan x86) ke dalam llvm IR; representasi menengah tingkat rendah platform-independen. Kedua, struktur akhir llvm IR dengan mengidentifikasi primitif aliran kontrol tingkat tinggi (misalnya loop pra-tes, kondisi 2-arah). Terakhir, back-end menerjemahkan LLVM IR terstruktur ke dalam bahasa pemrograman target tingkat tinggi (misalnya GO).
Poster berikut ini merangkum kemampuan saat ini dari pipa dekompilasi, menggunakan komposisi komponen independen untuk menerjemahkan llvm IR untuk pergi.
Terjemahkan Kode Mesin (misalnya perakitan x86) ke llvm ir.
Komponen front-end pihak ketiga.
Lakukan analisis aliran kontrol pada LLVM IR untuk mengidentifikasi primitif aliran kontrol tingkat tinggi (misalnya loop pra-tes).
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
Alat pembuatan grafik aliran kontrol.
Hasilkan grafik aliran kontrol dari perakitan LLVM IR ( *.ll -> *.dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
Alat Pemulihan Aliran Kontrol.
Pulihkan Primitif Aliran Kontrol dari Grafik Aliran Kontrol ( *.dot -> *.json).
Terjemahkan LLVM IR terstruktur ke bahasa target tingkat tinggi (misalnya GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
Alat pembuatan kode GO.
Dekompilasi perakitan IR llvm untuk menjadi kode sumber ( *.ll -> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
Pergi alat pasca-pemrosesan.
Post -Process Go Source Code untuk membuatnya lebih idiomatik ( *.go -> *.go).
Fokus utama Versi 0.2: Kecepatan Kompilasi Selebar Proyek .
Mengembangkan komponen dekompilasi harus menyenangkan.
Tampaknya ada korelasi terbalik antara tergantung pada perpustakaan C ++ yang besar dan bersenang -senang mengembangkan komponen dekompilasi.
Versi 0.2 dari pipa dekompilasi berusaha untuk menyelesaikan masalah ini dengan memanfaatkan perpustakaan LLVM IR yang ditulis dalam Pure Go. Sebelum rilis ini, kompilasi di seluruh proyek bisa memakan waktu beberapa jam untuk diselesaikan. Sekarang, mereka selesai dalam waktu kurang dari 1 menit - batas keras yang ditetapkan untuk semua rilis di masa depan.
Rilis awal.
Fokus utama versi 0.1: dekompilasi komposisi .
Dekompiler harus dapat disusun dan open source.
Pipa dekompilasi harus terdiri dari komponen individu, masing-masing dengan satu tujuan dan input dan output yang terdefinisi dengan baik.
Versi 0.1 dari proyek Decomp mengeksplorasi kelayakan menyusun pipa dekompilasi dari komponen independen, dan potensi mengekspos komponen tersebut ke pengguna akhir.
Untuk latar belakang lebih lanjut, lihat dekompilasi komposisi menggunakan dokumen desain LLVM IR.
Fokus utama versi 0.3: Pengangkatan biner tipe-sadar .
Dekompiler mengandalkan pengangkatan biner berkualitas tinggi.
Kualitas output IR dari front-end angkat biner pada dasarnya menentukan kualitas output dari seluruh pipa dekompilasi.
Versi 0.3 bertujuan untuk meningkatkan kualitas output LLVM IR dengan menerapkan front-end angkat biner tipe yang sadar.
Fokus utama versi 0.4: Analisis Aliran Kontrol .
Dekompiler harus memulihkan primitif aliran kontrol tingkat tinggi.
Salah satu perbedaan utama antara perakitan tingkat rendah dan kode sumber tingkat tinggi adalah penggunaan primitif aliran kontrol tingkat tinggi; misalnya 1 arah, 2-arah dan n-way conditional ( if , if-else dan switch ), pra dan pasca-tes loop ( while dan do-while ).
Versi 0.4 berupaya memulihkan primitif aliran kontrol tingkat tinggi menggunakan algoritma analisis aliran kontrol yang kuat.
Fokus utama versi 0.5: Toleransi kesalahan .
Dekompilasi harus kuat.
Komponen dekompilasi harus merespons dengan baik terhadap keadaan yang tidak terduga dan analisis yang tidak lengkap.
Versi 0.5 berfokus pada stabilitas, dan berupaya untuk stres menguji pipa dekompilasi menggunakan perangkat lunak semi-real World (lihat seri Challenge Issue).
Fokus utama versi 0.6: Analisis Aliran Data .
Fokus utama versi 0.7: Analisis Jenis .