Apakah Google Closure kompiler yang benar?

19

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?

James Allardice
sumber
2
Saya yakin JS itu output adalah bagian yang tepat dari semua JS hukum; dalam hal ini, bahasa keluarannya adalah bahasa "lain".
AakashM

Jawaban:

23

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

  • Sebut saja Google Closure Foogle dan perkenalkan kata baru yang sama sekali tidak berarti ke dalam kamus.
  • Sebut saja Google Closure Minoptivalidator, yang maksudnya lebih jelas tetapi lebih sulit diingat.
  • Sebut saja Google Closure Compiler, yang cukup dekat dengan kebenaran.

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"?

pdr
sumber
Inti dari pertanyaan itu hanya untuk benar-benar melihat apa yang orang lihat sebagai "kompiler". Seperti yang dinyatakan oleh 0A0D itu hanya semantik, tapi saya mendapati diri saya bertanya-tanya mengapa Google merasa perlu mengklarifikasi bahwa itu adalah "kompiler sejati". +1 untuk "Minoptivalidator"!
James Allardice
@JamesAllardice: Sekali lagi, karena jika Anda dapat meyakinkan orang bahwa itu adalah kompiler maka definisi kompiler membentang untuk memasukkannya. Dan itu benar-benar adil bahwa seharusnya, dalam hal ini. Jika Anda mendefinisikan kata baru yang memisahkannya dari kompiler oleh garis sematic, produk Anda akan dikategorikan sebagai "hampir, tetapi tidak cukup."
pdr
1
Saya tidak tahu, saya agak menyukai "Google Foogle" :-)
GrandmasterB
9
Saya memilih Minoptival. Kedengarannya seperti dinosaurus. Semua orang suka dinosaurus, kan?
Izkata
2
@Izkata: Jika ada satu hal yang diajarkan sejarah evolusi kepada kita, Javascript tidak akan terkandung. Javascript bebas, ia berkembang ke wilayah baru, dan menabrak penghalang dengan menyakitkan, bahkan mungkin berbahaya.
pdr
9

Berdasarkan itu, saya akan mengatakan bahwa Google Closure bukan kompiler.

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 ):

2) (Ilmu Komputer) - Program yang menerjemahkan program lain yang ditulis dalam bahasa tingkat tinggi ke dalam bahasa mesin sehingga dapat dieksekusi.

2) (Elektronik & Ilmu Komputer / Ilmu Komputer) sebuah program komputer dimana bahasa pemrograman tingkat tinggi, seperti COBOL atau FORTRAN, diubah menjadi bahasa mesin yang dapat ditindaklanjuti oleh komputer.

Program komputer yang terkait dengan bahasa pemrograman tertentu yang mengubah instruksi yang ditulis dalam bahasa tersebut menjadi kode mesin yang nantinya dapat dieksekusi langsung oleh komputer.

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.

Stephen C
sumber
2
+1, Ironisnya, JS adalah 'bahasa mesin' untuk web dan 'bahasa pemrograman tingkat tinggi'.
K.Steff
3
+1, dan plus yang lain untuk 'mengasumsikan bahwa Wikipedia adalah otoritatif dalam hal ini'. Terlalu banyak orang yang secara membabi buta menerima apa pun yang terjadi untuk ditulis di sana.
Marjan Venema
6

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.

Javier
sumber
1
Terima kasih, ini jawaban yang menarik. Saya pikir penjelasan Anda mungkin menawarkan definisi yang lebih baik tentang "kompiler" daripada Wikipedia dan berbagai kamus lain yang telah dikutip.
James Allardice
Yah, saya suka jawaban ini dan memilihnya di beberapa titik, tetapi saya akan mencatat bahwa sangat mungkin untuk mengkompilasi (dalam pengertian bahasa-tingkat-ke-mesin-bahasa-tradisional yang tinggi) tanpa pernah membangun AST. Lihat Let's Build a Compiler misalnya. Sekarang memang benar bahwa kompiler dari tutorial Crenshaw cukup kasar, tapi saya tidak percaya ada yang menuduhnya tidak menjadi kompiler.
dmckee
Saya belum membaca referensi itu, tetapi saya akan setuju bahwa AST eksplisit tidak sepenuhnya diperlukan untuk kompilasi. Namun, dalam banyak kasus ada struktur yang setara, baik eksplisit dalam data, atau implisit dalam eksekusi (mungkin tumpukan panggilan (atau evolusinya dalam waktu) mencerminkan analisis sintaksis). Poin utama saya adalah bahwa kompilasi bukan manipulasi teks, tetapi menghasilkan kode dari analisis beberapa kode sumber.
Javier
4

Ini semantik menurut saya. Dalam pengertian tradisional, ini bukan kompiler. Namun, di tautan Wikipedia yang sama, katanya

Sebuah kompiler kemungkinan akan melakukan banyak atau semua operasi berikut: analisis leksikal, preprocessing, parsing, analisis semantik (terjemahan diarahkan-Sintaks), pembuatan kode, dan optimasi kode.

Penutupan melakukan beberapa atau semua operasi tersebut.

Sedikit lebih jauh di artikel Wikipedia

Namun, dalam praktiknya jarang ada sesuatu tentang bahasa yang mengharuskannya dikompilasi secara eksklusif atau ditafsirkan secara eksklusif, meskipun mungkin untuk merancang bahasa yang mengandalkan interpretasi ulang pada waktu berjalan.

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 .

Brian
sumber
Itu hanya semantik, Anda benar. Inti dari pertanyaan itu adalah hanya untuk melihat apa yang dilihat orang sebagai "kompiler". Saya masih tidak berpikir Closure Compiler adalah "true compiler", tetapi ia melakukan banyak tindakan serupa.
James Allardice
3

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".

Alan
sumber