Tes yang baik untuk efisiensi terjemahan kompiler adalah kompilasi sendiri: berapa lama kompiler yang diberikan untuk mengkompilasi dirinya sendiri? Untuk C ++ dibutuhkan waktu yang sangat lama (jam?). Sebagai perbandingan, kompiler Pascal / Modula-2 / Oberon akan dikompilasi sendiri dalam waktu kurang dari satu detik pada mesin modern [1].
Go telah terinspirasi oleh bahasa-bahasa ini, tetapi beberapa alasan utama untuk efisiensi ini termasuk:
Sintaks yang didefinisikan dengan jelas yang secara matematis suara, untuk pemindaian dan penguraian efisien
Tipe-aman dan dikompilasi secara statis yang menggunakan kompilasi terpisah dengan dependensi dan tipe memeriksa melintasi batas-batas modul, untuk menghindari pembacaan ulang file header yang tidak perlu dan kompilasi ulang modul lain - yang bertentangan dengan kompilasi independen seperti di C / C ++ di mana tidak ada pemeriksaan modul silang yang dilakukan oleh kompiler (karena itu perlu membaca ulang semua file header itu berulang-ulang, bahkan untuk program "hello world" sederhana satu-baris).
Implementasi compiler yang efisien (mis. Single-pass, recursive-descent top-down parsing) - yang tentu saja sangat terbantu oleh poin 1 dan 2 di atas.
Prinsip-prinsip ini telah dikenal dan diimplementasikan secara penuh pada tahun 1970-an dan 1980-an dalam bahasa seperti Mesa, Ada, Modula-2 / Oberon dan beberapa lainnya, dan baru sekarang (pada tahun 2010) menemukan jalan mereka ke bahasa modern seperti Go (Google) , Swift (Apple), C # (Microsoft) dan beberapa lainnya.
Mari kita berharap bahwa ini akan segera menjadi norma dan bukan pengecualian. Untuk sampai di sana, dua hal perlu terjadi:
Pertama, penyedia platform perangkat lunak seperti Google, Microsoft dan Apple harus memulai dengan mendorong pengembang aplikasi untuk menggunakan metodologi kompilasi yang baru, sambil memungkinkan mereka untuk menggunakan kembali basis kode yang ada. Inilah yang sekarang coba dilakukan Apple dengan bahasa pemrograman Swift, yang dapat hidup berdampingan dengan Objective-C (karena menggunakan lingkungan runtime yang sama).
Kedua, platform perangkat lunak yang mendasari sendiri akhirnya harus ditulis ulang seiring waktu menggunakan prinsip-prinsip ini, sementara secara bersamaan mendesain ulang hirarki modul dalam proses untuk membuatnya kurang monolitik. Ini tentu saja merupakan tugas yang sangat besar dan mungkin mengambil bagian yang lebih baik dari satu dekade (jika mereka cukup berani untuk benar-benar melakukannya - yang saya sama sekali tidak yakin dalam kasus Google).
Bagaimanapun, itu adalah platform yang mendorong adopsi bahasa, dan bukan sebaliknya.
Referensi:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , halaman 6: "Kompilator mengkompilasi sendiri dalam waktu sekitar 3 detik". Kutipan ini untuk papan pengembangan FPGA Xilinx Spartan-3 berbiaya rendah yang beroperasi pada frekuensi clock 25 MHz dan menampilkan 1 MByte memori utama. Dari yang satu ini dapat dengan mudah diekstrapolasi menjadi "kurang dari 1 detik" untuk prosesor modern yang berjalan pada frekuensi clock jauh di atas 1 GHz dan beberapa GBytes memori utama (yaitu beberapa pesanan yang besarnya lebih kuat daripada papan FPGA Xilinx Spartan-3), bahkan ketika memperhitungkan kecepatan I / O. Sudah kembali pada tahun 1990 ketika Oberon dijalankan pada prosesor NS32X32 25MHz dengan memori utama 2-4 MB, kompiler mengkompilasi dirinya sendiri hanya dalam beberapa detik. Gagasan untuk benar-benar menunggubagi kompiler untuk menyelesaikan siklus kompilasi sama sekali tidak dikenal oleh programmer Oberon bahkan saat itu. Untuk program tipikal, selalu diperlukan lebih banyak waktu untuk menghapus jari dari tombol mouse yang memicu perintah kompilasi daripada menunggu kompiler menyelesaikan kompilasi yang baru saja dipicu. Itu benar-benar kepuasan instan, dengan waktu tunggu hampir nol. Dan kualitas kode yang dihasilkan, meskipun tidak selalu setara dengan kompiler terbaik yang tersedia saat itu, sangat bagus untuk sebagian besar tugas dan cukup dapat diterima secara umum.