Jika saya ingat kursus kompiler saya dengan benar, kompiler tipikal memiliki garis besar yang disederhanakan berikut:
- Penganalisa leksikal memindai (atau memanggil beberapa fungsi pemindaian) kode sumber karakter-demi-karakter
- String karakter input diperiksa terhadap kamus leksem untuk validitas
- Jika leksemanya valid, itu kemudian diklasifikasikan sebagai token yang sesuai dengannya
- Parser memvalidasi sintaks kombinasi token; token-to-token .
Apakah secara teori layak untuk membagi kode sumber menjadi empat (atau penyebut apa pun) dan multithread proses pemindaian dan penguraian? Apakah ada kompiler yang menggunakan multithreading?
multithreading
compiler
parsing
8 proton
sumber
sumber
Jawaban:
Proyek perangkat lunak besar biasanya terdiri dari banyak unit kompilasi yang dapat dikompilasi secara relatif independen, sehingga kompilasi sering diparalelkan pada granularitas yang sangat kasar dengan memanggil kompiler beberapa kali secara paralel. Ini terjadi pada tingkat proses OS dan dikoordinasikan oleh sistem build daripada compiler yang tepat. Saya menyadari ini bukan apa yang Anda minta tetapi itu adalah hal yang paling dekat dengan paralelisasi di kebanyakan penyusun.
Mengapa demikian? Nah, banyak pekerjaan yang dilakukan kompiler tidak mudah paralel:
Setelah ini, itu menjadi sedikit lebih mudah. Pengecekan tipe dan optimisasi dan pembuatan kode mungkin, pada prinsipnya, diparalelkan pada fungsi granularity. Saya masih tahu sedikit jika ada kompiler melakukan ini, mungkin karena melakukan tugas apa pun sebesar ini cukup menantang. Anda juga harus mempertimbangkan bahwa sebagian besar proyek perangkat lunak besar mengandung begitu banyak unit kompilasi sehingga pendekatan "run a bunch of compilers in parallel" sepenuhnya memadai untuk membuat semua core Anda tetap sibuk (dan dalam beberapa kasus, bahkan seluruh server farm). Plus, dalam tugas-tugas kompilasi besar disk I / O dapat menjadi hambatan sebanyak pekerjaan kompilasi yang sebenarnya.
Semua yang dikatakan, saya tahu kompiler yang memparalelkan pekerjaan pembuatan kode dan optimasi. Kompiler Rust dapat membagi pekerjaan back-end (LLVM, yang sebenarnya mencakup optimasi kode yang secara tradisional dianggap "menengah-akhir") di antara beberapa utas. Ini disebut "unit kode-gen". Berbeda dengan kemungkinan paralelisasi lain yang dibahas di atas, ini ekonomis karena:
sumber
Kompilasi adalah masalah "paralel yang memalukan".
Tidak ada yang peduli tentang waktu untuk mengkompilasi satu file. Orang-orang peduli tentang waktu mengkompilasi 1000 file. Dan untuk 1000 file, setiap inti prosesor dapat dengan senang hati mengkompilasi satu file pada satu waktu, membuat semua core benar-benar sibuk.
Kiat: "make" menggunakan banyak inti jika Anda memberinya opsi baris perintah yang benar. Tanpa itu akan mengkompilasi satu file setelah yang lain pada sistem 16 inti. Yang berarti Anda dapat membuatnya kompilasi 16 kali lebih cepat dengan perubahan satu baris ke opsi build Anda.
sumber