'''Kompilator''' atau '''kompiler''' ([[bahasa Inggris|Inggris]]: ''compiler'') adalah sebuah program komputer yang berguna untuk menerjemahkanmenafsirkan program komputer yang ditulis dalam bahasa pemrograman tertentu (bahasa ''asal'') menjadi program yang ditulis dalam bahasa pemrograman lain (bahasa ''targetsasaran'').
Terlepas dari pengertiannya yang demikian relatif luas, istilah ''kompilator'' biasa digunakan untuk program komputer yang menerjemahkanmenafsirkan program yang ditulis dalam [[bahasa pemrograman tingkat tinggi]] (semacam [[Pascal (bahasa pemrograman)|bahasa Pascal]], [[C plus plus|C++]], [[BASIC]], [[FORTRAN]], [[Visual Basic]], [[Visual-C-sharp|Visual C#]], [[Java]], [[xBase]], atau [[COBOL]]) menjadi bahasa mesin, biasanya dengan bahasa ''[[Assembly]]'' sebagai perantara.
''Kompilator'' melakukan proses kompilasi dengan cara menganalisis kode sumber secara keseluruhan, sehingga waktu yang dibutuhkan untuk melakukan kompilasi lebih lama, tetapi hasilnya lebih cepat dalam proses eksekusi daripada program yang dibuat dengan menggunakan teknik interpretasipenafsiran dengan [[penerjemah (komputasi)|''interpreter'']] (penafsir).
== Arsitektur kompilator ==
Arsitektur ''kompilator'' modern biasanya bukan lagi merupakan program tunggal namun merupakan rangkaian komunikasi antarantara program dengan tugas spesifik masing-masing. Program-program tersebut beserta tugasnya secara umum terdiri dari:
* ''KompilatorCompiler'' (kompilator) itu sendiri, yang menerima kode sumber dan menghasilkan bahasa tingkat rendah (''assembly'')
* ''Assembler'' (perakit), yang menerima keluaran ''kompilator'' dan menghasilkan berkas objek dalam bahasa mesin
* ''Linker'' (penaut), yang menerima berkas objek keluaran ''assembler'' untuk kemudian digabungkan dengan pustaka-pustaka yang diperlukan dan menghasilkan program yang dapat dieksekusi (''executable'')
''KompilatorCompiler'' yang menggunakan arsitektur ini misalnya [[GCC]], [[Clang]] dan [[FreeBASIC]].
Beberapa ''kompilator'' tidak menggunakan arsitektur di atas secara gamblang, dikarenakan komunikasi antarantara program jauh lebih lambat dibandingkan jika komunikasi dilakukan secara internal di dalam satu program. Sehingga ''kompilator-kompilator'' tersebut mengintegrasikan ''assembler'' dan ''linker'' di dalam ''kompilator''. Namun, biasanya arsitektur yang digunakan pun tidak kaku dan mengizinkan penggunaan ''assembler'' maupun ''linker'' eksternal (berguna jika ''assembler'' dan ''linker'' internal bermasalah atau memiliki galat). Kompilator yang menggunakan arsitektur ini salah satunya adalah [[Free Pascal]].
Profesor [[Niklaus Wirth]] dalam bukunya ''Compiler Construction'' <ref name="cbe">[https://web.archive.org/web/20110805035946/http://www.inf.ethz.ch/personal/wirth/books/CompilerConstruction/CBE.pdf Compiler Construction], (''update'' Juni 2011)</ref> menyatakan bahwa penggunaan ''assembler'' sebagai bahasa perantara sering kali tidak memberikan keuntungan yang signifikan, sehingga dia menyarankan agar kompilator langsung menghasilkan bahasa mesin. Kompilator dengan arsitektur seperti ini dapat berjalan dengan sangat cepat, seperti yang ditunjukkan pada kompilator orisinil [[Pascal]], [[Modula-2]] dan [[Oberon]] yang dibuat oleh sang profesor.
== Tahap-tahap dalam kompilasi ==
Suatu ''kompilator'' harus menganalisis kode asal terlebih dahulu untuk memahami seluruh kode tersebut. Hasil dari analisis itu berbentuk representasi dari kode asal, yang nanti akan diterjemahkanditafsirkan oleh ''kompilator'' ke dalam bahasa targetsasaran. Oleh karena itu, ''kompilator'' terdiri dari beberapa tahap. Setiap tahap memiliki tugas masing-masing dalam proses kompilasi.<ref name=":0">{{Cite journal|last=Bornat|first=Richard|date=1979|title=Understanding and Writing Compilers|url=http://dx.doi.org/10.1007/978-1-349-16178-2|doi=10.1007/978-1-349-16178-2}}</ref>
=== Analisis leksikal ===
Analisis leksikal adalah tahap di mana ''kompilator'' menganalisis setiap karakter (seperti huruf, tanda kurung, dsb.) dalam kode asal dan menghasilkan deretan simbol yang masing-masing dinamakan ''token.<ref name=":0" />'' Biasanya simbol-simbol tadi disimpan dalam bentuk [[larik]].<ref>{{Cite web|date=2023-06-18|title=Scanning · Crafting Interpreters|url=https://web.archive.org/web/20230618023650/https://craftinginterpreters.com/scanning.html|website=web.archive.org|access-date=2023-07-15}}</ref>
=== Analisis sintakssintaksis ===
{{Main|Parsing}}
Analisis sintakssintaksis atau ''parsing'' adalah tahap di mana ''kompilator'' menganalisis ''token-token'' yang dihasilkan dalam proses analisis leksikal dan mengelompokkan mereka menjadi suatu [[pohon urai]] berdasarkan struktur bahasa asal.<ref name=":0" />
=== Analisis semantik ===
{{Main|Analisis semantik}}
Analisis semantik adalah tahap atau proses yang menggunakan pohon uraian hasil dari analisis sintakssintaksis tadi untuk memastikan konsistensi semantik dari program, dan juga mengoptimalkan struktur dari program. Proses ini juga mengumpulkan dan menganalisis informasi mengenai [[tipe data]] dari [[Variabel (ilmu komputer)|variabel-variabel]] yang ada di dalam program. Informasi tentang tipe data ini disimpan dalam [[Symbol Table|tabel simbol]] atau langsung di dalam pohon urai ''parsing,'' yang nanti akan dimanfaatkan dalam penghasilan kode sasaran (''target code''). <ref name=":1">{{Cite book|last=Aho|first=Alfred V.|last2=Sethi|first2=Ravi|last3=Ullman|first3=Jeffrey D.|date=2002|title=Compilers: principles, techniques, and tools|location=Reading, Mass.|publisher=Addison-Wesley|isbn=978-0-201-10088-4|edition=Reprinted, with corr., [36. Druck]|series=Addison-Wesley series in computer science}}</ref>
=== PenghasilanMenghasilkan kode targetsasaran ===
{{Main|Code generation}}
Pada tahap ini, kompilator menggunakan semua informasi mengenai kode asal yang telah dikumpulkan dalam tahap-tahap sebelumnya, untuk menghasilkan kode targetsasaran<ref name=":1" />. Kode targetsasaran dapat berupa [[Intermediate representation|representasi perantara]], yang nanti dapat diproses oleh komponen lain (seperti assembler, LLVM, Java, dsb.), atau bisa jadi langsung berupa kode mesin. Dalam proses ini, kompilator juga melakukan pengoptimalan kode ''target''sasaran agar kinerja program menjadi lebih baik.<ref name="cbe" />
== Kompilator ''single pass'' dan kompilator ''multi-pass'' ==
Metode yang digunakan kompilator dalam menggunakan tahap-tahapnya terbagi menjadi dua. Kompilator dapat memproses kode asal secara keseluruhan dalam suatu tahap lalu mengopor hasil dari proses tersebut ke tahap berikutnya, di mana tahap berikutnya kembali memproses kode asal secara keseluruhan, inilah yang dinamakan kompilator ''multi-pass,'' yaitu kompilator tersebut memproses kode asal dalam dua kali jalan atau lebih.
Sedangkan, kompilator ''single pass'' memproses hanya sebagian dari kode asal dalam suatu tahap lalu mengopormengoper hasil dari proses tersebut kepada tahap berikutnya, jika semua tahap sudah dilalui, maka kompilator lanjut kepada bagian berikutnya dari kode asal. Dengan begini, kompilator ''single pass'' memproses kode asal hanya dalam satu kali jalan.<ref name=":0" />
Sering diinterpretasikanditafsirkan bahwa kompilator ''single-pass'' lebih cepat daripada kompilator ''multi-pass''. InterpretasiTafsiran ini tidaklah benar.<ref name=":0" /> Selama tahap-tahap dalam kedua jenis kompilator itu sama, dan kode asal yang diproses juga sama, maka kedua jenis kompilator tersebut tetap saja mengerjakan jumlah pekerjaan yang sama. Sehingga kecepatan dari keduanya juga sama.
== Lihat pula ==
* [[Penerjemah (komputasi)|InterpreterPenafsir program]]
* ''[[P-Code]]''
== Referensi ==
|