TEKNIK KOMPILASI
A. Sejarah
Kompilasi
Sejarah perkembangan suatu kompilator sudah dimulai
sejak lama, yaitu pada saat mulai ditemukannya komputer pada awal
1950-an. Sejak waktu tersebut teknik dan cara pembentukan suatu
kompilator telah berkembang dengan sangat pesat dan pembentukkan suatu
kompilator dapat dilakukan makin mudah. Demikian pula program bantu (tools)
untuk membuat suatu kompilator sudah dapat diperoleh sehingga pembentukan suatu
kompilator dapat dilakukan dengan cepat.
Kompilator pertama yang dibuat adalah kompilator untuk bahasa FORTRAN
yang pada saat itu dikembangkan dengan memakan sejumlah tenaga ahli yang setara
dengan pekerjaan yang dilakukan oleh 18 orang. Dengan adanya program bantu
dan tata cara pembentukan yang sistematis dan tertata dengan baik serta
pendefinisian struktur bahasa yang cermat, maka suatu kompilator untuk bahasa
yang terstruktur seperti PASCAL atau C dapat dikembangkan.
Proses kompilasi dari suatu kompilator pada dasarnya dapat dibagi
ke dalam 2 bagian utama yaitu bagian analisis dan bagian sintesis. Tahap
analisis program yang ditulis dalam bahasa sumber dibagi dan dipecah ke dalam
beberapa bagian yang kemudian akan dipresentasikan ke dalam suatu bentuk antara
dari program sumber.
Operasi-operasi yang dilakukan oleh program sumber ditentukan dan dicatat
dalam suatu struktur pohon (tree) yang disebut dengan nama pohon sintaks
(sintax tree) Dalam hal ini setiap nodal pada tree tersebut menyatakan suatu
operasi, sedangkan anak dari nodal (titik) tersebut memberikan argumen yang
diperlukan
B. Pengertian Kompilasi
Teknik Kompilasi merupakan Teknik dalam melakukan pembacaan suatu
program yang ditulis dalam bahasa sumber, kemudian diterjemahkan ke dalam suatu
bahasa lain yang disebut bahasa sasaran. Dalam melakukan proses penerjemahan
tersebut, sudah barang tentu kompilator akan melaporkan adanya
keanehan-keanehan atau kesalahan yang mungkin ditemukannya. Proses penerjemahan
yang dilakukan oleh kompilator ini disebut proseskompilasi (compiling).
Bila dipandang sepintas lalu, maka akan timbul beranekaragam
kompilator yang dapat dibuat antara lain sebagai berikut :
- Bahasa Sumber seperti bahasa FORTRAN, PASCAL, C dan juga bahasa-bahasa lainnya yang sifat dan pemakaiannya agak spesifik atau khusus, seperti bahasa untuk program DBASE, SPSS dan lain sebagainya.
- Bahasa Sasaran dapat berupa bahasa sumber lain seperti C, FORTRAN dan lain sebagainya atau Bahasa Mesin (Machine Language) yang digunakan oleh suatu prosessor mikro atau sumber komputer besar maupunkomputer super
Secara umum proses dalam tahap
analis terdiri dari 3 bagian utama, yaitu :
- Proses analisis leksikal
- Proses analisis sintaktik
- Proses analisis semantik
Tahap sintesis yang berikutnya
program sasaran dibentuk berdasarkan representasi antara yang dihasilkan
pada tahap analisis.
Untuk tahap sintetis terdiri dari
2 bagian utama, yaitu
- Proses yang menghasilkan kode (code generator)
- Proses optimasi kode (code optimizer)
C. Tahap–tahap Kompilasi
Kompilator (compiler) adalah sebuah program
yang membaca suatu program yang ditulis dalam suatu bahasa sumber (source
language) dan menterjemah-kannya ke dalam suatu bahasa sasaran (target language).
Proses kompilasi
dikelompokan ke dalam dua kelompok besar:
1. Tahap Analisa (Front-end)
:Menganalisis source code dan memecahnya
menjadi bagian-bagian dasarnya. Menghasilkan kode level menengah dari source
code input yang ada.
2. Tahap Sintesa (Back-end)
: membangun program sasaran yang diinginkan dari bentuk antara.
Tahap-tahap
yang harus dilalui pada saat mengkompilasi program, yaitu:
1. Analisa Leksikal
2. Analisa Sintaks Tahap analisa (front-end)
3. Analisa Semantik
4. Pembangkit Kode Antara
5. Code
optimization Tahap sintesa (back-end)
-
Analisa
Leksikal (scanner)
Berfungsi memecah teks program sumber menjadi
bagian-bagian kecil yang mempunyai satu arti yang disebut token, seperti :
konstanta, nama variabel, keyword, operator.
- Analisa Sintaks(parser)
Berfungsi mengambil program sumber (sudah
dalam bentuk barisan token) dan menentukan kedudukan masing-masing token
berdasarkan aturan sintaksnya dan memeriksa kebenaran dan urutan kemunculan
token.
-
Analisa Semantik
Berfungsi menentukan validitas
semantiks/keberartian program sumber. Biasanya bagian ini digabung dengan Pembangkit kode antara (intermediate code
generator).
-
Pembangkit
Kode Antara
Berfungsi membangkitkan kode antara.
-
Code
optimation
Berfungsi mengefisienkan kode antara yang
dibentuk.
-
Code generator
Berfungsi membangkitkan kode program target
dalam bahasa target yang ekivalen dengan bahasa sumber .
-
Symbol
table management
Berfungsi mengelola tabel simbol selama
proses kompilasi. Tabel simbol adalah struktur data yang memuat record untuk
tiap identifier dengan atribut-atribut identifier itu.
-
Penangan
Kesalahan (Error handler)
Berfungsi menangani kesalahan yang
berlangsung selama proses kompilasi.
Contoh
:
pernyataan pemberian nilai (assignment)
: position
:= initial + rate * 60
D. Analisis Leksikal
Analisis
Leksikal/Analisis Linier/Pembacaan Sekilas (Scanner). Dalam kaitan ini aliran
karakter yang membentuk program sumber dibaca dari kiri ke kanan dan
dikelompokkan dalam apa yang disebut token yaitu barisan dari karakter yang
dalam suatu kesatuan mempunyai suatu arti tersendiri..
Analisis ini
melakukan penerjemahan masukan menjadi bentuk yang lebih berguna untuk
tahap-tahap kompilasi berikutnya. Analisis Leksikal merupakan antarmuka antara
kode program sumber dan analisis sintaktik (parser). Scanner melakukan
pemeriksaan karakter per karakter pada teks masukan, memecah sumber program
menjadi bagian-bagian disebut Token. Analisis Leksikal mengerjakan
pengelompokkan urutan-urutan karakter ke dalam komponen pokok: identifier,
delimeter, simbol-simbol operator, angka, keyword, noise word, blank, komentar,
dan seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada
Analisis Sintaktik.
Model dasar untuk membentuk suatu Analisis Leksikal adalah Finite-State Automata, 2 aspek penting pembuatan Analisis Leksikal adalah:
Model dasar untuk membentuk suatu Analisis Leksikal adalah Finite-State Automata, 2 aspek penting pembuatan Analisis Leksikal adalah:
· Menentukan token-token bahasa.
· Mengenali token-token bahasa dari program sumber.
Token-token
dihasilkan dengan cara memisahkan program sumber tersebut dilewatkan ke parser.
Analisis Leksikal harus mengirim token ke parser. Untuk mengirim token, scanner
harus mengisolasi barisan karakter pada teks sumber yang merupakan 1 token
valid. Scanner juga menyingkirkan informasi seperti komentar, blank,
batas-batas baris dan lain-lain yang tidak penting (tidak mempunyai arti) bagi
parsing dan Code Generator.
Scanner juga harus
dapat mengidentifikasi token secara lengkap dan membedakan keyword dan
identifier. Untuk itu scanner memerlukan tabel simbol. Scanner memasukkan
identifier ke tabel simbol, memasukkan konstanta literal dan numerik ke tabel
simbol sendiri setelah konversi menjadi bentuk internal.
Analisis Leksikal
merupakan komponen kompilasi independen yang berkomunikasi dengan parser lewat
antarmuka yang terdefinisi bagus dan sederhana sehingga pemeliharaan analisis
leksikal menjadi lebih mudah dimana perubahan-perubahan terhadap analisis
leksikal tidak berdampak pada pengubahan kompilator secara keseluruhan. Agar
dapat memperoleh fitur ini, maka antarmuka harus tidak berubah. Kebanyakan kode
yang menyusun analisis leksikal adalah sama untuk seluruh kompilator, tidak
peduli bahasa.
Pada analisis
leksikal yang dituntun tabel (table-driven lexical analyzer), maka satu-satunya
yang berubah adalah tabel itu sendiri. Kadang diperlukan interaksi analisis leksikal
dan analisis sintaktik yang lebih kompleks. Sehingga analisis leksikal harus
dapat menganggap string sebagai token bertipe, bukan identifier. Untuk itu
perlu komunikasi
tingkat lebih
tinggi yang biasanya dilakukan suatu struktur data dipakai bersama seperti
tabel simbol. Analisis Sintaktik dapat memasukkan string ke tabel simbol,
mengidentifikasi sebagai Type atau typedef, sehingga analisis leksikal dapat
memeriksa tabel simbol untuk menentukan apakah lexeme adalah tipe token atau
identifier.
E. Tugas-tugas Analsis Leksikal
Tugas-tugas
Analisis leksikal antara lain sebagai berikut :
1.
Konversi Program Sumber Menjadi Barisan Token. Mengubah
program sumber yang dipandang sebagai barisan byte/karakter menjadi token.
2.
Menangani Kerumitan Sistem Masukkan/Keluaran. Karena
analisis leksikal biasanya berhubungan langsung dengan kode sumber yang
diwadahi file, maka analisis leksikal juga bertindak sebagai benteng untuk
komponen-komponen lain di kompilator dalam mengatasi keanehan-keanehan sistem
masukkan/keluaran sistem operasi dan sistem komputer.
Optimasi perlu
dilakukan agar analisis leksikal membaca karakter degan sekaligus membaca
sejumlah besar bagian file. Perangkat masukkan/keluaran benar-benar diisolasi
agar tidak terlihat oleh parser dan komponen-komponen kompilator yang lain.
F. 2.2.2 Tugas-tugas
tambahan Analisis Leksikal
Tugas-tugas tambahan Analisis Leksikal
antara lain sebagai berikut :
1.
Penghilangan komentar dan whitespace (tab,spasi,karakter
lainnya).Tindakan housekeeping dilakukan scanner sehingga mengisolasikan dari
parser dan komponen-komponen kompilator lain.
Peran ini
menyederhanakan perancangan parser (dan grammar bahasa pemrograman). Scanner
juga mencatat nomor baris saat itu sehingga penanganan kesalahan yang cerdas
dapat mengirim pesan kesalahan dengan lebih akurat.
2.
Konversi literal/konstanta numerik menjadi tipe data
tertentu. Analisis leksikal dapat mengirim token, dan nilainya. Nilai ini biasa
disebut atribut. Namun demikian, bila analisis leksikal ditambahin dengan
tugas-tugas tambahan yang terlalu banyak juga akan menjadi tidak baik. Karena
itu membatasi analisis
leksikal hanya
untuk melakukan tugas pengenalan pola token (ditambah membuang komentar) adalah
mempermudah pemeliharaan.
G. Tahap-tahap Pelaksanaan Analisis Leksikal
Tahap Pelaksanaan Analisis Leksikal
antara lain sebagai berikut :
1. Pada single one pass.
Terjadi interaksi antara scanner dan
parser. Sacnner dipanggil saat parser memerlukan token berikutnya. Pendekatan
ini lebih baik karena bentuk internal program sumber yang lengkap tidak perlu
dibangun dan disimpan di memori sebelum parsing dimulai.
2. Pada separate pass.
Scanner memproses secara terpisah,
dilakukan sebelum parsing. Hasil scanner disimpan dalam file. Dari file
tersebut, parsing melakukan kegiatannya.
Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token, bukan nilai-nilai string. Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat lebih efisien bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata dengan panjang variabel.
Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token, bukan nilai-nilai string. Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat lebih efisien bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata dengan panjang variabel.
H. Implementasi Analisis Leksikal
Implementasi
Analisis Leksikal antara lain sebagai berikut :
1. Pengenalan Token.
a. Scanner harus dapat mengenali token
b. Terlebih dahulu dideskripsikan token-token yang harus
dikenali
2. Pendeskripsian Token.
a. Menggunakan reguler grammar. Menspesifikasikan
aturan-aturan pembangkit token-token dengan kelemahan reguler grammar
menspesifikasikan token berbentuk pembangkit, sedang scanner perlu bentuk
pengenalan.
b. Menggunakan ekspresi grammar. Menspesifikasikan
token-token dengan ekspresi reguler.
c. Model matematis yang dapat memodelkan pengenalan adalah
finite-state acceptor (FSA) atau finite automata.
Implementasi Analisis Leksikal sebagai
Finite Automata.
Pada pemodelan analisis leksikal
sebagai pengenal yang menerapkan finite automata, analisis leksikal tidak cuma
hanya melakukan mengatakan YA atau TIDAK. Dengan demikian selain pengenal, maka
analisis leksikal juga melakukan aksi-aksi tambahan yang diasosiasikan dengan
string yangsedang diolah.
Analisis leksikal dapat dibangun dengan
menumpangkan pada konsep pengenal yang berupa finite automata dengan cara
menspesifikasikan rutin-rutin (aksi-aksi) tertentu terhadap string yang sedang
dikenali.
Penanganan Kesalahan di Analisis
Leksikal Hanya sedikit kesalahan yang diidentifikasi di analisis leksikal
secara mandiri karena analisis leksikal benar-benar merupakan pandangan sangat
lokal terhadap program sumber.
Bila ditemui situasi dimana analisis
leksikal tidak mampu melanjutkan proses karena tidak ada pola token yang cocok,
maka terdapat beragam alternatif pemulihan. yaitu:
1.
"Panic mode" dengan menghapus karakter-karakter
berikutnya sampai analisis leksikal menemukan token yang terdefinisi bagus
2.
Menyisipkan karakter yang hilang
3.
Mengganti karakter yang salah dengan karakter yang benar
4.
Mentransposisikan 2 karakter yang bersebelahan.
Salah satu cara untuk menemukan
kesalahan-kesalahan di program adalah menghitung jumlah transformasi kesalahan
minimum yang diperlukan untuk mentransformasikan program yang salah menjadi
program yag secara sintaks benar.
I. Analisis Semantik
Disini dilakukan
pengecekan pada struktur akhir yang telah diperoleh dan diperiksa kesesuainnya
dengan komponen program yang ada. Merupakan pusat dari tahapan translasi,
struktur sintaktik yang dikenali oleh Analisis Sintaktik diproses, dan struktur
objek eksekusi sudah mulai dibentuk. Analisis Semantik kemudian menjadi
jembatan antara analisis dan sintesis dari translasi.
Analisis Semantik
menghasilkan suatu kode objek yang dapat dieksekusi dalam translasi sederhana,
tetapi biasanya bentuk dari kode objek yang dapat dieksekusi ini merupakan
bentuk internal dari final program eksekusi, yang kemudian dimanipulasi oleh
tahap optimisasi dari translator sebelum akhirnya kode eksekusi benar-benar
dihasilkan.
J. Analisis Sintaktik
Analisis Sintaktik/Analisis
Hirarki/Parsing. Dalam tahap ini karakter atau token yang diperoleh pada
analisis leksikal disusun dan dikelompokkan dalam suatu hirarki tertentu yang
secara keseluruhan mempunyai arti tertentu..
Disinilah struktur program yang lebih
besar diidentifikasi (statement, deklarasi, ekspresi, dan lainnya) menggunakan
token leksikal yang dihasilkan Analisis Leksikal.
Analisis Sintaktik selalu bekerja
bergantian dengan Analisis Semantik.
1. Pertama, Analisis Sintaktik mengidentifikasikan urutan
Token Leksikal seperti ekspresi, statement, subprogram, dan lainnya.
2. Analisis Semantik kemudian dipanggil untuk proses unit
ini.
Analisis Sintaktik berfungsi
menghasilkan pohon sintaks program sumber yang didefinisi grammar. Simbol
terminal pohon sintaks adalah token-token yang dihasilkan scanner. Sebelum
akhirnya kode eksekusi benar-benar dihasilkan.
K. Code Generation
Code
Generator/Pembentukan Kode. Dimana dalam tahap ini dibentuk antara dari bahasa
sumber yang berupa suatu pohon sintaks diterjemahkan ke dalam suatu bahasa
assembler atau bahasa mesin.
Bentuk antara yang
diperoleh biasanya merupakan suatu perintah 3 alamat atau suatu kuadrupel
(3-address code atau quadruples), sedangkan bahasa mesin yang dihasilkan adalah
suatu bahasa assembler yang merupakan suatu perintah 1 alamat, 1 akumulator.
L. Code Optimizer
Code
Optimizer/Optimasi Kode. Hasil pembentukan kode yang diperoleh kemudian dibuat
kompak lagi dengan melakukan beberapa teknik optimasi supaya dapat diperoleh
program yang lebih efesien.
Dalam hal ini
dilakukan beberapa hal seperti pendeteksian suatu ekspresi yang sering terjadi,
sehingga pengulangan tidak perlu terjadi dan lain sebagainya.
Tidak ada komentar:
Posting Komentar