MSI
Diktat Kuliah Teknik Kompilasi
BAB 1
PENDAHULUAN
Merupakan bentuk simbolik dari bahasa mesin. Setiap kode ope-rasi memiliki
kode simbolik, misalnya ADD untuk penjumlahan (additiori) dan MUL untuk
perkalian (multiplication). Sekumpul-an instruksi dalam bahasa assembly bisa
dibentuk menjadi makr-oinstruksi. Pada bahasa assembly tersedia alat bantu
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
untuk diag-nostik atau debug yang tidak terdapat pada bahasa mesin. Con-toh
produk yang ada untuk pengembangan dan debug bahasa assembly di
pasaran saat ini, misalnya Turbo Assembler dari Borland, Macro Assembler
dari Microsoft, DEBUG ya&g-tersedia pada DOS, dan Turbo Debugger.
Instruksi dalam bahasa Assem-bly biasanya terdiri dari beberapa field,
misalnya field operasi diikuti satu atau lebih operan.
Dalam buku ini akan difokuskan pada pengembangan kompi-lator untuk bahasa
tingkat tinggi prosedural seperti Pascal.
Keuntungan bahasa tingkat tinggi dibandingkan bahasa tingkat rendah sebagai
berikut:
• kondisional (IF-THEN-ELSE)
• nested statement
Agar dapat dieksekusi, sebuah program dalam bahasa tingkat tinggi tentu saja
harus ditranslasikan ke dalam bahasa mesin. Pada bagian berikutnya akan dibahas
mengenai translator.
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
1.2 TRANSLATOR
Source code adalah bahasa assembly, object code adalah bahasa mesin.
Contohnya: Turbo Assembler dan Macro Assembler.
2. Kompilator (Compiler)
Source code adalah bahasa tingkat tinggi (misal bahasa Pascal), object code
adalah bahasa raesin atau bahasa assembly. Source code dan data diproses
pada saat yang berbeda.
Contohnya: Turbo Pascal. Proses kompilasi dapat dilihat pada gambar 1.2.
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Compile time adalah saat pengubahan source code ke object code. Run time
adalah saat eksekusi object code.
3 Interpreter
Interpreter tidak membangkitkan object code, hasil translasi hanya dalam bentuk
internal. Contoh interpreter: BASICA/GW-BASIC, LISP, SMALLTALK. Source
code dan data diproses pada saat yang sama. Proses interpretasi dapat dilihat
pada gambar 1.3.
Selanjutnya dalam buku ini akan difokuskan pada kompilator dan teknik
pengembangannya.
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
4 KOMPILATOR
1. Fungsi Analisis
BAB 2
3. Bahasa pemrograman yang sudah ada bisa menjadi sumber yang bagus untuk
perancangan bahasa pemrograman. Tetapi perlu ketelitian saat
menggunakannya, karena bahasa yang sudah ada itu mungkin mengandung
kesalahan yang serius. Beberapa fasilitas yang diinginkan bisa dibatasi untuk
meningkatkan kemudahan baca (readability) dan pemeriksaan kesalahan,
dengan mengamati bagian mana dari bahasa yang jarang digunakan. Misalnya
motivasi untuk tidak menggunakan instruksi GOTO da-tang dari pengamatan
bahwa pemrogram yang baik tidak menggunakan GOTO untuk membuat struktur
yang lebih mudah di-pahami.
Jika sebuah program sulit dimengerti oleh manusia, akan terjadi kesulitan juga
untuk memeriksa dan melakukan pemeliharaan/modifikasi. Masalah ini tidak bisa
dipecahkan dengan sekedar me-nambahkan komentar atau melalui dokumentasi
tersendiri. Pemrogram tidak suka menambahkan komentar yang berlebihan,
sementara dokumentasi program sering tidak lengkap dan sudah kadalu-warsa.
Sebuah program yang mudab dibaca/dimengerti adalah se-buah dokumentasi yang
baik. Sintaks sebuah bahasa pemrograman harus merefleksikan semantiknya.
Keterbatasan kemampuan pikir manusia menyulitkan untuk memahami suatu struktur
yang kompleks, sementara kompilator tidak, Misalkan saja algoritma manipulasi
dengan stack. Mungkin suatu statement bermakna ambigu bagi manusia, sementara
sudah cukup jelas bagi kompilator, misalnya instruksi aritmatika berikut: a/b/c
bisa berarti a dibagi dengan b, baru hasilnya
dibagi dengan c atau a dibagi dengan hasil
pembagian b dengan c
2. Pencegahan dan deteksi kesalahan
• Ekspresi logika
Dalam kasus tersebut diperlukan look-ahead parser yang mampu melihat dua
atau tiga token ke depan, sehingga memperlambat kompilasi dan menambah ukuran
tabel untuk parsing. Feature bahasa yang kompleks tapi jarang dibutuhkan lebih baik
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
tidak dimasukkan. Salah satu contoh skema yang sederhana tetapi powerful adalah
metode passing parameter dengan call by value dan call by reference. Sebisa
mungkin rancangan bahasa dibuat selengkap mung-kin sebelum masuk ke tahapan
implementasi kompilator.
6. Efisiensi
Sebuah bahasa dikatakan machine independent jika dan hanya jika sebuah
program yang telah sukses dikompilasi dan dieksekusi pada suatu mesin, saat
dipindahkan ke mesin lainnya akan berjalan dengan input dan output yang tepat sama.
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
9. Uniformity
Uniformity bisa didefinisikan sebagai mengerjakan hal yang sama dengan cara
yang sama. Bila diadopsi sebagai prinsip bahasa pemrograman, ini bisa menolong
mengurangi hal-hal yang harus diingat pemrogram, karena akan lebih mudah
memahami bagaimana suatu feature akan dilakukan. Seperti aspek-aspek yang lain,
uniformity bisa menjadi berguna atau tidak tergantung dari bagaimana penerapannya.
Suatu contoh penerapan uniformity yang berguna misalkan pemakaian ekspresi pada
ALGOL, dimanapun dibutuhkan suatu nilai aritmatika bisa digunakan ekspresi apa
pun. Contoh pe-nerapan uniformity yang tidak berguna misalnya gagasan mengenai
ekspresi dan statement pada ALGOL. Suatu bahasan dalam kasus uniformity adalah
bagaimana menghilangkan kasus khusus. Kasus-kasus khusus seperti ini memiliki
masalah:
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
10. Orthogonality
Gagasan mendasar dari orthogonality adalah setiap fungsi bekerja tanpa perlu
mengetahui struktur dari yang lain. Misalkan operasi aritmatika menggabungkan dua
nilai, tidak memperdulikan bagaimana nilai tersebut didapatkan. Alternatif untuk
orthogonality adalah diagonality.
11. Generalisasi dan spesialisasi
BAB 3
BAHASA
Pada bagian ini akan dibahas beberapa konsep pada Teori Bahasa yang akan
kita perlukan nanti. Teknik kompilasi sebenarnya bisa dianggap sebagai kelanjutan
dari konsep-konsep yang dipelajari dalam Teori Bahasa, dan dalara implementasinya
mengarnbil se-bagian dari konsep-konsep tersebut.
Tata bahasa (grammar) bisa didefinisikan secara formal sebagai kumpulan dari
himpunan-himpunan variabel, simbol-simbol terminal, simbol awal, yang dibatasi oleh
aturan-aturan produksi. Pada tahun 1959 seorang ahli bernama Noam Chomsky
melakukan penggolongan tingkatan bahasa menjadi empat, yang disebut dengan
Hirarki Chomsky. Penggolongan tersebut bisa dilihat pada tabel berikut:
Bahasa Mesin otomata Batasan Aturan Produksi
Regular / Tipe 3 Finite State Automata α adalah sebuah simbol variabel
(FSA) meliputi
Deterministic Finite β maksimal memiliki sebuah simbol
Automata (DFA) & variabel yang bila ada terletak di
Non-deterministic Finite posisi paling kanan
Automata (NFA)
Bebas Konteks / Push Down Automata α berupa sebuah simbol variabel
Context Freel Tipe ('PDA)
2
Context Sensitive/ Linier Bounded Automata |α|≤β
Tipe 1
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
T→α
E →T+E
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Bahasa manusia/ bahasa alami termasuk ke dalam grammar (tata bahasa) Tipe
0/Unrestricted, di mana tidak ada batasan pada aturan produksinya. Misalkan saja:
Abc → De
Pada bahasa Context Sensitive, panjang string pada ruas kiri ≤ panjang ruas
kanan ( | α | ≤ |β | ). Contoh aturan produksi yang context sensitive:
Ab→DEF
CD →eF.
Perhatikan aturan produksi seperti:
S →e
Pada bahasa bebas konteks, batasannya bertambah lagi dengan ruas kiri
haruslah tepat satu simbol variabel. Misalnya:
B →CDeFg
D →BcDe
Bahasa bebas konteks menjadi dasar dalam pembentukan suatu parser/ proses
analisis sintaksis. Bagian sintaks dalam suatu kompilator kebanyakan didefinisikan
dalam tata bahasa bebas konteks (context free grammar), yang dideskripsikan secara
formai dengan notasi BNF (Backus Naur Form atau Backus Normal Form).
Pada bahasa regular, batasannya bertambah dengan ruas kanan maksimal
memiliki sebuah simbol variabel yang terletak di paling kanan. Artinya bisa memiliki
simbol terminal saja dalam jumlah tidak dibatasi, tetapi bila terdapat simbol variabel,
maka simbol variabel tersebut hanya berjumlah 1 (satu) dan terletak di posisi paling
kanan. Misal:
A →e
A→efg
A→efgH
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
C→D
Bisa kita lihat, batasannya makin bertambah dari Tipe 0 ke Tipe 3. Berdasarkan
keterkaitannya antar tipe bahasa tersebut, bisa pula dilihat secara sederhana pada
gambar 3.1.
*Perhatikan:
ε→Abd
bukan aturan produksi yang legal, karena simbol ε tidak boleh berada pada ruas kiri
Aturan produksi yang ruas kirinya hanya memuat simbol terminal saja, seperti
a →bd
ab→bd
bukan aturan produksi yang legal (untuk unrestricted grammar sekalipun),
karena ruas kiri harus juga memuat simbol yang bisa di-turunkan, sementara contoh
di atas ruas kiri hanya terdiri dari sim-bol terminal saja padahal sesuai definisinya
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
simbol terminal sudah tidak bisa diturunkan lagi, berbeda dengan aturan produksi
seperti
aA →bd
contoh:
E →T | T+E | T-E,T→α
Notasi BNF:
E ::= <T> \ <T> + <E> | <T> - <E>, T ::= a
BAB 4
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
ANALISIS LEKSIKAL
4. Mengirimkan token
6. Menangani kesalahan
Scanner bekerja berdasarkan mesin Finite State Automata yang ada pada
Bahasa Regular. Untuk membantu mengkonstruksi Scanner dapat mempergunakan
Diagram Keadaan.
1. Identifier
Bisa berupa keywords atau nama. Keywords adalah kata kunci yang sudah
didefinisikan oleh suatu bahasa seperti BEGIN, END, IF, ELSE di dalam Pascal. Nama
dideklarasikan sendiri oleh pemakai, seperti nama sebuah variabel misalnya. Contoh
bila pada suatu program Pascal terdapat deklarasi:
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
VAR
Nomor: INTEGER;
Suhu: REAL;
Maka Nomor dan Suhu akan dikenali sebagai besaran leksik berupa nama
variabel yang terdapat pada program tersebut. Sedang-kan VAR, INTEGER, dan
REAL merupakan keyword pada program tersebut. Nama bisa berupa nama program,
procedure, var, type, constant.
Keyword pada Pascal misalnya:
2. Nilai konstanta
Adalah suatu konstanta yang terdapat pada program. Bisa berupa konstanta
integer, real, boolean, character, string, dan sebagainya. Misalkan saja dalam Pascal
pada suatu prograni terdapat statement:
N:= R + 5 *
10 kata:=
katal +
'makan' A :=
0.333
Selesai := TRUE
Maka 5, 10, 'makan', 0.333, TRUE, termasuk besaran lekdik berupa nilai konstan
yang terdapat pada program sumber tersebut.
3. Operator dan delimiter
VAR A:INTEGER
BEGIN
A:= A+2
END.
Pada contoh di atas, besaran leksik (token)-nya adalah simbol yang bernilai
TROGRAM', 'Coba', 'VAR', 'A', 'INTEGER', ':', '+', '2', '.', ';', ':=', 'BEGIN', 'END'.
Misalkan sebuah bahasa memiliki himpunan simbol terminal/token:
BAB 5
ANALISIS SINTAKSIS
Sebuah pohon (tree) adalah suatu graph terhubung tidak sirkuler, yang memiliki
satu simpul (node)/vertex disebut akar (root) dan dari situ memiliki lintasan ke setiap
simpul. Gambar 5.1 memberikan contoh sebuah tree yang menguraikan kalimat
dalam bahasa Inggris. The quick brown foxjumped over the lazy dog
Pohon sintaks/ pohon penurunan (syntaz tree/derivation treel parse tree)
berguna untuk menggambarkan bagaimana memperoleh suatu string (untai) dengan
cara menurunkan simbol-simbol variabel menjadi simbol-simbol terminal. Setiap
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
simbol variabel akan diturunkan menjadi terminal, sampai tidak ada yang belum
tergantikan.
Misal terdapat tata bahasa bebas konteks dengan aturan produksi (simbol awal
S, selanjutnya di dalam bab ini digunakan sebagai simbol awal untuk tata bahasa
bebas konteks adalah S):
S →AB
A →aA | a
B →bB | b
Akan kita gambarkan pohon penurunan untuk memperoleh untai: 'aabbb' Pada
pohon tersebut simbol awal akan menjadi akar (root). Setiap kali penurunan dipilih
aturan produksi yang menuju ke solusi. Simbol-simbol variabel akan menjadi simpul-
simpul yang mempunyai anak. Simpul-simpul yang tidak mempunyai anak akan
menjadi simbol terminal, Kalau kita baca simbol terminal yang ada pada gambar 5.2
dari kiri ke kanan akan diperoleh untai 'aabbb'.
S →aAS | a
A →SbA | ba
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Untuk memperoleh untai 'aabbaa' dari tata bahasa bebas konteks di atas ('=>'
bisa dibaca 'menurunkan'):
• Dengan penurunan terkiri: S => aAS => aSbAS => aabAS => aabbaS =>
aabbaa • Dengan penurunan terkanan: S => aAS => aAa => aSbAa => aSbbaa
=> aabbaa
Kita lihat pohon penurunannya pada gambar 5.3. Meskipun proses
penurunannya berbeda akan tetap memiliki pohon penurunan yang sama.
S → aB | bA
A →a \ aS | bAA
B → b \ bS | aBB
Pohon penurunan untuk memperoleh 'aaabbaobba' bisa dilihat pada gambar 5.4.
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
• Penanganan kesalahan
• Penanganan kode
1. Top Down
2. Bottom Up
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
BAB 6
ANALISIS SEMANTIK
PEMBANGKITAN KODE
maka, penganalisa semantik harus mampu menentukan aksi apa yang akan dilakukan
oleh operator-operator tersebut. Dalam sebuah proses kompilasi, andaikata parser
menjumpai ekspresi seperti di atas, parser hanya akan mengenali simbol-simbol ':=',
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
'+', dan '*'. Parser tidak tahu makna apa yang tersimpan di balik simbol-simbol
tersebut. Untuk mengenali makna dari rangkaian simbol tersebut, kompiler akan
memanggil rutin semantik. Rutin ini akan menentu-kan aksi khusus yang dilakukan
oleh rangkaian simbol tersebut.
Untuk bisa mengetahui maknanya, rutin ini mungkin akan memeriksa:
• Apakah operan yang akan dioperasikan tersebut ada nilainya, dan seterusnya.
Untuk dapat menjalankan fungsinya tersebut dengan baik, semantic analyzer
seringkali menggunakan tabel simbol (akan diterangkan lebih lanjut secara lebih
jelas). Pemeriksaan bisa dilakukan pada tabel identifier, tabel display, dan tabel blok,
misal pada fteld link.
Pengecekan yang dilakukan oleh analisis semantik adalah :
- Duplikasi
Kode Antara/ Intermediate Cods merupakan hasil dari tahapan analisis, yang
dibuat oleh kompilator pada saat mentranslasikan program dari bahasa tingkat tinggi.
Kegunaan dari kode antara:
• Untuk memperkecil usaha daiarn membangun kompilator dari sejumlah bahasa ke
sejumlah mesin Dengan adanya kode antara yang lebih machine independent
maka kode antara yang dihasilkan dapat digunakan lagi pada mesin lainnya
• Proses optimasi masih lebih mudah. Beberapa strategi optimisasi lebih mudah
dilakukan pada kode antara daripada pada program sumber atau pada kode
assembiy dan kode mesin.
• Bisa melihat program internal yang gampang dimengerti. Kode antara ini akan lebih
mudah dipahami daripada kode assembly atau kode mesin.
Kerugian dari kode antara, dengan rnelakukan dua kali translasi, maka butuh
waktu yang relatif lebih lama. Selanjutnya akan dibahas dua macam kode antara yaitu
Notasi Postfix dan N-Tuple.
Sehari-hari kita biasa menggunakan operasi dalam notasi infix (letak operator
di tengah). Pada notasi Postfix operator diletakkan paling akhir maka disebut juga
dengan notasi Sufix atau Reverse Polish. Sintaks notasi Postfix:
<operan> <operan> <operator>
Misalkan ekspresi:
(a+b)*(c+d)
↑ ↑
"Jika kondisi ekspresi salah, maka intruksi akan meloncat ke Label1 dan menjalankan
statement2. Bila kondisi ekspresi benar, maka statementl akan dijalankan lalu
meloncat ke Label2. Label1 dan Label2 sendiri menunjukkan posisi tujuan loncatan,
untuk Labell posisinya tepat sebelum statement2, dan Label2 setelah statement2. "
Dalam implementasi ke kode antara, label bisa berupa nomor baris instruksi.
Untuk lebih jelasnya bisa dilihat contoh berikut:
IF a>b
THEN
c:= d
ELSE
c: = e
12 b.
13 >
14 22 ( menunjuk labell)
15 BZ
16 c
17 d
18 : =
19
20 25 ( menunjuk label2 }
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
21 BR
22 c
23 e
24 =
25
Bila ekspreoi (a>b) benar, tidak terjadi loncatan, intruksi berlanjut ke 16 bampai 18,
lalu loncat ke no 25
Contoh lain:
diubah ke Postfix
Iabel2 labell
Contoh, instruksi:
a:= l
WHILE a<5
DO a: = a+l
diubah ke
Postfix:
10 a
11 1
12 :=
13 a
14 5
15 < 28
18 28
19 28
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
17 BZ
22 : =
23
24 13 ( menunjuk Iabel2)
25 BR
Bila pada Postfix setiap baris instruksi hanya terdiri dari satu tupel, pada notasi
N-tuple setiap baris bisa terdiri dari beberapa tupel. Format umum dari Notasi N-Tuple
adalah:
Operator…………..N-l operan
1. *,D,C
2. / , B, E
3. +, (1), (2)
4. : = ,A, (3)
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
x:= a+b
3. -, a, b
4. : = , x, (3)
5. BR, , (8)
6. +, a, b
7. :.,x,(6)
Kekurangan dari notasi tripel adalah sulit pada saat melakukan optimasi, maka
dikembangkan Indirect Triples yang memiliki dua list (senarai), yaitu list instruksi dan
list eksekusi. List instruksi berisi notasi tripel, sedang list eksekusi mengatur urutan
eksekusinya.
Misal terdapat urutan instruksi:
A : = B+C*D/E
F :=
C*D
List Instruksi:
1. *, C, D
2. /, (1) , E
3. +, B, (2)
4. : = , A, (3)
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
5. : = ,F, (1)
List Eksekusi
1. 1
2. 2
3. 3
4. 4
5. 1
6. 5
Hasil adalah temporary variable yang bisa ditempatkan pada memory atau register.
Contoh instruksi:
A:= D*C+B/E
Bila dibuat dalam kode
antara:
1. *,D,C,T1
2. /,B,E,T2
3. +,T1,T2,A
BAB 7
2. Sintaks
Misalkan operasi aritmatika dengan jumlah parenthesis (kurung) yang tidak pas,
contoh:
A:= X+(B*(C+D)
3. Semantik
VAR Siswa: integer { variabel Siswa bertipe integer } tetapi selanjutnya ada
instruksi yang melakukan operasi dengan tipe yang salah pada variabel
Siswa
Siswa:= 'Yanuar' { dilakukan operasi assignment dengan tipe data string }
B:=B+1;
• Mendeteksi kesalahan
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
• Melaporkan kesalahan
• Tipe-tipe yang terkait bila type checking Misal terdapat pesan kesalahan:
Error 162 Jumlah: unknown identifier
bisa diartikan:
• Looping: Kompilator masih berjalan tapi tidak pernah berakhir karena hoping
tak berhingga (indefinite/onbounded loop)
• Menghasilkan program objek yang salah: Kompilator melanjutkan proses
sampai selesai tapi program objek yang dihasilkan salah. Ini berbahaya bila
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
tidak diketahui oleh pemrogram, karena baru akan muncul saat program
dieksekusi.
Respon-respon di atas merapakan tingkatan terendah, dan bisa muncul
pada kompilator yang dirancang tanpa memper-timbangkan kemungkinan
kompilator memproses source code yang mengandung kesalahan.
II. Reaksi yang benar tapi kurang dapat diterima dan kurang bermanfaat
A:=A+1
• Panic mode
Maju terus dan mengabaikan teks sampai bertemu delimiter (misal ';') Contoh
pada potongan program:
IF A = l
Kondisi:= true;
Pada teks di atas kesalahan karena tidak ada instruksi THEN, kompilator akan
maju terus/skip sampai bertemu titik koma
• Unit deletion
I:=H-1;
Contoh lain:
Procedure
Increment; begin
X:=X+1
; end;
end;
Terdapat kelebihan simbol end, yang menyebabkan kesalahan, maka kompilator
akan membuangnya.
3. Context Sensitive repair
VAR
A:string;
begin
A:=0; end;
Kompilator akan memperbaiki kesalahan dengan membangkitkan
identifter baru, misal B yang bertipe integer.
• Tipe konstanta
BAB 8
TEKNIK OPTIMASI
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Kode dioptimasi sehingga lebih efisien pada mesin tertentu.. Optimasi ini
memerlukan informasi mengenai feature yang ada pada mesin tujuan dan
mengambil keuntungan darinya untuk meng-hasilkan kode yang lebih pendek atau
dieksekusi lebih cepat.
2. Machine Independent Optimizer
Strategi optimasi yang bisa diaplikasikan tanpa tergantung pada mesin tujuan
tempat kode yang dihasilkan akan dieksekusi nanti-nya. Bab ini selanjutnya akan
membahas optimasi Machine In-dependent yang meliputi optimasi lokal dan
optimasi global.
8.2 OPTIMASILOKAL
Optimasi lokal adalah optimasi yang dilakukan hanya pada suatu blok dari
source code, cara-caranya:
1. Folding
Mengganti konstanta atau ekspresi yang bisa dievaluasi pada saat compile time
dengan nilai komputasinya. Misalkan instruksi:
A := 2+3+B
bisa diganti
menjadi
A:=5+B di situ 5
menggantikan ekspresi 2+3
2. Redundant-Subexpression Eliminalion
• Loop Unrolling: Menggantikan suatu loop dengan menulis statemerit dalam laop
beberapa kali. Hal ini didasari pemikir-an, sebuah iterasi pada implementasi
level rendah akan me-meriukan operasi:
=> Inisialisasi/pemberian nilai awal pada variabel loop. Dilakukan
sekali pada saat permulaan eksekusi loop
=> Pengetesan, apakah variabel loop telab. mencapai kondisi terminasi
=> Adjustment yaitu penambahan atau pengurangan nilai pada variabel loop
deagan jumlah tertentu
=> Operasi yang terjadi pada tubuh perulangan (loop body)
A (I):=0;
A[l]:=0;
A[2]:=0,-
Contoh:
FOR I:=l TO 10 DO
BEGIN
X:=5;
A:=A+I;
END;
X:=5;
FOR I:=l TO 10 DO
BEGIN
A:=A+I
END;
4. Strength Reduction
Penggantian suatu operasi dengan jenis operasi lain yang lebih cepat dieksekusi.
Misalkan pada beberapa komputer operasi per-kalian memerlukan waktu lebih
banyak untuk dieksekusi dari-pada operasi penjumlahan, maka penghematan
waktu bisa di-lakukan dengan mengganti operasi perkalian tertentu dengan
penjumlahan. Contoh lain, instruksi:
A:=A+1;
dapatdigantikan dengan:
INC(A);
Di sini hanya akan diceritakan sekilas mengenai Optimasi global. Optimasi global
biasanya dilakukan dengan Analisis Flow, yaitu suatu graph berarah yang
menunjukkan jalur yang mungkin selama eksekusi program Kegunaannya:
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
• Unreachable /dead code: Kode yang tidak akan pernah di eksekusi. Misalnya
terdapat urutan instruksi:
X:=5;
IF X=0 THEN
A:=A+1
Instruksi A:=A+1 tidak akan pernah dieksekusi
; var x:
integer
begin
x:=a+b
end;
kita lihat parameter c tidak pernah digunakan di dalam prosedur, sehingga
seharusnya tidak perlu diikutsertakan.
Program
Pendek; var
a,b:integer;
begin a:=5;
end,-
Variabel b tidak pernah dipergunakan dalam program, sehingga bisa
dihilangkan.
Program Awal;
begin
a:=5;
a:=a+b;
end;
Kita lihat variabel b digunakan tanpa memiliki nilai awal/ belum di-
assign. b. Bagi kompilator:
• Meningkatkan efisiensi eksekusi program
BAB 9
TABEL INFORMASI
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Tabel informasi atau tabel simbol dibuat guna mempermudah pembuatan dan
implementasi dari semantic analyzer. Tabel simbol ini mempunyai dua fungsi penting
dalam proses translasi, yaitu :
1. Untuk membantu pemeriksaan kebenaran semantik dari program sumber
3. Tabel Blok: Mencatat variabel-variabel yang ada pada blok yang sama
• Nama identifter
• Tipe dari identifier yang bersangkutan: Integer, char, boolean, arry, record, file, no-
type
• Level: Kedalaman identifier tertentu (depth of block), hal ini menyangkut letak
identifier dalam program. Konsepnya sama dengan pembentukan tree, misal: main
program = level 0. Field ini digunakan pada run time untuk mengetahui current
activation record, dan variabel yang bisa diakses.
• Informasi referensi (acuan) identifier tertentu ke alamat tabel identifter lain yang
digunakan untuk mencatat informasi-informasi
yang diperlukan yang menerangkannya.
• Link: Menghubungkan identifier ke identifter lainnya, atau yang dideklarasikan
pada level yang sama
• Normal: Diperlukan pada pemanggilan parameter, untuk membedakan parameter
by value dan reference (berupa suatu variabel boolean)
Program A;
var
B:integer;
Procedure X (Z:
char); var
C:integer Begin
Tabel Identifter akan mencatat semua identifter:
0 A
1 B
2 X
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
3 Z
4 C
Tabld: array
[O..tabmax] of
record name :
string; link : integer;
obj : objek;
tipe : types; ref :
integer;
normal :
boolean,-
level : 0..maxlevel;
address : integer;
end; dimana objek =
(konstant, variable,
prosedur, fungsi)
types = (notipe,int,reals,booleans,chars,arrays,records)
TabArray: array
[l..tabmax] of record
indextype,elementype:
types;
elemenref, low, high, elemensize, tabsize:integer
end;
Tabel blok digunakan untuk menyimpan informasi blok-blok yang ada pada tabel
utama. Dengan berdasarkan pada tabel ini, dapat diketahui batas-batas suatu blok
pada tabel utama (tabel identifter). Tabel blok memiliki fteld:
• No urut blok
• Last variable
• Last parameter
Program A;
var
B:integer;
Procedure
X(Z:char); var
C:integer Begin
Akan diperoleh, untuk blok Program A:
last variable = 2
Tabel real ini digunakan untuk menyimpan nilai dari suatu identifier yang bertipe real.
• No urut elemen
• Nilai real suatu variabel real yang mengacu ke indeks tabel ini Contoh
implementasi tabel real:
TabReal: array [l..tabmax] of real
Pemikirannya di sini setiap tipe yang dimiliki oleh suatu bahasa akan memiliki tabelnya
sendiri,
Tabel ini digunakan untuk menyimpan informasi string yang terdapat pada
program sumber. Elemen-elemen yang terdapat dalam tabel ini adalah:
• No urut elemen
Bertha Meyke Waty Hutajulu, S.Kom, M.MSI
Diktat Kuliah Teknik Kompilasi
Tabel ini menyimpan informasi mengenai blok-blok yang lagi aktif. Elemen-
elemen yang terdapat dalam tabel ini adalah:
• No urut tabel
Pertama kali tabel display akan menunjuk blok mana yang sedang aktif. Dari
blok yang aktif ini, akan diketahui identifier-iden-tifier yang termasuk dalam blok
tersebut. Untuk pertama kalinya, yang akan diacu adalah identifter yang paling akhir,
kemudian iden-iifier sebelumnya, dan seterusnya, Informasi suatu identifier ini
mungkin belum lengkap. Untuk itu dari tabel identifier ini mungkin akan dicari
kelengkapan informasi suatu identifier ke tabel yang sesuai (tabel real, tabel string,
atau tabel array).