Week ke - 1
• Menjelaskan konsep dasar dari teknik kompilasi yang mencakup fungsi, tahapan
kompilasi, komponen pada teknik kompilasi dan alat pembuat compiler
OUTLINE MATERI :
5. Tahapan kompilasi
6. Contoh kompilasi
Bahasa pemrograman merupakan sebuah cara menulis untuk mendeskripsikan komputasi yang
dapat dimengerti oleh manusia dan komputer. Sebuah program akan berjalan diatas komputer,
namun tentunya sebelum program tersebut dapat berjalan maka program tersebut perlu
diterjemahkan terlebih dahulu ke dalam bentuk yang dapat dimengerti dan dieksekusi oleh
komputer. Komputer pertama kali muncul pada tahun 1940 dimana Bahasa mesin yang dapat
dimengerti masih dalam bentuk urutan biner, yaitu 0 dan 1. Operasi yang dilakukan secara satu
persatu, mulai dari pemindahan data dari satu lokasi ke lokasi lainnya, melakukan
perhitungan/komputasi antar register, membandingkan dua nilai, dan lainnya. Dapat dikatakan
bahwa waktu dibutuhkan cukup lama, menjemukan dan rawan akan kesalahan. Apabila program
yang dibuat mengalami kesalahan maka akan sulit untuk dimodifikasi karena program yang
sudah dibuat akan sulit dipahami.
Compiler
Proses penerjemahan dari sebuah Bahasa pemrograman (source language) ke Bahasa yang
dapat dimengerti oleh mesin computer (target language) adalah tugas dari compiler. Source
language dapat berupa Bahasa pemrograman tingkat tinggi seperti Pascal, C, C++, FORTRAN,
dll, sedangkan target language biasanya berupa Bahasa pemrograman tingkat rendah seperti
Bahasa assembly dan Bahasa mesin. Namun sebuah compiler dapat juga didesain untuk dapat
menerjemahkan Bahasa tingkat tinggi ke dalam bentuk Bahasa tingkat tinggi lainnya. Gambar 1
menunjukkan ilustrasi untuk memahami sebuah compiler. Pada gambar terlihat bahwa source
language berupa Bahasa tingkat tinggi yang akan diterjemahkan ke dalam target language
berupa Bahasa tingkat rendah. Selama proses kompilasi juga akan dihasilkan pesan error apabila
ditemukan kesalahan dalam program asal.
Terdapat beberapa macam compiler dimana hal ini dibedakan berdasarkan sebagaimana
compiler tersebut dibuat/ fungsi utama dari compiler tersebut dibuat.
1. Single-pass Compiler
Kompiler satu arah (single-pass compiler) adalah compiler yang melewati bagian-bagian
dari setiap unit kompilasi hanya sekali, segera menerjemahkan setiap bagian menjadi
kode mesin.
2. Multi-pass Compiler
Multi-pass Compiler adalah jenis kompiler yang memproses source code atau pohon
sintaksis abstrak dari suatu program beberapa kali.
3. Debugging Compiler
5. Optimizing Compiler
Compiler ini akan mencoba untuk meminimalkan atau memaksimalkan beberapa atribut
dari program komputer yang dapat dieksekusi.
Untuk melengkapi sebuah pemrosesan dari source language hingga dapat dieksekusi oleh
komputer maka terdapat beberapa bagian tambahan seperti pre-processor, assembler dan
loader/link-editor yang akan mendukung hasil dari proses compiler. Gambar 2 menunjukkan
tahapan yang ada pada proses sistem penerjemah pada umumnya.
Dimulai dari kerangka program yang dibuat (source program) atau yang biasa disebut dengan
skeletal source program. Kerangka program ini akan diproses oleh pre-processor sehingga
Pre-processor akan melakukan beberapa fungsi seperti menghilangkan makro yang ada pada
kerangka program, menghilangkan file inclusion dengan cara menambahkan header file tersebut
kedalam program, meningkatkan kemampuan atau menambah fasilitas bahasa yang sudah lama
(bahasa yang lebih tua) dan juga menggabungkan perintah yang ditulis dalam bahasa lain ke
dalam program dalam bentuk makro bawaan. Contoh dari penghilangan macro dan file inclusion
dapat dilihat pada gambar dibawah ini.
Pada gambar 3 merupakan kerangka program yang memiliki macro, yaitu SATU dan MAX.
SATU memiliki nilai 10, sedangkan MAX akan menerima parameter a dan b dan melakukan
Fungsi lain yang juga dilakukan oleh pre-processor adalah file inclusion. Sebagai contoh adalah
pembuatan sebuah file baru bernama “macroCollection.c” yang berisi macro dari SATU dan
MAX pada penjelasan diatas ditambahkan dengan inisialisasi variable b. Kemudian file
macroCollection.c tersebut akan digabungkan ke dalam file utama (ContohPreprocessor.c).
Ketika pre-processor membaca adanya file inclusion, maka pre-processor akan menggantikan
inclusion file tersebut dengan isi dari file tersebut. Hasil dari file inclusion dari contoh diatas
dapat dilihat pada gambar 6.
Untuk melihat hasil dari yang pre-processor lakukan pada program yang dibuat dapat
menggunakan perintah cpp (C processor). Setelah sintaks “cpp” maka dilanjutkan dengan nama
file yang ingin dieksekusi, contoh pada kasus ini eksekusi file dilakukan dengan cara $ cpp
ContohPreprocessor.c. Hasil file inclusion dapat dilihat pada gambar 7.
Tahapan pada kompilasi dapat dikelompokan menjadi 2 tahapan besar, yaitu tahap Analisis dan
Sintesis. Tahap analisis merupakan tahap dimana program akan dipecah menjadi bagian-bagian
lebih kecil untuk dianalisis dan menghasilkan representasi penengah (intermediate
representation). Sedangkan pada tahap Sintesis akan dilakukan penyusunan kembali sesuai
dengan target program. Tahap analisis terbagi lagi menjadi 3 bagian, yaitu lexical analyzer,
syntax analyzer dan semantic analyzer. Sedangkan tahap Sintesis juga memiliki 3 bagian, yaitu
intermediate code generator, code optimizer, dan code generator. Gambaran umum tahapan
kompilasi ini dapat dilihat pada gambar 8.
Pada awalnya program akan dibaca dan dikumpulkan mana yang merupakan token atau
bukan. Token merupakan kumpulan dari karakter yang memiliki makna. Proses pembacaan ini
disebut dengan linear analysis/ lexical analysis/ Scanning. Contoh terdapat sebuah statement
berikut:
Berikutnya setiap token yang sudah dikenali tersebut akan dikelompokan secara hirarki
kedalam kelompok bersarang (atau yang dikenal dengan pengecekan sintaks program) untuk
mengetahui apakah kelompok tersebut memiliki makna atau tidak. Pengelompokan tersebut juga
berkaitan dengan aturan-aturan produksi sebuah program. Tahap ini juga dikenal dengan
Hierarchical analysis/ Syntax analysis/ Parsing. Sebuah parse tree dapat dibentuk untuk
mengecekan apakah sebuah kelompok token tersebut memenuhi aturan produksi (grammar)
yang ada. Contoh aturan dari operasi biner perhitungan adalah memiliki 2 operand disertai
dengan 1 simbol diantaranya (initial + rate atau rate * 60). Pada perhitungan matematika terdapat
aturan operasi yang dilakukan terlebih dahulu adalah perkalian dahulu baru penjumlahan.
Aturan-aturan tersebut yang akan dituangkan dalam bentuk aturan produksi (grammar).
Hasil dari tahapan Syntax analysis akan masuk kedalam proses Semantic analysis dimana pada
tahap ini akan diadakan beberapa pengecekan kembali untuk memastikan bahwa setiap
komponen yang ada tersebut memiliki makna. Beberapa hal yang biasanya dilakukan pada tahap
semantic analyzer yaitu, pengecekan tipe data, memastikan semua variable diinisialisasi sebelum
digunakan, objek binding, menolak program yang salah, dan menghasilkan warning.
Setelah itu program akan masuk ke tahap intermediate code generation. Fungsi dari tahap ini
adalah menghasilkan sebuah representasi dari program yang ada ke dalam bentuk yang
mendekati bahasa mesin. Kemudian dari representasi yang ada tersebut akan dilakukan proses
optimisasi oleh code optimizer untuk meningkatkan performa dari bahasa mesin yang akan
dihasilkan nantinya. Terakhir representasi dari program yang telah dioptimisasi tersebut akan
diubah bentuknya kedalam bahasa assembly atau bahasa mesin yang masih belum menggunakan
alamat dari memori.
1. Scanner Generator: sebuah tools yang digunakan untuk menghasilkan tokens berdasarkan
dari inputan regular expression yang diberikan.
2. Parser Generator: sebuah tools yang digunakan untuk menghasilkan sebuah parse tree
dari input berdasarkan aturan Context Free Grammar yang diberikan.
4. Data Flow Engine: tools yang digunakan mengumpulkan informasi dari flow data pada
sebuah program sehingga berguna untuk optimisasi program.
5. Automatic Code Generator: tools yang dapat mengambil kumpulan aturan (instruction
set) yang digunakan untuk mengubah intermediate code kedalam bentuk bahasa mesin
dari mesin target.
Compiler merupakan sebuah penerjemah yang akan mengubah source language ke dalam
bentuk target language. Source language pada umumnya merupakan bahasa program tingkat
tinggi seperti C, C++, Pascal, dll. Sedangkan target language berupa bahasa mesin abstrak atau
bahasa assembly. Dalam membuat sebuah program dapat dieksekusi oleh mesin komputer
sampai menghasilkan output-nya maka compiler didukung oleh pre-processor, assembler, dan
loader/linker. Pada awalnya kerangka program akan diproses oleh pre-processor dan hasilnya
yang akan diproses oleh compiler. Hasil dari compiler berupa bahasa assembly membutuhkan
assembler untuk menerjemahkannya kedalam bahasa mesin yang masih belum menggunakan
alamat memori. Setelah itu loader/linker akan menggabungkan bahasa mesin hasil dari assembler
tersebut dengan library atau file objek yang dapat dipindahkan yang pada akhirnya menghasilkan
kode mesin absolut.
Tahapan compiler terdiri dari 6 tahap yaitu lexical analysis, syntax analysis, semantic
analysis, intermediate code generation, code optimization dan code generation. Ketiga tahap
awal disebut dengan tahap Analisis, dimana program akan dipecah menjadi bagian-bagian kecil
untuk dilakukan berbagai macam pengecekan. Sedangkan 3 tahapan lainnya disebut dengan
tahapan Sintesis dimana program yang sudah dipecah-pecah tadi akan disusun kembali menjadi
sebuah target program. Di market saat ini sudah ada beberapa macam tools yang dapat
digunakan untuk membantu pengembangan sebuah compiler, diantaranya: Scanner generator,
Parser Generator, Syntax-Directed Translation Engine, Data Flow Engine, dan Automatic Code
Generator.
1. Aho, A.V., Ravi, S., & Ullman, J.D. (2007). Compiler : Principle, techniques and tools.
2nd. Addison-Wesley. New York. ISBN : 0321491696, Chapter 1.
2. http://tinf2.vub.ac.be/~dvermeir/courses/compilers/compilers.pdf
3. http://www.cp.eng.chula.ac.th/~piak/teaching/prolang/2013/ppt/1-intro.ppt