Apa itu kompiler?

Wanita bekerja dari rumah di komputer

Penyusun

Josh Schneider

Staff Writer

IBM Think

Ian Smalley

Staff Editor

IBM Think

Apa itu kompiler?

Kompiler adalah jenis program komputer yang mengubah kode dari satu bahasa pemrograman (bahasa sumber) ke bahasa pemrograman lain (bahasa target).

Kompiler digunakan untuk mengubah kode sumber tingkat tinggi menjadi kode target tingkat rendah (seperti bahasa rakitan, kode objek, atau kode mesin) sambil mempertahankan fungsionalitas program.

Alat penting untuk pemrograman komputer modern dan praktis, kompiler memungkinkan programer untuk bekerja dalam kode tingkat tinggi yang dapat dibaca manusia dan kemudian mengubah kode sumber mereka menjadi kode target yang dapat dieksekusi. Kompiler juga membantu pengembang perangkat lunak membuat program yang dapat dieksekusi secara efisien dengan keamanan, stabilitas, dan portabilitas yang lebih baik. Hal ini karena kompiler membantu mengidentifikasi dan mengatasi kesalahan, sehingga menciptakan aplikasi portabel yang dapat dieksekusi. 

Meskipun semua kompiler mengubah kode tingkat tinggi menjadi kode tingkat rendah yang dapat dieksekusi, berbagai jenis kompiler digunakan untuk berbagai bahasa pemrograman dan aplikasi. Misalnya, kompiler silang digunakan untuk menghasilkan kode untuk jenis CPU atau sistem operasi yang berbeda dari yang menjalankannya.

Ketika kompiler ideal tidak tersedia, atau belum dibangun, kompiler bootstrap sementara digunakan untuk mengkompilasi kompiler yang lebih permanen yang lebih baik dioptimalkan untuk mengkompilasi bahasa pemrograman tertentu.

Daftar singkat perangkat lunak terkait lainnya meliputi:

  • Dekompiler bekerja seperti kompiler terbalik dan mengubah kode tingkat rendah menjadi bahasa tingkat tinggi.
  • Kompiler sumber-ke-sumber (atau transpiler) mengubah kode tingkat tinggi ke bahasa tingkat tinggi lainnya.
  • Penulis ulang bahasa mengubah ekspresi kode formal ke dalam bentuk yang berbeda tanpa mengubah bahasa.
  • Kompiler-kompiler digunakan untuk membuat kompiler umum dan dapat digunakan kembali atau komponen kompiler yang dapat digabungkan ke dalam tujuan yang lebih spesifik untuk proyek.  

Berita teknologi terbaru, didukung oleh insight dari pakar

Ikuti perkembangan tren industri yang paling penting—dan menarik—di bidang AI, otomatisasi, data, dan lainnya dengan buletin Think. Lihat Pernyataan Privasi IBM.

Terima kasih! Anda telah berlangganan.

Langganan Anda akan disediakan dalam bahasa Inggris. Anda akan menemukan tautan berhenti berlangganan di setiap buletin. Anda dapat mengelola langganan atau berhenti berlangganan di sini. Lihat Pernyataan Privasi IBM kami untuk informasi lebih lanjut.

Cara kerja kompiler

Dalam praktiknya, menggunakan kompiler bisa sesederhana memasukkan perintah ke dalam baris perintah di sistem Linux (atau setara) apa pun, menentukan file eksekusi kompiler dan file sumber yang akan dikompilasi. Perintah ini menginstruksikan sistem untuk memproses kode sumber, mengkompilasinya menjadi kode mesin target dan menghasilkan file objek yang diperlukan untuk menghasilkan program yang dapat dieksekusi. 

Kompiler sumber terbuka seperti GNU Compiler Collection (GCC) —koleksi kompiler C yang kuat yang biasa digunakan untuk mengkompilasi kode C menjadi program C—atau alternatif Clang tersedia di repositori seperti GitHub. Kompiler lain dapat diinstal atau dibeli secara bebas dari beragam distributor. Mereka juga dapat dibangun ke dalam lingkungan pengembangan terpadu (IDE) populer, yang menggabungkan berbagai utilitas untuk pengembangan perangkat lunak, termasuk editor teks, dokumentasi API, dan alat debugging.     

Terlepas dari kompiler tertentu yang digunakan, proses kompilasi kode melibatkan kode sumber melalui berbagai tingkat analisis, pengoptimalan, dan pada akhirnya pembuatan kode. Kode sumber melewati berbagai lapisan analisis secara berurutan dan dievaluasi melalui setiap langkah dalam proses.

Jika kompiler mengenali masalah dengan kode sumber, itu mungkin mengembalikan pesan kesalahan, meminta pengembang untuk mengatasi kesalahan yang diidentifikasi sebelum melanjutkan dengan mengkompilasi sisa kode. Umumnya, penyusun melanjutkan melalui langkah-langkah berikut:

  1. Analisis leksikal: Langkah pertama kompilasi meneruskan kode sumber melalui lexer kompiler, sebuah program yang mengubah karakter menjadi unit bahasa yang bermakna, seperti kata kunci, pengenal, dan operator yang dikenal. Unit-unit ini secara kolektif dikenal sebagai token. Langkah ini pada dasarnya mempersiapkan kode sumber untuk langkah selanjutnya dengan mengubah elemen-elemen kode sumber yang bermakna dan penting menjadi token yang dapat digunakan oleh kompiler. 
  2. Analisis sintaks: Langkah kedua dalam proses kompilasi mengirimkan token dari lexer ke pengurai kompiler. Parser adalah program yang memeriksa kode dari kesalahan sintaksis dan memastikan bahwa kode sumber mengikuti aturan bahasa sumber dengan benar. Jika parser tidak deteksi adanya kesalahan selama penguraian, parser akan menghasilkan representasi abstrak dari keseluruhan struktur kode yang disebut Abstract Syntax Tree (AST).
  3. Analisis semantik: Setelah memverifikasi sintaks kode, kompiler melakukan analisis semantik pada kode yang diurai untuk menyimpulkan fungsi yang dimaksudkan dari kode sumber. Pada langkah ini, kompiler melakukan pemeriksaan untuk kesalahan logis seperti variabel yang tidak dideklarasikan atau penggunaan operator yang salah.
  4. Pengoptimalan: Meskipun tidak selalu diperlukan untuk menghasilkan kode yang berfungsi, pengoptimalan adalah langkah opsional yang umum dilakukan oleh banyak kompiler untuk meningkatkan kinerja keseluruhan kode yang dikompilasi. Pengoptimalan dapat mengidentifikasi dan menghapus kode yang tidak perlu dan menghasilkan program yang lebih cepat, lebih efisien, dan lebih stabil, serta mempersingkat proses debugging akhir. 
  5. Pembuatan kode: Pada langkah terakhir dari proses ini, kompiler mengubah AST menjadi kode yang dapat dibaca oleh mesin. Output akhir dari pembuatan kode adalah kode bahasa rakitan yang kemudian dapat dikonversi menjadi kode biner dan dieksekusi oleh sistem komputer. 
AI Academy

Mencapai kesiapan AI dengan hybrid cloud

Dipandu oleh pemimpin terkemuka IBM, kurikulumnya dirancang untuk membantu pemimpin bisnis dalam mendapatkan pengetahuan yang diperlukan untuk memprioritaskan investasi AI yang dapat mendorong pertumbuhan.

Struktur kompiler tiga tahap

Beberapa kompiler mungkin tidak mematuhi secara ketat struktur sebelumnya. Namun, meskipun beberapa kompiler mungkin berisi lebih banyak atau lebih sedikit langkah, semua fase kompilasi dapat dianggap sebagai salah satu dari tiga tahap: front end, middle end, dan back end.

Struktur tiga tahap ini memungkinkan kompiler untuk mengambil pendekatan modular. Hal ini memungkinkan penggabungan beberapa front end untuk bahasa yang berbeda dengan back end untuk CPU yang berbeda, sekaligus berbagi kemampuan pengoptimalan berbagai middle end yang dapat diterapkan.

Tiga tahap kompiler memerlukan distribusi berikut:

  1. Front end: Front end kompiler mencakup aspek analisis leksikal, analisis sintaksis, dan analisis semantik. Tahap ini memverifikasi sintaks dan semantik sesuai dengan aturan bahasa sumber dan dapat mengidentifikasi dan menentukan kesalahan dalam kode sumber. Dengan asumsi tidak ada kesalahan yang ditemukan, bagian depan kompiler akan mengonversi kode sumber ke dalam representasi intermediate (IR) - konversi tingkat rendah sementara dari kode sumber - untuk ujung tengah. 
  2. Middle end: Tahap middle-end dari kompiler melakukan berbagai pengoptimalan kode pada IR yang tidak bergantung pada arsitektur CPU apa pun yang ditargetkan oleh proses kompilasi secara keseluruhan. Dengan memberlakukan pengoptimalan pada kode sumber secara independen dari kode mesin target, kompiler dapat menerapkan pengoptimalan umum yang dapat meningkatkan kinerja kode di beberapa versi. Perbaikan ini dapat dilakukan terlepas dari bahasa yang didukung atau arsitektur perangkat keras tertentu. 
  3. Back end: Tahap back-end menggunakan output dari tahap middle-end dan mungkin melakukan pengoptimalan dan konversi khusus CPU lainnya. Pada tahap akhir proses kompilasi ini, kompiler output kode rakitan yang bergantung pada target, termasuk alokasi register dan penjadwalan instruksi. Tahap back-end biasanya menghasilkan kode mesin khusus untuk sistem operasi dan perangkat keras target. 

Manfaat menggunakan kompiler

Meskipun kompiler tidak secara eksplisit diperlukan untuk menghasilkan kode yang dapat diterapkan, variasi dan kompleksitas yang luas dari pengodean dan lingkungan mesin membuat kompiler menjadi kebutuhan praktis untuk membuat perangkat lunak yang dapat dieksekusi. Ini adalah empat manfaat utama menggunakan kompiler perangkat lunak.

Memfasilitasi pengodean bahasa tingkat tinggi

Bahasa pemrograman tingkat tinggi menggunakan sintaks dan kata kunci yang lebih mirip dengan bahasa lisan, sehingga lebih mudah digunakan oleh pengembang. Kompiler mengubah kode yang dapat dibaca manusia ini menjadi kode mesin yang lebih kompleks yang diperlukan untuk menjalankan aplikasi perangkat lunak yang dioptimalkan.

Beberapa contoh bahasa tingkat tinggi meliputi bahasa-bahasa berikut:

  • Python (digunakan untuk pengembangan web, ilmu data, dan lainnya)
  • Java™ (digunakan untuk pengembangan Android, aplikasi perusahaan, dan lainnya)
  • C++ (digunakan untuk pengembangan game, sistem operasi, dan lainnya)
  • JavaScript (digunakan untuk pengembangan web yang dinamis dan interaktif)
  • PHP (digunakan untuk skrip sisi server dalam pengembangan web)
  • C# (digunakan untuk aplikasi Windows, pengembangan game engine Unity)
Kurangi pengulangan

Kompiler membantu meningkatkan efisiensi dengan mengubah kode tingkat tinggi menjadi kode mesin yang dapat dieksekusi. Output kompiler disimpan dengan.exe ekstensi file, yang kemudian langsung dieksekusi oleh komputer. Karena kompiler, menulis program yang dapat dieksekusi menjadi tugas upaya satu kali.

Setelah selesai, kode yang dikompilasi dapat dieksekusi sebanyak yang diperlukan. Proses ini membantu program umumnya berjalan lebih cepat dan lebih efisien, karena aplikasi tertentu atau bagian aplikasi dapat dijalankan secara terpisah dari tugas perangkat lunak waktu proses.

Tingkatkan portabilitas

Tidak semua sistem dapat menjalankan semua jenis kode pemrograman. Kompiler digunakan untuk mengubah jenis kode yang lebih disukai pengembang menjadi jenis kode yang dibutuhkan sistem untuk beroperasi. Dengan cara ini, kompiler meningkatkan portabilitas program dengan mengonversi perangkat lunak ke dalam berbagai macam bahasa yang kompatibel yang dapat dengan mudah disimpan, ditransfer, dan dieksekusi dalam berbagai sistem operasi dan arsitektur perangkat keras.

Mempromosikan pengoptimalan secara keseluruhan

Selama proses kompilasi, kompiler dapat digunakan untuk mengidentifikasi dan mengatasi kesalahan dan kelemahan perangkat lunak, sehingga menghasilkan program yang lebih stabil dan lebih optimal. Kompiler juga dapat membantu meningkatkan keamanan perangkat lunak dengan mencegah kesalahan terkait memori, seperti luapan buffer, dan menghasilkan peringatan jika potensi masalah memori terdeteksi. 

Kompiler versus interpreter

Sementara kompiler digunakan untuk mengonversi kode sumber menjadi kode mesin yang dapat dieksekusi, interpreter adalah jenis program lain yang dapat menyediakan fungsionalitas serupa, tetapi melalui mekanisme yang berbeda.

Alih-alih mengonversi kode sumber, interpreter dapat secara langsung mengeksekusi kode sumber atau menggunakan kode perantara yang dikenal sebagai bytecode, representasi kode sumber yang tidak bergantung pada platform. Bytecode berfungsi sebagai perantara antara kode sumber yang dapat dibaca manusia dan kode mesin, dirancang untuk dieksekusi oleh mesin virtual (VM) alih-alih langsung pada perangkat keras komputer. 

Secara teoritis, bahasa pemrograman apa pun dapat dieksekusi dengan kompiler atau interpreter. Namun, bahasa pemrograman individu cenderung lebih cocok untuk kompilasi atau interpretasi.

Dalam praktiknya, perbedaan antara bahasa kompiler dan bahasa interpreter terkadang bisa kabur—seperti halnya perbedaan antara kompiler dan interpreter itu sendiri—karena kedua jenis program ini dapat memiliki fitur yang tumpang tindih. Meskipun beberapa bahasa lebih sering dikompilasi dan beberapa bahasa lebih sering diinterpretasikan, Anda dapat menulis kompiler untuk bahasa yang lebih sering diinterpretasikan dan sebaliknya.

Bahasa tingkat tinggi biasanya dibuat dengan jenis konversi (baik kompilasi atau interpretasi) dalam pikiran, tetapi ini lebih merupakan saran daripada batasan yang keras. Sebagai contoh, BASIC sering disebut sebagai bahasa yang diinterpretasikan dan C sebagai bahasa yang dikompilasi, tetapi ada kompiler untuk BASIC seperti halnya interpreter C. 

Perbedaan utama antara interpreter dan kompiler terletak pada pengaturan waktu dan pengoptimalan. Kedua jenis program mencoba mengubah kode sumber menjadi kode target yang pertama-tama fungsional dan kemudian dioptimalkan.

Tergantung pada lingkungan operasi, kode yang dikompilasi atau ditafsirkan mungkin lebih cocok untuk dijalankan secara efisien dengan pertimbangan yang dibuat untuk kemampuan perangkat keras, memori, dan kapasitas penyimpanan. Tergantung pada kendala program, aplikasi, dan perangkat keras tertentu, baik kompilasi, interpretasi atau kombinasi keduanya dapat menghasilkan hasil terbaik. 

Dengan demikian, penerjemahan tidak dapat menggantikan kompilasi sepenuhnya, tetapi dapat pindah tugas kompilasi ke latar belakang melalui proses konversi bertahap. Kompiler menggunakan strategi konversi ahead-of-time (AOT) yang mengubah kode sumber menjadi kode target sepenuhnya sebelum membuat file yang dapat dieksekusi.

Interpreter, sebagai alternatif, menjalankan kode secara langsung saat aplikasi membutuhkannya atau menggunakan bytecode sebagai perantara untuk mengeluarkan kode sumber yang dapat dieksekusi oleh mesin virtual. Dengan cara ini, interpreter dapat memberikan beberapa kecepatan atau fleksibilitas, tetapi pada titik tertentu, satu set instruksi mesin yang dieksekusi secara langsung harus disediakan di akhir tumpukan eksekusi.

Dalam beberapa kasus, ketika efisiensi ringan menjadi prioritas, interpreter khusus dapat lebih disukai daripada kompiler karena kemampuannya untuk melakukan konversi tepat waktu (JIT). JIT adalah strategi yang mengompilasi potongan kode sumber menjadi kode target ke dalam buffer memori untuk eksekusi segera. Interpretasi JIT mengkompilasi kode sesuai permintaan, menggabungkan efisiensi kompilasi satu kali dari kompiler tradisional dengan fleksibilitas untuk mengeksekusi kode berulang kali—seringkali lebih cepat daripada interpreter bytecode standar.

Namun, seiring dengan meningkatnya tren modern terhadap kompilasi JIT dan interpretasi bytecode yang bergantung pada situasi, banyak kompiler yang dirancang untuk menawarkan fitur kompilasi dan interpretasi. Tumpang tindih ini makin mengaburkan garis antara kedua kategori ini. 

Solusi terkait
IBM Cloud Infrastructure Center 

IBM Cloud Infrastructure Center adalah platform perangkat lunak yang kompatibel dengan OpenStack untuk mengelola infrastruktur cloud pribadi di IBM zSystems dan IBM LinuxONE.

Jelajahi Cloud Infrastructure Center
Solusi Infrastruktur TI

Temukan server, penyimpanan, dan perangkat lunak yang dirancang untuk hybrid cloud dan strategi AI perusahaan Anda.

Jelajahi solusi infrastruktur TI
Solusi Infrastruktur Cloud

Temukan solusi infrastruktur cloud yang tepat untuk kebutuhan bisnis Anda dan tingkatkan sumber daya sesuai permintaan.

Solusi cloud
Ambil langkah selanjutnya

Ubah infrastruktur perusahaan Anda dengan solusi hybrid cloud yang siap AI dari IBM. Temukan server, penyimpanan, dan perangkat lunak yang dirancang untuk mengamankan, menskalakan, dan memodernisasi bisnis Anda atau mengakses insight pakar demi meningkatkan strategi AI generatif Anda.

Jelajahi solusi infrastruktur TI Unduh ebook