MAKALAH
TEKNIK
KOMPILASI
Oleh:
MUHAMAD
NURFUAD
STT
POMOSDA
(SEKOLAH
TINGGI TEKNOLOGI)
Pondok Modern
Sumber Daya At-Taqwa
Jln. KH. Wachid Hasyim No. 312 Pomosda.
Tanjunganom-Nganjuk
KATA PENGANTAR
Puji syukur kami panjatkan kehadirat Allah
SWT. yang telah memberikan rahmat
hidayah serta inayah-Nya kepada kami sehingga kami berhasil menyelesaikan
Makalah ini yang alhamdulillah tepat pada waktunya.
Makalah ini berisikan penjelaasan tentang teknik komplikasi yang digunakan untuk melakukan pembacaan suatu source program. atau yang lebih khususnya membahas tentang yang ditulis dalam bahasa sumber, misalnya Pascal, kemudian diterjemahkan ke dalam suatu bahasa lain yang disebut bahasa sasaran atau bentuk yang dapat dieksekusi secara langsung dari sistem operasi yang tersedia dalam suatu komputer, karakteristik sertas perspektif tekknik kompilasi ini diharapkan kita semua bisa memahami struktur compiler pada teknik kompilasi.
Makalah ini berisikan penjelaasan tentang teknik komplikasi yang digunakan untuk melakukan pembacaan suatu source program. atau yang lebih khususnya membahas tentang yang ditulis dalam bahasa sumber, misalnya Pascal, kemudian diterjemahkan ke dalam suatu bahasa lain yang disebut bahasa sasaran atau bentuk yang dapat dieksekusi secara langsung dari sistem operasi yang tersedia dalam suatu komputer, karakteristik sertas perspektif tekknik kompilasi ini diharapkan kita semua bisa memahami struktur compiler pada teknik kompilasi.
Memang teori tersebut sangat diperlukan,
tetapi agar matakuliah tehnik kompilasi tidak terkesan angker. Maka makalah ini
dibuat sedemikian rupa sehingga para pembaca merasa nyaman
mempelajarinya.
Kami menyadari bahwa makalah ini masih jauh dari sempurna, oleh karena itu kritik dan saran dari semua pihak yang bersifat membangun selalu kami harapkan demi kesempurnaan makalah ini.
Akhir kata, kami sampaikan terima kasih kepada semua pihak yang telah berperan serta dalam penyusunan makalah ini dari awal sampai akhir. Semoga Allah SWT senantiasa meridhai segala usaha kita. Amin.
Tanjunganom, 10 Des 2013
Penulis
Daftar Isi
Kata Pengantar....................................................................................................................
Daftar Isi...............................................................................................................................
I. Pendahuluan..................................................................................................................
II. Analisis Leksikal
2.1
Pengertian............................................................................................................
2.2 Tugas-tugas Analisis
Leksikal............................................................................
2.3 Tugas-tugas Tambahan
Analisis Leksika............................................................
2.4 Tahap Pelaksanaan
Analisis Leksikal..................................................................
2.5 Implementasi Analisis
Leksikal..........................................................................
2.6 Input Buffering....................................................................................................
III. Analisis Semantik.........................................................................................................
IV. Analisis Sintaktik........................................................................................................
V. Code Generation..........................................................................................................
VI. Code Optimizer ...........................................................................................................
VII. Intermedia Code.........................................................................................................
VIII. Praposesor..................................................................................................................
IX. Singgle One Pass.........................................................................................................
X. Sintaks..........................................................................................................................
XI. Token............................................................................................................................
Daftar Pustaka.....................................................................................................................
TEKNIK KOMPILASI
I. Pendahuluan
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 proses kompilasi
(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 maupun komputer super.
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
Secara umum proses dalam tahap analis
terdiri dari 3 bagian utama, yaitu :
1. Proses analisis
leksikal
2. Proses analisis sintaktik
3. 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
4. Proses yang menghasilkan
kode (code generator)
5. Proses optimasi kode
(code optimizer)
Sebelum Bahasa sasaran dapat dihasilkan,
dalam melakukan ini tiap bagian utama akan berhubungan dan berkomunikasi dengan
suatu berkas tabel yang disebut tabel simbol (symbol table) yaitu suatu tabel
yang berisi semua simbol yang digunakan dalam bahasa sumber. Selain kompilator
masih diperlukan beberapa program lainnya sebelum dapat dibentuk bahasa sasaran
yang dapat dijalankan. Seperti suatu bahasa sumber dapat dituliskan dalam
beberapa modul yang terpisah dan disimpan dalam beberapa file yang terpisah.
Untuk menanggulangi hal ini, maka suatu
program khusus yang disebut dengan suatu praprosesor digunakan untuk
mengumpulkan modul-modul yang saling lepas ini ke dalam suatu program baru.
Praposesor dapat pula melengkapi singkatan-singkatan atau ungkapan-ungkapan
maupun kependekan-kependekan yang digunakan dalam bahasa sumber seperti pendef.
Proses kompilasi
dapat digambarkan melalui sebuah kotak hitam (black box) berikut :
program sumber kompilator bahasa sasaran
pesan-pesan kesalahan
(error
messages)
Proses kompilasi
dikelompokkan ke dalam dua kelompok besar :
1. analisa :
program sumber dipecah-pecah dan dibentuk menjadi bentuk antara (inter-mediate representation)
2. sintesa
: membangun program sasaran yang diinginkan dari bentuk antara
Fase-fase proses
sebuah kompilasi adalah sebagai berikut :
program sumber
penganalisa leksikal
(scanner)
penganalisa sintaks
(parser)
pengelola tabel simbol
penganalisa semantik penanganan kesalahan
pembangkit
kode
antara
pengoptimal kode
pembangkit kode
bahasa sasaran
Program sumber
merupakan rangkaian karakter. Berikut ini hal-hal yang dilakukan oleh setiap
fase pada proses kompilasi terhadap program sumber tersebut :
1. Penganalisa leksikal : membaca program sumber,
karakter demi karakter. Sederetan (satu atau lebih) karakter dikelompokkan menjadi
satu kesatuan mengacu kepada pola
kesatuan kelompok karakter (token) yang ditentukan dalam bahasa sumber. Kelompok karakter yang
membentuk sebuah token dinamakan lexeme
untuk token tersebut. Setiap token yang dihasilkan disimpan di dalam tabel simbol. Sederetan karakter yang
tidak mengikuti pola token akan dilaporkan sebagai token tak dikenal (unidentified
token).
Contoh : Misalnya pola token untuk identifier I adalah : I = huruf(huruf½angka)*. Lexeme ab2c dikenali
sebagai token sementara lexeme 2abc atau
abC tidak dikenal.
2. Penganalisa sintaks : memeriksa kesesuaian pola deretan token dengan aturan sintaks
yang ditentukan dalam bahasa sumber.
Sederetan token yang tidak mengikuti aturan sintaks akan dilaporkan sebagai kesalahan sintaks (sintax error). Secara logika deretan token yang bersesuaian dengan
sintaks tertentu akan dinyatakan sebagai pohon parsing (parse tree).
Contoh : Misalnya sintaks untuk ekspresi if-then E adalah : E ® if L then, L ® IOA, I = huruf(huruf½angka)*, O ® <½=½>½<=½>=, A ® 0½1½...½9.
Ekspresi if a2 < 9 then adalah ekspresi sesuai sintaks;
sementara ekspresi if a2 < 9 do atau if then a2B < 9 tidak
sesuai. Perhatikan bahwa contoh ekspresi terakhir juga mengandung token yang
tidak dikenal.
3. Penganalisa semantik : memeriksa token dan
ekspresi dari batasan-batasan yang ditetapkan. Batasan-batasan tersebut
misalnya :
a. panjang maksimum token identifier
adalah 8 karakter,
b.
panjang maksimum ekspresi tunggal adalah 80 karakter,
c. nilai bilangan bulat adalah -32768 s/d 32767,
d. operasi aritmatika harus melibatkan operan-operan
yang bertipe sama.
4. Pembangkit kode antara : membangkitkan kode
antara (intermediate code)
berdasar-kan pohon parsing. Pohon parse selanjutnya diterjemahkan oleh suatu
penerjemah yang dinamakan penerjemah
berdasarkan sintak (syntax-directed
translator). Hasil penerjemahan ini biasanya merupakan perintah tiga alamat (three-address
code) yang merupakan representasi program untuk suatu mesin abstrak. Perintah tiga alamat bisa berbentuk quadruples (op, arg1, arg2, result), tripels
(op, arg1, arg2). Ekspresi dengan
satu argumen dinyatakan dengan menetapkan arg2
dengan - (strip, dash)
5. Pengoptimal kode : melakukan optimasi
(penghematan space dan waktu komputasi), jika mungkin, terhadap
kode antara.
6. Pembangkit kode : membangkitkan kode dalam bahasa
target tertentu (misalnya bahasa mesin).
Berikut ini akan
diberikan sebuah contoh skema penerjemahan suatu ekspresi dalam bahasa sumber,
yaitu : position := initial + rate * 60.
position
:= initial + rate * 60
penganalisa leksikal pembangkit
(scanner) kode
antara
id1
:=
id2 + id3 *
60 temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
penganalisa sintaks id1 := temp3
(parser )
pengoptimal kode
: =
id1 +
id2 *
id3
60 temp1
:= id3 * 60.0
id1 := id2 + temp1
penganalisa semantik
pembangkit kode
MOVF
id3, R2
:= MULF
#60.0, R2
id1 + MOVF id2, R1
id2 * ADDF R2, R1
id3
inttoreal MOVF
R1, id1
60
Keterangan
:
- id adalah token untuk identifier. Tiga lexeme untuk
token ini adalah position, initial, dan rate.
- penganalisa
semantik secara logika membangkitkan pohon parse.
- penganalisa semantik mendeteksi mismatch type. Perbaikan dilakukan dengan memang-gil procedure inttoreal yang mengkonversi
integer ke real.
- quadruples dari : temp2 := id3 * temp1 adalah (*,id3,temp1,temp2), id1 := temp3 adalah (assign,temp3,-,id1), temp1
:= inttoreal(60) adalah (inttoreal,60,-,temp1).
- pembangkit
kode dalam contoh ini menghasilkan kode dalam bahasa mesin.
II. Analisis Leksikal
2.1 Pengertian
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.
2.2 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.
2.3 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.
2.4 Tahap-tahap Pelaksanaan
Analisis Leksikal
Tahap Pelaksanaan Analisis Leksikal antara
lain sebagai berikut :
ü 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.
ü 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.
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.
2.5 Implementasi Analisis
Leksikal
Implementasi Analisis Leksikal antara lain
sebagai berikut :
ü Pengenalan Token.
1. Scanner harus dapat
mengenali token
2. Terlebih dahulu
dideskripsikan token-token yang harus dikenali
ü Pendeskripsian Token.
1.
Menggunakan reguler grammar. Menspesifikasikan
aturan-aturan pembangkit token-token dengan kelemahan reguler grammar
menspesifikasikan token berbentuk pembangkit, sedang scanner perlu bentuk
pengenalan.
2. Menggunakan ekspresi
grammar. Menspesifikasikan token-token dengan ekspresi reguler.
3. 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.
2.6 Input Buffering
Perancangan analisis leksikal seharusnya
dapat membuat buffering masukkan yang membantu mempercepat proses pembacaan
dari file serta mempunyai fleksibelitas yang tinggi agar analisis leksikal
tidak bergantung platform sehingga mempunyai portabilitas yang tinggi.
III. 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.
IV. 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.
Analisis Sintaktik selalu bekerja bergantian dengan Analisis Semantik.
ü Pertama, Analisis
Sintaktik mengidentifikasikan urutan Token Leksikal seperti ekspresi, statement,
subprogram, dan lainnya.
ü 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.
V. 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.
VI 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.
VII. Intermediate Code
Generator
Intermediate code adalah representasi perantara antara
bentuk bahasa tingkat tinggi dengan bahasa mesin. Karena pada level berikutnya
masih akan dilakukan optimasi, maka perlu dibuat representasi yang memudahkan
optimasi, yang bukan merupakan bahasa mesin.
temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3
VIII. Praposesor
Praposesor adalah suatu program khusus menanggulangi terjadinya beberapa
modul yang terpisah saat melakukan penulisan bahasa sumber menjadi beberapa file
ke dalam suatu program baru.
Suatu Praposesor menghasilkan suatu input bagi suatu kompilator. Hal ini
mungkin dilakukan oleh suatu kompilator antara lain:
ü Pemroses Makro.
Makro yang merupakan kependekan dari suatu
bagian program yang lebih panjang memungkinkan penulis program untuk memperpendek
program yang ditulisnya.
Dalam hal ini perlu dilakukan dua hal
yaitu :
1. Mendefinisikan makro
yang digunakan.
Parameter yang didefinisikan pada makro
disebut dengan parameter formal
2. Melakukan pemanggilan
makro yang mungkin juga mengandung beberapa parameter. Sedangkan parameter yang
digunakan untuk memanggil makro disebut dengan paramater aktual.
ü Pengikutsertaan
berkas (File Inclusion).
Suatu Praprosesor memungkinkan
diikutsertakannya beberapa berkas program yang telah ditulis sebelumnya ke
dalam program yang sedang ditulis.
Biasanya berkas program yang ditulis sebelumnya merupakan segmen program yang sekali digunakan, banyak manfaatnya dan sering terjadi sudah merupakan bagian dari sistem bahasa yang digunakan.
Biasanya berkas program yang ditulis sebelumnya merupakan segmen program yang sekali digunakan, banyak manfaatnya dan sering terjadi sudah merupakan bagian dari sistem bahasa yang digunakan.
Misalnya pada bahasa C, isi dari berkas global.h dapat
diikutsertakan dalam program yang sedang ditulis dengan menggunakan perintah
#include global.h
ü Praposesor Rasional.
Praprosesor ini memberikan kemampuan baru
dari suatu bahasa dengan fasilitas pengendalian aliran (flow-of-control) atau
struktur data yang lebih baik.
Misalnya dengan menambahkan kemampuan perintah while,
if-then-else pada bahasa yang pada mulanya tidak mempunyai fasilitas tersebut.
Hal ini biasanya dilakukan dengan menggunakan makro yang sudah ada dalam bahasa tersebut.
Hal ini biasanya dilakukan dengan menggunakan makro yang sudah ada dalam bahasa tersebut.
ü Perluasan Bahasa.
Praprosesor ini memungkinkan suatu bahasa
untuk berinteraksi dengan sistem atau bahasa lainnya.
Misalnya pada bahasa C yang ditambahkan kemampuannya untk
dapat mengakses data dalam suatu database.
Untuk itu praprosesor memungkinkan
menggunakan tanda ## yang menyatakan bahwa bagian ini bukan merupakan bagian
dari bahasa C, tetapi berhubungan dengan sistem suatu paket database lain yang
sudah baku.
Dengan demikian bagian ini akan
diterjemahkan kedalam pemanggilan procedure untukmelakukan akses database.
IX. Single One Pass
Single One
Pass adalah Suatu kompilator dapat dibuat hanya dengan
melakukan 1 kali pembacaan program sumber. Tetapi kompilator yang demikian
biasanya tidak dapat melakukan optimasi kode dengan baik.
Namun demikian kebanyakan kompilator untuk bahasa yang terstruktur
melakukan beberapa kali pembacaan untuk :
ü dapat melakukan
deteksi kesalahan
ü menemukan kembali kesalahan
yang telah diperoleh
ü melakukan proses
debugging
Rancangan kompilator ini dimaksudkan untuk menerjemahkan suatu ekspresi
matematika yang ditulis dalam notasi infix menjadi notasi yang ditulis dalam
notasi postfix.
Penekanan yang diberikan hanya pada bagian depan dari proses kompilasi yang
dilakukan yaitu:
ü Analisis Leksikal
ü Penguraian (parser)
ü Pembentukan Kode
Antara
Suatu penerjemahan berdasarkan sintaks merupakan kombinasi dari proses
Analisis Leksikal dan Pembentuk Kode Antara
X. Sintaks
Pendefisian Sintaks suatu bahasa dilakukan
dengan menggunakan suatu notasi tata bahasa bebas konteks (context-free
grammar) atau untuk memudahkan disebut tata bahasa saja.
Suatu tata bahasa secara alamiah menerangkan struktur hirarki dari banyak
bentuk bahasa pemrograman. Misalkan perintah if-else dari bahasa C mempunyai
bentuk:
if
(ekspresi) perintah else perintah
Ket :
Dalam hal ini suatu perintah adalah gabungan dari :
ü kata kunci if
ü kurung buka
ü ekspresi
ü kurung tutup
ü perintah
ü kata kunci else
ü perintah lainnya
(Dalam bahasa C tidak ada kata kunci
then).
Bila digunakan nama variabel expr untuk menyatakan suatu ekspresi dan
variabel stmt untuk menyatakan suatu perintah, maka struktur aturan ini dapat
dinyatakan sebagai berikut :
stmt → if (expr) stmt else stmt
Ket:
→ (tanda panah dibaca sebagai) "Dapat berbentuk suatu".
Aturan diatas disebut juga suatu produksi (production). Dalam suatu
produksi seperti ini unsur leksikal seperti kata kunci if dan tanda kurung
"(",")" disebut suatu token
Variabel seperti expr dan stmt disebut dengan non-terminal.
Secara lengkap suatu tata bahasa bebas konteks dapat mempunyai 4 komponen
berikut:
ü Himpunan dari token
yang dikenal dengan simbol token.
ü Himpunan dari unsur
non-terminal
ü Himpunan dari
produksi, di mana masing-masing produksi terdiri dari unsur non-terminal
(bagian kiri tanda panah dari suatu produksi). Bagian kanan produksi berupa →
(tanda panah) dan barisan dari token dan/atau non-terminal (sebelah kanan tanda
panah).
ü Salah satu unsur
non-terminal yang telah ditentukan sebagai awal tata bahasa disebut sebagai simbol
awal.
Aturan umum yang digunakan dalam menentukan suatu tata bahasa adalah dengan
menuliskan produksi yang ada dengan dimulai dari produksi yang mengandung
simbol awal.
Terminal dapat berupa angka-angka, tanda-tanda seperti <=, dan rangkaian karakter yang ditulis huruf tebal seperti while dan lain-lainnya juga nama lain yang tidak dicetak miring.
Terminal dapat berupa angka-angka, tanda-tanda seperti <=, dan rangkaian karakter yang ditulis huruf tebal seperti while dan lain-lainnya juga nama lain yang tidak dicetak miring.
Non-teminal dapat berupa nama yang dicetak miring.
Untuk memudahkan penulisan, maka produksi yang mempunyai simbol non-teminal
disebelah kiri yang sama bagian kanannya dapat dikelompokkan dengan menggunakan
tanda "|" yang memisahkan pilihan bagian kanan yang ada.
pengelompokkan seperti ini dapat dibaca sebagai "atau"
Contoh 1:
9-5+2, 3-1, 7 merupakan barisan dari angka-angka yang dipisahkan oleh tanda
'+' atau '-'.
Tata bahasa berikut memberkan sintaks dari ekspresi-ekspresi di atas. Produksi yang ada adalah:
Tata bahasa berikut memberkan sintaks dari ekspresi-ekspresi di atas. Produksi yang ada adalah:
list → list + digiT
list → list – digit
list → digit
digit → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Bagian kanan dari produksi untuk unsur non-terminal list
list → list + digit
list → list – digit
list → digit
di bagian kiri dapat dikelompokkan menjadi 1 produksi yang setara, yaitu:
list → list + digit | list - digit | digit
ü Penulisan Produksi
menjadi:
list → list + digit | list -
digit | digit
digit → 0 | 1 | 2 | 3 | 4 | 5
| 6 | 7 | 8 | 9
ü Token yang menjadi
terminal digunakan adalah simbol +,-,0,1,2,3,4,5,6,7,8,9
ü Sedangkan unsur
non-terminal adalah nama-nama yang digaris miring seperti list dan digit
ü Simbol Awal adalah
produksi non-terminal list
Suatu unsur non-terminal dapat merupakan suatu produksi bila unsur
non-terminal tersebut timbul dibagian kiri dari produksi.
Barisan token adalah barisan dari nol atau lebih token. Unsur yang
mengandung nol token ditulis sebagai ε, dan disebut dengan nama barisan kosong.
Suatu bahasa diperoleh dari :
ü barisan-barisan yang
dimulai dari simbol awal
ü bagian kanan yang
masih berupa non-terminal (bukan token/terminal) dari produksi dapat diganti
dengan mencari acuan pada bagian kiri dari produksi yang ada dengan
non-terminal yang sama.
ü mengganti unsur
non-terminal pada bagian kiri produksi dengan bagian kanan dari produksi
non-terminal tersebut.
ü Barisan token pada
bagian kanan produksi yang menjadi pengganti unsur non terminal acuan pada
bagian kiri produksi merupakan akhir dalam pembentukan bahasa.
Contoh 2:
Bahasa yang didefinisikan oleh tata bahasa pada contoh 1 terdiri dari
barisan angkaangka yang dipisahkan oleh tanda '-' atau '+'.
Kesepuluh produksi dari unsur nonterminal digit (digit → 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 8 | 9) dapat digunakan sebagai penganti token-token yang
berhubungan dengan angka yaitu 0,1,2,3,4,5,6,7,8,9 dari produksi list → digit,
maka dapat dikatakan bahwa 1 angka yang berdiri sendiri adalah suatu list juga,
yaitu :
Pada produksi list → digit
0 merupakan bahasa yang dibentuk list
1 merupakan bahasa yang dibentuk list
2 merupakan bahasa yang dibentuk list
3 merupakan bahasa yang dibentuk list
4 merupakan bahasa yang dibentuk list
5 merupakan bahasa yang dibentuk list
6 merupakan bahasa yang dibentuk list
7 merupakan bahasa yang dibentuk list
8 merupakan bahasa yang dibentuk list
9 merupakan bahasa yang dibentuk list
Pada produksi lainnya
list → list + digit
list → list – digit
menyatakan bahwa list yang diikuti oleh
tanda '+' atau '-' dan diikuti oleh list akan
membentuk suatu list baru.
Ternyata semua produksi yang digunakan pada contoh 1 adalah
produksi-produksi yang diperlukan untuk dapat mendefinisikan bahasa yang
diinginkan untuk ekspresi 9-5+2, 31, 7
9-5+2 merupakan salah satu anggota dari bahasa yang dibentuk list, dimana
list adalah simbol awal. Hal ini dapat ditunjukkan sebagai berikut:
ü 9 merupakan list dari
produksi "list → digit" dimana digit membentuk 9 pada
"digit → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9"
atau secara terpisah menjadi
digit → 0
digit → 1
digit → 2
digit → 3
digit → 4
digit → 5
digit → 6
digit → 7
digit → 8
digit → 9.
ü 9-5 merupakan list
dari produksi "list → list - digit" dimana 9 sudah berupa list dan
digit membentuk 5 pada "digit → 5".
ü 9-5+2 merupakan list
dari produksi "list → list + digit" = (9-5) + 2. Dimana 9-5 sudah
berupa list dan digit membentuk 2 pada "digit → 2".
Hal ini dapat dilihat pada gambar 1
berikut ini
Gambar 1 Pohon urai dari ekspresi 9-5+2 menurut tata bahasa contoh 1
Pada gambar ini setiap nodal (titik pertemuan antar garis) pada pohon urai
diberi label salah satu simbol tata bahasa.
Nodal dalam (internal node / nodal di atas nodal yang lain) dan
anak-anaknya (nodal yang terletak di bawah nodal dalam) berhubungan dengan
suatu produksi.
Nodal dalam berhubungan dengan bagian kiri dari produksi, sedangkan
anak-anaknya berhubungan dengan bagian kanan dari produksi yang sama.
Pohon demikian disebut pohon urai dari ekspresi yang diberikan.
Contoh 3
Pada bahasa Pascal dapat dijumpai dalam cakupan blok begin-end. Salah satu
perbedaan yang sangat mencolok yang terdapat pada contoh adalah adanya list
dari perintah-perintah yang mungkin kosong diantara token-token begin dan end.
Untuk itu dikembangkan suatu tata bahasa yang mengandung produksi berikut:
block → begin opt_stmts end
opt_stmts → stmt_list | ε
stmt_list → stmt_list εstmt | stmt
Pada produksi opt_stmts, kemungkinan ke-2 bagian kanan pada "opt_stmts
→ stmt_list | ε" adalah perintah yang boleh memilih "ε", yang
mengartikan rangkaian kosong dari simbol-simbol. Jadi suatu blok dapat hanya
terdiri dari 2 token yaitu begin dan end
Pada produksi stmt_list sangat mirip dengan produksi list pada contoh 1, dimana tanda "|" menggantikan operator "+" dan "-" (list → list + digit | list - digit | digit). Unsur non-terminal stmt menggantikan unsur non-terminal digit.
Pada produksi stmt_list sangat mirip dengan produksi list pada contoh 1, dimana tanda "|" menggantikan operator "+" dan "-" (list → list + digit | list - digit | digit). Unsur non-terminal stmt menggantikan unsur non-terminal digit.
XI. Token
Token merupakan unit atau elemen dasar
bahasa komputer (seperti 'kata' di bahasa manusia), dimana unit tersebut tidak
terbagi lagi. Token merupakan bagian hasil dari pemecahan sumber program yaitu
penerjemahan lexeme pada saat melakukan scanner.
Token mereprentasikan nama :
ü identifier -> nama
variabel, fungsi, tipe atau nama yang didefinisikan pemakai.
ü Keyword
ü literal string
ü operator
ü label
ü simbol tanda ->
tanda kurung, koma, titik koma.
Daftar Pustaka
Tehnik-kompilasi.htm, Global Komputer (http://globalkomputer.com/),
2008.
Nurfarani iin, Kuis-tehnik-kompilasi (http://i2n.juve.blogspot.com/), 2008.
Analisis-Leksikal.htm, Global Komputer (http://globalkomputer.com/),
2008.
Analisis-Sintaktk.htm, Global Komputer (http://globalkomputer.com/),
2008.
Analisis-Simantik.htm, Global Komputer (http://globalkomputer.com/),
2008.
Code-Generation.htm, Global Komputer (http://globalkomputer.com/),
2008.
Code-Optimizer.htm, Global Komputer (http://globalkomputer.com/),
2008.
Praposesor.htm, Global Komputer (http://globalkomputer.com/),
2008.
Token.htm, Global Komputer (http://globalkomputer.com/),
2008.
Lexeme.htm, Global Komputer (http://globalkomputer.com/),
2008.
Singgle-One-Pass.htm, Global Komputer (http://globalkomputer.com/),
2008.
Sintaks.htm, Global Komputer (http://globalkomputer.com/),
2008.
https://www.google.com/#q=pengertian+intermediate+code+doc&safe=off
0 komentar:
Posting Komentar