Setiap baris kode yang Anda tulis perlu diterjemahkan ke dalam bahasa yang dapat dimengerti oleh komputer Anda. Tapi bagaimana itu bisa terjadi?
Kode sumber bahasa pemrograman tingkat tinggi seperti PHP, Swift, dan JavaScript terlihat seperti bahasa alami. Anda akan melihat kata-kata bahasa Inggris dalam kode tersebut dan Anda akan dapat memahami beberapa fungsinya, bahkan jika Anda tidak mengetahui bahasanya sendiri. Tetapi kode sumber tersebut harus dalam format yang dapat dibaca mesin agar komputer dapat menjalankan program final.
Untuk melakukannya, mesin memerlukan perantara untuk menerjemahkan kode Anda menjadi sesuatu yang dapat diprosesnya. Perantara ini bisa berupa interpreter, compiler, atau assembler. Mereka semua melakukan hal serupa: mereka menerjemahkan kode sumber dari bentuk yang dapat dibaca manusia menjadi bentuk yang dapat dibaca mesin. Tetapi cara mereka melakukannya sangat berbeda.
Apa itu Penerjemah?
Seorang juru bahasa membaca setiap baris kode, satu per satu, dan segera mengeksekusinya saat run-time. Seorang juru bahasa tidak menunggu seluruh kode sumber diubah menjadi kode mesin sebelum mengirimkannya ke CPU. Alih-alih, itu mengubah setiap baris kode menjadi kode byte khusus juru bahasa dan mengeksekusi setiap instruksi saat diterjemahkan. Sementara tugas eksekusi bergantung pada juru bahasa secara langsung, CPU menjalankan juru bahasa itu sendiri.
Karena mem-parsing dan menjalankan setiap baris pada satu waktu, prosesnya seringkali relatif lebih lambat. Dengan mengingat hal itu, kesalahan dalam bahasa pemrograman yang ditafsirkan mudah dikenali karena memberikan umpan balik instan untuk setiap baris kode.
Namun, kemunduran dari perilaku ini adalah kesalahan run-time membuat program crash selama eksekusi, mengakibatkan pengalaman pengguna yang buruk, terutama jika proyek Anda tidak memiliki pengujian yang memadai.
Apa itu Kompiler?
Kompiler membaca kode sumber Anda dan menerjemahkannya menjadi executable yang dapat dibaca mesin. Tidak seperti juru bahasa, ia membaca seluruh kode sumber sekaligus, menghasilkan kode mesin untuk diproses nanti oleh CPU. Karena kompiler melakukan tugas ini hanya sekali, program yang dikompilasi biasanya lebih cepat dan lebih hemat memori.
Kompiler tidak memperhitungkan kesalahan run-time. Sebaliknya, itu akan menandai kesalahan tertentu pada waktu kompilasi, yang biasanya lebih baik. Jenis kesalahan ini muncul selama pengembangan, bukan saat program mulai berjalan. Namun, perlu diingat bahwa run-time error masih mungkin terjadi, bahkan dalam program yang dikompilasi.
Perbedaan Utama
Penerjemah dan kompiler sama-sama umum, jadi penting untuk mengetahui perbedaan utama di antara keduanya.
Eksekusi Kode: Pemrosesan Input dan Output
Seorang juru bahasa hanya dapat mengumpulkan, menerjemahkan, dan mengeksekusi setiap input per baris. Ini menjalankan setiap baris kode sumber secara berurutan, dan hasil akhir bergantung pada apa yang dihasilkan setiap baris selama eksekusi.
Kompiler menggabungkan seluruh kode sumber dan menerjemahkannya sekali saja. Jadi dibutuhkan seluruh kode sumber Anda sebagai input, yang dikonversi dan dikirim ke CPU untuk mendapatkan output.
Debugging dan Lacak Kesalahan
Untuk kode yang ditafsirkan, kesalahan lebih dapat dilacak karena juru bahasa dapat melaporkannya dengan merujuk langsung ke sumber aslinya. Namun, begitu ada kesalahan kapan saja selama eksekusi, juru bahasa berhenti. Jadi kesalahan debugging bisa sedikit menantang karena Anda perlu mereproduksinya saat run-time. Ini bahkan bisa menjadi lebih buruk jika run-time logging tidak memadai.
Di sisi lain, kesalahan run-time dalam bahasa yang dikompilasi mungkin lebih sulit dilacak karena tidak ada juru bahasa untuk melaporkannya. Tetapi kesalahan yang Anda temukan pada waktu kompilasi biasanya lebih mudah ditangani karena kompiler akan mengidentifikasinya secara konsisten.
Sebagian besar bahasa yang dikompilasi juga memiliki mekanisme untuk mendeteksi variabel yang tidak digunakan, ketidakcocokan tipe, dan sintaks yang salah, mencegah kesalahan semacam ini sejak dini.
Performa dan Kecepatan
Seperti yang diharapkan, kompiler membantu mesin menjalankan kode program lebih cepat karena CPU hanya memproses kode satu kali. Ini tidak berlaku untuk juru bahasa, yang menerjemahkan setiap baris saat run-time.
Meskipun ada prinsip pemrograman yang dapat Anda gunakan untuk mengoptimalkan kode yang ditafsirkan, juru bahasa masih akan menghabiskan waktu untuk menguraikan dan mengeksekusi setiap baris sebelum berpindah ke baris berikutnya. Namun, pembantu kompiler tersedia untuk membuat bahasa yang ditafsirkan lebih cepat.
Misalnya, browser Chrome memproses JavaScript menggunakan mesin V8; ini berjalan pada kompiler Just-In-Time (JIT). Modul Pyinstaller adalah pembantu lain yang menggabungkan dan mengkompilasi skrip Python menjadi paket yang dapat dieksekusi.
Meskipun pembantu ini berguna untuk menggabungkan bahasa yang ditafsirkan ke dalam kompiler, itu tidak mengubah fakta bahwa penerjemah dasar masih seorang juru bahasa.
Penggunaan Memori
Perilaku penggunaan memori dari juru bahasa dan kompiler bersifat relatif dan seringkali bergantung pada kode sumber dan faktor lainnya. Sementara beberapa pemrogram berpendapat bahwa potongan kode pada juru bahasa mengurangi penggunaan memori, juru bahasa juga merekam penggunaan memori agregat.
Misalnya, ketika Anda memeriksa profil penggunaan memori kode Python Anda, jumlah memori yang digunakan mungkin mengejutkan Anda.
Namun secara umum, program yang dikompilasi membutuhkan lebih sedikit memori run-time. Karena mereka mengonversi seluruh kode sumber menjadi kode yang dapat dibaca mesin terlebih dahulu, mereka membuat CPU lebih sedikit bekerja. Ini berbeda dengan interpreter, yang hanya menerjemahkan kode saat run-time.
Dukungan Bahasa Pemrograman
Penerjemah dan kompiler memiliki bagian yang adil distribusi bahasa pemrograman. Beberapa bahasa kompilasi populer termasuk C, C#, Rust, dan Golang. Bahasa yang diterjemahkan juga populer, di antaranya Python, JavaScript, dan PHP.
Lebih banyak programmer cenderung lebih suka bahasa yang ditafsirkan. Sementara JavaScript dan Python menggunakan juru bahasa, mereka adalah dua bahasa yang paling diinginkan secara keseluruhan, menurut Survei Pengembang Stack Overflow 2023. Rust dan C# mewakili grup yang dikompilasi di posisi kelima dan keenam.
Di mana Bahasa yang Ditafsirkan Bersinar
Penerjemah bersinar di area ini:
- Mereka memungkinkan pelacakan kesalahan yang mudah karena juru bahasa mengeksekusi setiap baris kode secara terpisah.
- Seringkali lebih cepat untuk mencapai produk minimum yang layak lebih awal dengan bahasa yang ditafsirkan, karena mereka memiliki sintaks yang kurang kompleks dibandingkan dengan bahasa yang dikompilasi.
- Tidak seperti bahasa kompilasi yang diketik secara statis, bahasa yang ditafsirkan menggunakan pengetikan dinamis, mengurangi kompleksitas kode dan meningkatkan keterbacaan.
Di mana Bahasa yang Dikompilasi Menang
Bagaimana dengan kompiler? Berikut adalah beberapa aspek yang menunjukkan kekuatan bahasa mereka:
- Bahasa yang dikompilasi biasanya lebih cepat dalam eksekusi, membutuhkan memori run-time yang lebih sedikit karena terjemahan kode hanya terjadi sekali sebelumnya.
- Eksekusi setelah kompilasi membantu deteksi bug awal. Kompiler memastikan penerapan gagal setelah terjadi kesalahan. Ini lebih baik daripada menangkap kesalahan selama run-time.
- Meskipun diketik secara statis, bahasa yang dikompilasi dengan jelas mendefinisikan maksud dari variabel dan fungsi, membuatnya lebih terdokumentasi.
Memilih Penerjemah yang Tepat untuk Proyek Anda
Seperti yang telah Anda lihat, kompiler dan juru bahasa memiliki area masing-masing di mana mereka unggul. Sementara beberapa pemrogram berpendapat bahwa bahasa yang dikompilasi lebih cepat dan lebih baik secara keseluruhan, yang lain berpendapat bahwa kinerja bergantung pada struktur kode dan platform.
Namun yang lebih penting, pilihan penerjemah Anda juga harus bergantung pada beberapa faktor lain selain mekanisme teknisnya. Kemudahan belajar, komunitas, dan maksud proyek, adalah beberapa faktor yang perlu dipertimbangkan saat memilih antara bahasa yang ditafsirkan dan dikompilasi.