Pertanyaan ini terinspirasi oleh perdebatan dalam komentar tentang pertanyaan Stack Overflow ini . The Google Closure Compiler dokumentasi menyatakan berikut (penekanan ditambahkan):
Closure Compiler adalah alat untuk membuat unduhan JavaScript dan berjalan lebih cepat. Ini adalah kompiler sejati untuk JavaScript. Alih-alih mengkompilasi dari bahasa sumber ke kode mesin, ini mengkompilasi dari JavaScript ke JavaScript yang lebih baik.
Namun, Wikipedia memberikan definisi "kompiler" sebagai berikut:
Kompiler adalah program komputer (atau serangkaian program) yang mengubah kode sumber yang ditulis dalam bahasa pemrograman (bahasa sumber) menjadi bahasa komputer lain ... Penulis bahasa biasanya merupakan program yang menerjemahkan bentuk ekspresi tanpa perubahan dari bahasa.
Berdasarkan itu, saya akan mengatakan bahwa Google Closure bukan kompiler. Tetapi fakta bahwa Google secara eksplisit menyatakan bahwa itu sebenarnya "kompiler sejati" membuat saya bertanya-tanya apakah ada lebih dari itu. Apakah Google Closure benar-benar kompiler JavaScript?
sumber
Jawaban:
Closure Compiler adalah minifier , sebuah Optimizer dan validator all-in-one. Semacam itu menempatkannya dalam kategorinya sendiri, karena Anda benar bahwa seorang kompiler setidaknya harus mengambil sesuatu yang tidak akan berjalan dalam bentuk saat ini dan mengubahnya menjadi sesuatu yang akan (mengambil TypeScript untuk contoh berbasis ECMAScript).
Tetapi apakah Anda menyalahkan Google karena merentangkan terminologi? Apa lagi yang akan mereka sebut itu? Google Minifier? Tidak, ini lebih dari itu, dan ada ratusan di luar sana. Google Optimizer? Jauh lebih dari itu. Google Validator? Tidak, itu lebih dari itu juga.
Jadi pilihannya adalah
Ia melakukan semua yang Anda harapkan dilakukan oleh kompiler, hanya dengan perbedaan semantik. Dan, pada akhirnya, semua kata ditentukan oleh penggunaannya, sampai batas tertentu. Jadi, jika Google dapat meyakinkan orang untuk menyebut ini sebagai kompiler, definisi kompiler akan sedikit berubah. Tentu saja tidak dengan cara apa pun yang akan menyebabkan masalah.
Atau, untuk kembali ke contoh sebelumnya, dapatkah Anda menemukan sesuatu yang signifikan tentang TypeScript yang memungkinkannya disebut "kompiler sejati", sedangkan Kompiler Penutupan Google harus dibatasi untuk "hampir kompiler"?
sumber
Minoptival
. Kedengarannya seperti dinosaurus. Semua orang suka dinosaurus, kan?Ya ... tapi itu mengasumsikan bahwa Wikipedia adalah otoritatif dalam hal ini.
Dan sebagai lawan dari definisi Wikipedia, pertimbangkan beberapa definisi kamus (dari http://www.thefreedictionary.com/compiler ):
Memang definisi-definisi ini agak kuno, tetapi menggambarkan bahwa tidak ada "satu makna yang sebenarnya" ... dan memang arti istilah-istilah seperti "kompiler" berubah dari waktu ke waktu. (Dan, IMO itu baik-baik saja, karena kita tidak benar-benar membutuhkan definisi yang tepat untuk kasus ini.)
Memperdebatkan apakah kompiler Penutupan adalah "kompiler benar" atau tidak (IMO) bukan kegiatan yang bermanfaat. Akan lebih bermanfaat untuk memahami apa yang dimaksud orang Google dengan "kompiler sejati" ... dalam konteks itu.
sumber
Saya pikir alasan mengapa itu bisa disebut "kompiler nyata" adalah karena ia membangun AST lengkap (pohon semantik abstrak) dari program Anda, dan menggunakannya untuk menghasilkan teks baru.
Fakta bahwa kedua teks asli dan teks yang dihasilkan adalah JavaScript yang benar adalah kebetulan belaka.
Ini penting karena ada banyak alat yang hanya melakukan manipulasi teks dari kode (minifiers, prettifiers, dll) tetapi tidak melakukan penanganan AST, apalagi pembuatan ulang kode. Sekalipun alat-alat itu semakin kuat, mereka bukan jenis perangkat lunak yang sama, dan batasannya berbeda.
sumber
Ini semantik menurut saya. Dalam pengertian tradisional, ini bukan kompiler. Namun, di tautan Wikipedia yang sama, katanya
Penutupan melakukan beberapa atau semua operasi tersebut.
Sedikit lebih jauh di artikel Wikipedia
Yang sedang berkata, dugaan saya adalah bahwa lebih mudah untuk menyebutnya " Kompresor Penutupan " daripada "Pengoptimal Penutupan" karena sebenarnya itu hanya mengoptimalkan JavaScript untuk browser, tidak perlu menerjemahkannya ke bahasa lain atau bytecode.
Closure Compiler sebagai kata benda adalah non-sequitur .
sumber
Pertama, mari kita keluarkan dari cara kompiler sumber-ke-sumber ada. Anda tidak dapat mengatakan sesuatu bukanlah kompiler karena hasil akhirnya bukan kode level yang lebih rendah.
Meskipun benar bahwa Closure Compiler menghasilkan AST dan memiliki frase pembuatan kode, banyak Javascript minimizer di luar sana sudah melakukan itu dan saya mungkin tidak akan memanggil mereka juga kompiler.
Apa yang benar-benar membedakan Closure Compiler adalah aplikasi dari banyak teknik kompiler terkenal dalam deteksi kesalahan dan optimisasi. Berikut ini beberapa contohnya:
Jenis sistem:
Closure Compiler mendefinisikan sistem tipe beranotasi. Ini menggunakan teknik inferensi tipe yang digunakan banyak kompiler untuk memeriksa kesalahan program Anda.
Optimalisasi antar prosedur
Closure Compiler membuat grafik panggilan untuk mengganti nama dan menghapus kode mati di seluruh level program.
Optimalisasi intraprosedural
Closure Compiler mengoptimalkan Javascript dengan menerapkan Analisis Aliran Kontrol yang berbeda serta analisis Aliran Data. Teknik kompiler klasik seperti: Inlining, Alokasi Daftar, Analisis Variabel Langsung .. dan masih banyak lagi yang digunakan untuk memeras byte terakhir dari output Javascript.
Sistem Modul
Bagian yang kurang dikenal dari Closure Compiler yang dapat digunakan untuk membagi kode Anda menjadi unduhan terpisah untuk waktu mulai yang lebih cepat. Ini menggunakan banyak algoritma grafik juga. Sesuatu juga sangat umum dalam kompiler "tradisional".
Semua kompiler dan teknik analisis statis inilah yang membedakan Closure Compiler dari Javascript minimizer lainnya. Mengambil dari fakta bahwa bahasa input dan output yang ditargetkan adalah sama, saya tidak melihat mengapa itu tidak diklasifikasikan sebagai "kompiler sejati".
sumber