Anda di halaman 1dari 15

LECTURE NOTES

Week ke - 1

Pengenalan pada Teknik Kompilasi

COMP6276 - Compilation Techniques


LEARNING OUTCOMES

Setelah mengikuti mata kuliah ini, peserta diharapkan mampu untuk:

• Menjelaskan konsep dasar dari teknik kompilasi yang mencakup fungsi, tahapan
kompilasi, komponen pada teknik kompilasi dan alat pembuat compiler

OUTLINE MATERI :

1. Evolusi Bahasa Pemrograman

2. Pemahaman tentang kompilasi

3. ”Sepupu” dari Compiler

4. Sistem pemrosesan bahasa pemrograman

5. Tahapan kompilasi

6. Contoh kompilasi

7. Alat konstruksi Compiler

COMP6276 - Compilation Techniques


ISI MATERI

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.

COMP6276 - Compilation Techniques


Gambar 1. Ilustrasi sebuah Compiler

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

Debugging Compiler merupakan jenis compiler yang akan menghasilkan informasi


debugging selama proses kompilasi.

COMP6276 - Compilation Techniques


4. Load-and-go Compiler

Sistem kompilasi load-and-go akan memproses bahasa pemrograman di mana bentuk


perantara dari program umumnya disimpan dalam RAM, dan tidak disimpan ke sistem
file.

5. Optimizing Compiler

Compiler ini akan mencoba untuk meminimalkan atau memaksimalkan beberapa atribut
dari program komputer yang dapat dieksekusi.

Sistem pemrosesan Bahasa (source language)

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.

Gambar 2. Tahapan umum pada sistem penerjemah

Sumber: Aho, A.V., Ravi, S., & Ullman, J.D. (2007)

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

COMP6276 - Compilation Techniques


menghasilkan source program yang sudah tidak mengandung makro, atau file inclusion, ataupun
language extension. Berikutnya compiler akan melakukan tugasnya untuk menerjemahkan
source code tersebut ke bahasa assembly. Setelah bahasa assembly dihasilkan maka Assembler
akan melakukan memproses bahasa assembly tersebut dan menghasilkan bahasa mesin dalam
bentuk binary code yang masih belum menggunakan alamat dari memori. Terakhir Loader/Link-
editor yang akan menggabungkan bahasa mesin yang dihasilkan dari assembler tersebut dengan
library atau file objek yang dapat dipindahkan yang pada akhirnya menghasilkan kode mesin
absolut.

Fungsi dari pre-processor

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.

Gambar 3. Contoh kerangka program dengan macro

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

COMP6276 - Compilation Techniques


perbandingan antara nilai a dan b tersebut. Ketika program ini dijalankan maka macro tersebut
akan dihapus dan digantikan langsung kedalam fungsi utama (lihat gambar 4).

Gambar 4. Hasil macro processing

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).

Gambar 5. Isi file macroCollection.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.

COMP6276 - Compilation Techniques


Gambar 6. Isi file contoh preprocessor.c

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.

Gambar 7. Hasil file inclusion

COMP6276 - Compilation Techniques


Tahapan Kompilasi

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.

Gambar 8. Tahapan Kompilasi


Sumber: Aho, A.V., Ravi, S., & Ullman, J.D. (2007)

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:

position := initial + rate * 60 ;

COMP6276 - Compilation Techniques


Dari statement pada program tersebut maka akan dihasilkan token-token seperti position
(identifier), symbol := (assignment), initial (identifier), tanda tambah + (symbol), rate
(identifier), tanda kali * (symbol), dan angka 60 (number). Sedangkan tanda “;” merupakan akhir
dari sebuah statement sehingga tidak masuk sebagai token. Contoh dari kompilasi sebuah
statement program dapat dilihat pada gambar 9.

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.

COMP6276 - Compilation Techniques


Pada gambar 8 juga terdapat symbol table management yang berfungsi untuk melakukan
pencatatan semua identifier yang digunakan pada program serta mengumpulkan semua informasi
mengenai atribut dari setiap identifier tersebut. Bentuk dari symbol table dapat berupa struct.
Selain melakukan pencatatan, terdapat juga Error Handler yang bertugas untuk mencatat
kesalahan yang terjadi selama proses kompilasi. Pada umumnya sebagian besar catatan
kesalahan dihasilkan dari tahap sintaks dan semantic analysis, tetapi juga memungkinkan pada
tahapan lainnya dapat menghasilkan kesalahan juga.

COMP6276 - Compilation Techniques


Gambar 9. Contoh proses kompilasi pada sebuah statement program

Sumber: Aho, A.V., Ravi, S., & Ullman, J.D. (2007)

COMP6276 - Compilation Techniques


Adapun beberapa tools yang dapat digunakan untuk membantu dalam pengembangan sebuah
compiler, yaitu:

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.

3. Syntax-Directed Translation Engine: tools yang dapat melakukan eksekusi dengan


menelusuri parse tree yang ada serta menghasilkan intermediate code.

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.

COMP6276 - Compilation Techniques


KESIMPULAN

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.

COMP6276 - Compilation Techniques


DAFTAR PUSTAKA

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

COMP6276 - Compilation Techniques

Anda mungkin juga menyukai