Apa itu Compiler?
Compiler adalah sebuah program khusus yang berfungsi untuk menerjemahkan kode sumber dari suatu bahasa pemrograman ke dalam bentuk kode mesin, bytecode, atau bahkan ke bahasa pemrograman lain. Kode sumber ini biasanya ditulis dalam bahasa tingkat tinggi yang mudah dibaca manusia, seperti Java atau C++. Seorang programmer biasanya menulis kode ini lewat editor atau lingkungan pengembangan terintegrasi (IDE), lalu menyimpannya dalam satu atau beberapa file teks.
Compiler yang mendukung bahasa pemrograman tertentu akan membaca file tersebut, menganalisis isinya, lalu menerjemahkannya ke dalam format yang sesuai dengan platform tujuan.
Compiler yang menghasilkan kode mesin biasanya ditujukan untuk sistem operasi dan arsitektur komputer tertentu. Hasil output seperti ini sering disebut sebagai object code (tidak berkaitan dengan object-oriented programming). Kode mesin terdiri dari rangkaian bit biner—angka 1 dan 0—yang bisa langsung dibaca dan dijalankan oleh prosesor target. Contohnya, compiler bisa menghasilkan kode mesin untuk platform Linux x64 atau Linux ARM 64-bit.
Beberapa compiler tidak langsung menghasilkan kode mesin, melainkan menerjemahkan kode sumber ke dalam bentuk bytecode. Bytecode ini pertama kali diperkenalkan lewat bahasa Java. Bytecode bisa dijalankan di sistem mana pun yang punya Java Virtual Machine (JVM) atau interpreter bytecode. JVM atau interpreter akan mengubah bytecode menjadi instruksi yang bisa dimengerti oleh prosesor perangkat. JVM juga memungkinkan bytecode dikompilasi ulang menggunakan just-in-time compiler. (Lihat juga: Java compiler)
Ada juga compiler yang menerjemahkan kode sumber ke bahasa tingkat tinggi lainnya, bukan ke bytecode atau kode mesin. Jenis compiler ini disebut transpiler atau transcompiler, alias source-to-source translator. Misalnya, seorang developer bisa menggunakan transpiler untuk mengubah kode COBOL menjadi Java.
Apa pun jenis bahasa sumber atau hasil output-nya, sebuah compiler harus bisa memastikan bahwa logika dari kode yang dihasilkan tetap sama dengan kode aslinya. Compiler pada dasarnya adalah “translator”, jadi harus bisa menjamin hasil akhir tetap akurat dan tidak ada bagian logika yang hilang.
Bagaimana Cara Kerja Compiler?
Setiap compiler bisa punya pendekatan berbeda dalam menganalisis dan menerjemahkan kode, tapi secara umum mereka mengikuti tahapan berikut:
- Lexical analysis. Compiler memecah kode sumber menjadi potongan-potongan kecil bernama lexeme. Potongan ini mewakili pola-pola sintaksis tertentu dan akan diubah menjadi token untuk tahap analisis berikutnya.
- Syntax analysis. Compiler memeriksa apakah sintaks kode sudah sesuai dengan aturan bahasa sumber. Tahap ini dikenal juga sebagai parsing, dan biasanya compiler akan membuat abstract syntax tree yang menggambarkan struktur logika kode.
- Semantic analysis. Compiler mengecek apakah logika kode valid. Tahap ini lebih dalam daripada analisis sintaksis, misalnya dengan mengecek apakah variabel sudah dideklarasikan dan punya tipe data yang benar.
- IR code generation. Setelah semua analisis selesai, compiler menghasilkan Intermediate Representation (IR), yaitu bentuk perantara dari kode sumber. IR ini akan mempermudah proses translasi ke format akhir, asalkan tetap mewakili semua aspek dari kode aslinya.
- Optimization. Compiler melakukan optimasi terhadap IR sebelum menghasilkan kode akhir. Tingkat dan jenis optimasi bisa berbeda tergantung compiler yang digunakan. Beberapa bahkan mengizinkan pengguna memilih level optimasinya sendiri.
- Output code generation. Compiler akhirnya membuat output code berdasarkan IR yang sudah dioptimasi.
Kadang-kadang compiler disalahartikan sebagai interpreter. Meskipun fungsinya mirip, sebenarnya mereka punya perbedaan mendasar. Compiler menganalisis dan menerjemahkan kode yang ditulis dalam bahasa seperti Java, C++, C#, atau Swift. Biasanya hasilnya berupa kode mesin atau bytecode yang siap dieksekusi di sistem target.
Sementara itu, interpreter tidak menghasilkan IR atau menyimpan kode mesin. Interpreter langsung menjalankan kode baris demi baris saat runtime, tanpa mengubahnya menjadi file terpisah lebih dulu. Interpreter sering digunakan untuk bahasa skrip seperti Perl, PHP, Ruby, atau Python.
Lihat juga: decompile, yet another compiler compiler, parser, software toolchain, native code, assembler