Apakah kompiler digunakan di luar pengembangan?

14

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?

Pankaj Upadhyay
sumber
21
Ya, kompiler mengkompilasi kode.
Tom Squires
@ Tom: Saya membaca di suatu tempat bahwa kompiler C diinstal pada berbagai mesin, termasuk konsol game. Apakah ini berarti kita menulis kode dalam C, lalu yang dikirimkan ke perangkat ini, di mana dikompilasi oleh kompiler dan kemudian dieksekusi oleh interpreter?
Pankaj Upadhyay
3
@Pankaj Upadhyay: Ada kemungkinan bahwa kode dapat dikirim ke mesin dan kemudian dikompilasi oleh proses internal. Tidak mungkin pengguna perangkat akan pernah melihat ini terjadi atau mengetahuinya. Mungkin dilakukan jika bagian kode perlu dikompilasi untuk perangkat keras tertentu dan solusi yang menguji perangkat keras saat runtime terlalu lambat, yang mengarah pada kebutuhan untuk mendistribusikan kode dan mengkompilasi selama instalasi. Mungkin ...
FrustratedWithFormsDesigner
3
@Pankaj Tidak ada konsol game yang dikirim dengan kompiler, tetapi beberapa konsol dapat diinstal pada mereka. Sony menyediakan versi Linux dan GCC yang dapat diinstal pada PS2 misalnya. Orang lain telah meretas / meretas cara mereka untuk mendapatkan OS dan perangkat lunak lain ke konsol.
IronMensan
4
@Stargazer: Maksud Anda: "Tidak, kompiler menerjemahkan dari bahasa sumber ke bahasa target"? Menghilangkan koma menjadikan kalimat Anda berlawanan dengan makna yang Anda maksudkan.
Daniel Pryden

Jawaban:

19

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

Jerry Coffin
sumber
24

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.

Karl Bielefeldt
sumber
4
Jika kita membatasi definisi "kompiler" berarti program yang menghasilkan file yang dapat dieksekusi, maka ini akan menjadi jawaban yang bagus. Namun, itu hanyalah sebagian dari definisi sebenarnya dari "kompiler"
riwalk
16
@ Jan Soltis: Saya tidak setuju. Saya telah mengkompilasi kernel Linux dari sumber: apakah itu berarti saya adalah pengembang kernel Linux ? Saya tidak pernah memodifikasi kode kernel Linux atau mengirim tambalan - saya akan mengatakan itu berarti saya bukan pengembang kernel. Plus, selama beberapa tahun saya menggunakan Gentoo sebagai sistem operasi utama saya, saya mengkompilasi setiap perangkat lunak di mesin. Namun, sebagian besar dari mereka dikompilasi secara otomatis oleh sistem manajemen paket Portage. Saya berpendapat bahwa dalam hal ini saya bertindak sebagai pengguna akhir tetapi bukan sebagai pengembang .
Daniel Pryden
8
@ Jan Soltis: Saya tahu itu pendapat Anda. Dengan hormat saya tidak setuju. Saya memberikan argumen balasan untuk mendukung posisi saya, sementara Anda terus membuat pernyataan yang tidak didukung. Anda tampaknya berpikir bahwa ada garis tajam antara "pengembang" dan "pengguna akhir" yang saya tidak percaya ada.
Daniel Pryden
6
Mengunduh sumber dan menjalankan "make install" bukanlah menjadi pengembang. Ini jelas merupakan operasi pengguna akhir.
Kristopher Johnson
3
@ Jan: Saya bisa menerima bahwa menggunakan distro seperti Gentoo yang mengkompilasi paket membuat Anda setidaknya pengguna yang kuat , tapi itu masih jelas tipe pengguna. Mengkompilasi kode orang lain, tanpa mengubahnya, menambahkannya, atau bahkan membacanya, tidak menjadikan Anda seorang pengembang.
Carson63000
10

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.

riwalk
sumber
4

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.

Morgan Herlocker
sumber
1 cukup katakan JIT
agas
1
Mesin V8 di Chrome bukan pengecualian aneh.
riwalk
Diperbarui untuk memperjelas. Saya menyadari ada pengecualian lain.
Morgan Herlocker
3

kompiler dimaksudkan hanya untuk pengembang untuk mengkompilasi kode bahasa pemrograman mereka ke file yang dapat dieksekusi (kode machin)

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.

Doc Brown
sumber
hmm .... Itu tidak berarti pengguna akhir harus bekerja dengan kompiler dengan sendirinya . Cukup banyak menjelaskan dan mengklarifikasi.
Pankaj Upadhyay
2

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.

Caleb
sumber
2
Ok, saya akan ke -1 yang ini, karena ada banyak kesalahpahaman di sini tentang kompiler. Compiler menerjemahkan kode dari bahasa sumber ke bahasa target. Mengatakan mereka menghasilkan kode mesin sama dengan mengatakan bahwa kendaraan memiliki 4 roda (ya, sebagian besar kendaraan memiliki 4 roda, tetapi sepeda motor juga merupakan kendaraan. Dengan cara yang sama, kebanyakan penyusun menghasilkan kode mesin, tetapi konverter C # -> VB adalah kompiler juga)
riwalk
1
@ Stargazer712, saya yakinkan Anda bahwa tidak ada kesalahpahaman - Saya tahu betul apa yang dilakukan kompiler, terima kasih. Tetapi jika seseorang yang tidak tahu bertanya kepada saya apa itu mobil, saya mungkin akan mengatakan bahwa mobil memiliki empat roda meskipun beberapa orang tidak . Definisi yang rumit sering kali membingungkan lebih daripada menjelaskan kepada seseorang yang mencoba memahami konsep. "Kompiler" juga bisa menjadi deskripsi pekerjaan, tetapi menyebutkan itu tidak akan membantu di sini.
Caleb
1

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.

JB King
sumber
1

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 .

Basile Starynkevitch
sumber