Sejauh pemahaman saya, kompiler dimaksudkan untuk pengembang mengkompilasi kode mereka ke file executable (kode mesin). Kompiler tidak meluas ke mesin klien atau sistem pengguna akhir.
Sebaliknya, pengembang hanya menggunakan kompiler untuk mengubah kode mereka menjadi kode mesin, yang kemudian diangkut ke mesin lain untuk digunakan sebagai aplikasi.
Apakah kompiler memiliki fungsi di luar proses ini? Jika demikian, kapan mereka digunakan?
Jawaban:
Iya dan tidak. Ya, skenario klasik adalah pengembang menggunakan kompiler untuk menghasilkan kode mesin dari kode sumber, dan kode mesin kemudian didistribusikan ke pengguna.
Ada yang beberapa pengecualian untuk ini meskipun. Pertama, banyak proyek open source didistribusikan terutama (atau bahkan secara eksklusif) dalam bentuk kode sumber, dan mengharapkan pengguna akhir untuk menginstalnya dengan mengetikkan beberapa perintah seperti
make
dan kemudianmake intall
. Ini akan memanggil kompiler, tautan, dll., Untuk menghasilkan kode mesin dari kode sumber untuk komputer pengguna tersebut. Dalam kasus ini, bagaimanapun, proses membangun dan menginstal adalah (setidaknya dimaksudkan untuk menjadi) otomatis ke titik bahwa pengguna jarang membutuhkan banyak pengetahuan tentang hal itu di luar fakta bahwa jika mereka tidak pernah menginstal paket source-only code sebelumnya , manajer paket mereka biasanya akan mencantumkan beberapa paket "pengembangan" sebagai prasyarat untuk menginstal aplikasi yang benar-benar mereka pedulikan (meskipun beberapa masih melihat ini sebagai tidak ramah untuk pengguna akhir).Pengecualian lain (yang telah disinggung, tetapi tidak dijelaskan dengan sangat baik dalam jawaban lain yang saya lihat) adalah kompiler just-in-time (JIT). Beberapa contoh kompiler JIT yang jelas adalah Microsoft Common Language Runtime (CLR) dan Java Virtual Machine (JVM). Dalam kasus ini, biasanya ada dua kompiler yang sepenuhnya terpisah yang terlibat dalam menerjemahkan kode sumber ke dalam kode mesin. Satu digunakan oleh pengembang. Namun, daripada menghasilkan kode mesin secara langsung, ini menghasilkan kode byte independen mesin. CLR / JVM kemudian menyertakan kompiler kedua , sepenuhnya terpisah dari yang pertama, yang mengubah kode byte tersebut ke kode mesin untuk komputer target.
Saya harus menambahkan bahwa kompiler kedua tidak sepenuhnya diperlukan. Versi awal JVM (misalnya) hanya menafsirkan kode byte alih-alih mengkompilasinya. Ini sering membawa penalti kinerja yang cukup serius, jadi JVM paling baru yang dimaksudkan untuk penggunaan produksi termasuk kompiler JIT.
sumber
Ya, kompiler terutama digunakan oleh pengembang, dengan beberapa pengecualian penting. Pengguna akhir terkadang menggunakan kompiler untuk mengkompilasi dan menginstal perangkat lunak open source terbaru, bahkan jika mereka tidak membuat perubahan pada kode. Juga, beberapa bahasa pemrograman tidak memiliki kompiler. Mereka menggunakan penerjemah sebagai pengganti "kompilasi" dengan cepat. Dalam hal ini, pengguna akhir harus memiliki juru bahasa yang diinstal pada mesin mereka.
sumber
Iya
Kompiler didefinisikan sebagai program yang menerjemahkan kode dari satu bahasa ke bahasa lain (lihat Wikipedia ). Penggunaan kompiler yang paling umum adalah menerjemahkan bahasa sumber ke dalam kode mesin, tetapi ini mendefinisikan kata "compiler".
Sebagai contoh, Python menghasilkan byte-code ketika mengimpor modul, dan dengan demikian sesuai dengan definisi kompiler (karena mengkonversi dari bahasa sumber, Python, ke bahasa target, kode-byte Python).
Contoh lain adalah mesin JavaScript V8. Itu mengubah JavaScript menjadi kode mesin x86 , dan dengan demikian cocok dengan definisi kompiler juga. V8 tidak hanya sesuai dengan definisi kompiler, tetapi juga termasuk dalam Chrome dan sangat banyak digunakan pada mesin klien.
sumber
Satu kasus akan untuk aplikasi yang secara dinamis menghasilkan kode saat runtime, dan kemudian menjalankan kode yang dihasilkan. Kode ini perlu dikompilasi pada saat runtime.
Sunting: Ada pengecualian lain, tetapi mereka sudah disebutkan dalam jawaban lain.
sumber
Saya akan mengatakan "kompiler dimaksudkan utama untuk pengembang ...". Tapi saya telah melihat contoh di mana program menghasilkan kode bahasa pemrograman baru on-the-fly dan karena itu perlu kompiler untuk diinstal pada mesin pengguna akhir. Itu tidak berarti pengguna akhir harus bekerja dengan kompiler dengan sendirinya.
Kemungkinan alasan untuk desain program ini:
kinerja: pikirkan aplikasi berbasis aturan di mana aturan disimpan di semacam penyimpanan data pengguna akhir dan Anda memiliki beberapa data massal yang akan diproses oleh aturan tersebut. Alih-alih menafsirkan aturan berulang kali, program menghasilkan kode pemrosesan terlebih dahulu, kompilasi dan menjalankannya terhadap data yang akan diproses
pikirkan sebuah program di mana pengguna akhir dapat menambahkan semacam rumus matematika dan pengembang program tidak ingin mengimplementasikan parser / juru bahasa sendiri untuk ini. Sebagai gantinya, program mengambil rumus ini, membuat beberapa tambahan untuk mengubahnya menjadi potongan kode program yang valid, biarkan kompilator mengkompilasinya dan menjalankannya setelah itu.
sumber
Benar - kompiler mengkompilasi kode sumber ke dalam bentuk yang dapat dieksekusi, yang kemudian ditautkan ke file biner yang dapat dieksekusi oleh tautan. Kode sumber juga dapat dieksekusi langsung oleh penerjemah seperti salah satu dari banyak shell baris perintah (C-shell, bash, zsh, dll.), Awk, sed, dan sebagainya.
Mungkin sulit untuk menarik garis yang jelas antara "pengembang" dan "pengguna akhir" kecuali Anda membatasi diskusi Anda untuk produk tertentu. Pengembang adalah semua "pengguna akhir" dari alat yang mereka gunakan, dan "pengguna akhir" mungkin memiliki alat pengembangan seperti kompiler dan interpreter yang diinstal pada mesin mereka.
sumber
Administrator juga mungkin perlu menggunakan bahasa pemrograman dalam menulis skrip untuk melakukan berbagai tugas otomatis. Misalnya, memiliki skrip yang menghapus file log lama dari server setelah 90 hari untuk membebaskan ruang disk. Bahasa yang digunakan untuk menulis skrip harus ditafsirkan atau dikompilasi sehingga dapat dijalankan pada sistem.
sumber
Beberapa program adalah meta-program : saat berjalan, mereka mungkin menghasilkan beberapa program lain (atau beberapa kode sumber) dan mengkompilasinya kemudian menjalankannya entah bagaimana. Baca juga tentang pemrograman multi-tahap .
Jadi untuk menggunakan program semacam ini, kompiler akan diperlukan, bahkan jika pengguna tidak tahu cara memprogram dirinya sendiri (karena komputer akan menghasilkan beberapa kode yang perlu dikompilasi).
Sebagai contoh, lihat MELT (yang menghasilkan kode C ++ untuk memperluas GCC ) atau sistem kecerdasan buatan J.Pitrat CAIA (yang menghasilkan kode C - terutama kodenya sendiri - untuk menyelesaikan masalah kombinatorial).
Juga, beberapa bahasa dan beberapa implementasi hampir membutuhkan kompiler untuk hadir di mana-mana (dalam setiap program yang dikodekan dalam bahasa & implementasi itu). Pertama, beberapa browser web berisi mesin Javascript JIT (seperti V8 ). Juga, sebagian besar implementasi Lisp Umum - misalnya SBCL - berisi kompiler (bahkan berguna untuk menjalankan aplikasi, yang mungkin menghasilkan dan mengevaluasi ekspresi). Baca juga tentang bahasa homoikonik dan program Qine .
sumber