KOMPILASI
Modern Compiler Design, Dick Grune, Henri E. Bal, Et all, John Wiley
& Son, 2000
Bahasan Materi Kuliah
Beberapa translator
Struktur Compiler
Lexical Analysis
Analysis Syntax
Analysis Semantics
Error Handling
Optimation
Tabel informasi
ARTI KATA TEKNIK KOMPILASI
Teknik :
Metode atau Cara
Kompilasi :
Proses mengabungkan serta menterjermahkan
sesuatu (source program) menjadi bentuk lain
Compile :
To translate a program written in a high-level
programming language into machine language.
Translator : Compiler & Interpreter
Translator :
Adalah suatu program dimana mengambil input
sebuah program yang ditulis pada satu bahasa
program (source language) ke bahasa lain (The
object on target language)
Object code
*.asm Assembler
*.exe /*.com
2. Compiler
Source code adalah bahasa tingkat tinggi, object code
adalah bahasa mesin atau bahasa assembly. Source
code dan data diproses berbeda
Data
Source
Compiler
Execution Hasil
code
Object Code
3. Interpreter
Interpreter tidak menghasilkan bentuk object code, tetapi
hasil translasinya hanya dalam bentuk internal, dimana
program induk harus selalu ada-berbeda dengan compiler
Source code
Translator Hasil
Data
Translator : Compiler & Interpreter
Source OBJECT
Compiler
Program PROGRAM
ERROR
MESSAGES
COMPILER vs INTERPRETER
Bahasa mesin
Assembly
Hasil dari program mempunyai Ukuran yang
relatif kecil
BootStrap
P2
P1
Po
10010101001010001010100
10101010010101001001010
10100101010001010010010
BAHASA SUMBER
DEFINISI “bahasa sumber”
Bahasa adalah kumpulan kalimat. Kalimat adalah
rangkaian kata. Kata adalah unit terkecil komponen
bahasa yang tidak bisa dipisah-pisahkan lagi.
Kalimat-kalimat : ‘Seekor kucing memakan seekor tikus.’
dan ‘Budi menendang sebuah bola.’ adalah dua contoh
kalimat lengkap Bahasa Indonesia. ‘A cat eats a mouse’
dan ‘Budi kick a ball.’ adalah dua contoh kalimat lengkap
Bahasa Inggeris. ‘if a2 < 9.0 then b2 := a2+a3;’ dan ‘for i
:= start to finish do A[i] := B[i]*sin(i*pi/16.0).’ adalah dua
contoh kalimat lengkap dalam Bahasa Pemrograman
Pascal.
Dalam bahasa pemrograman kalimat lebih dikenal
sebagai ekspresi sedangkan kata sebagai token
Bahasa Tingkat Tinggi (Pemrograman )
Bahasa yang lebih dikenal oleh manusia, maksudnya adalah
statement yang digunakan menggunakan bahasa yang dipakai
oleh manusia (inggris),
Bahasa pemrograman didefinisikan dengan menentukan bentuk
programnya (sintak) dan arti programnya (semantik)
Memberikan fasilitas yang lebih banyak, seperti struktur kontrol
program yang terstruktur, blok-blok serta prosedur dan fungsi-
fungsi
Progam mudah untuk di koreksi (debug)
Tidak tergantung pada salah satu mesin
Kontrol struktur seperti : kondisi (if .. Then.. Else ), perulangan
(For, while ), Struktur blok (begin.. End { .. } )
Tingkatan Bahasa Pemrograman
Sumber perancangan bahasa
Operator binding
Alokasi storage
Lingkup variabel
Struktur I/O
Format free
langsung ditampilkan sehingga mudah
bagi user untuk memeriksa kebenaran
program. Contoh pada VB.
Formatted
output ditampilkan secara terformat,
seperti di C : printf(), delphi/VB : format()
ANDAIKAN......
TASSKAF. Bahasa TASSKAF ini merupakan subset dari Java. Dapat disusun
suatu program ke byte code yang dapat dijalankan di Java Virtual Machine
(JVM).
Pada site tersebut juga tersedia informasi materi kuliah dengan LEX, YACC
http://rw4.cs.uni-sb.de/~martin/COMP/TK/
GENTLE. Gentle ini merupakan perangkat bantu (toolkit) modern untuk menulis
compiler dan mengimplemntasikannya pada bahasa tertentu. Perangkat bantu ini
mendukung semua proses translasi, dari definisi tree sintaks abstrak, pater
matching, smart traversal dan lain sebagainya. Toolkit ini telah digunakan secara
luas di riest dan industri .http://www.first.gmd.de/gentle/
Made by :
Terrence Parr
<almost by himself>
For 15
Years
15 TH
?
IDE SISTEM PEMBELAJARAN
CERDAS
What’s
a Surprise?
Top Topic
Skripsi with
Compiler technique
KONSEP
dan NOTASI BAHASA
Konsep dan Notasi bahasa
Kemungkinan2 yang
Terjadi diperlihatkan gambar :
Review Mesin Automata Misal : FSA
FSA State Diagram nya adalah :
Contoh lain : FSA
Konsep dan Notasi bahasa
Penggolongan Chomsky
Bahasa Mesin Automata Aturan Produksi
Tipe 3 Finite state automata (FSA) adalah simbol variabel
Atau meliputi; deterministic maksimal memiliki sebuah
Regular Finite Automata (DFA) & simbol variabel yang bila ada
Non Deterministic Finite terletak diposisi paling kanan
Automata (NFA)
Tipe 2 Push Down Automata adalah simbol variabel
Atau
Contex Free
Tipe 1 Atau Linier Bounded Automata || <= ||
Contex Sensitive
Unrestricted
Context Sensitive
Context free
Regular
Regular
Contoh Tata Bahasa Sederhana
Begin
A := 1;
B := A + 2
END
Diagram State
huruf
ID
PLUS +
Huruf, Digit
S
Digit
-
MINUS INT
Blank Digit
Notasi BNF (Backus-Nour Form)
Aturan Produksi bisa dinyatakan dengan notasi BNF
BNF menggunakan abstraksi untuk struktur syntax
::= sama identik dengan simbol
| sama dengan atau
<> pengapit simbol non terminal
{} Pengulangan dari 0 sampai n kali
Misalkan aturan produksi sbb:
E T | T+E | T-E
Ta
Notasi BNFnya adalah
E ::= <T> | <T> + <E> | <T> - <E>
T ::= a
Diagram Syntax
Misalnya
E T
E T | T+E | T-E
+
-
BNF: <Block> ::= BEGIN <statement> { SEMICOL <statement>}
END
;
Kualitas dari Compiler
Waktu yang dibutuhkan untuk kompilasi;
tergantung dari
Algoritma compiler
Object code
Keterangan
Lexical Analyzer = scanner, Syntax Analyzer, dan Intermediate Code
merupakan fungsi Analisis dalam compiler, yang bertugas
mendekomposisi program sumber menjadi bagian-bagian kecil
Mentransformasikan ke token-token
Menangani kesalahan
Token : separates characters of the source language into group that logically
belong together
Misalnya : konstanta, nama variabel ataupun operator dan delimiter (atau sering
identifier fahrenheit
operator :=
integer 32
operator penjumlahan +
Identifier celcius
operator perkalian *
real / float 1.8
Lexical Analysis - Contoh 2
Contoh instruksi :
Kondisi : IF A > B THEN C = D;
Kondisi 3 B 1
THEN 21
: 26
C 1
IF 20 D 1
A 1 ; 27
> 15
Token-token ini sebagai inputan untuk syntax Analyser , token-token
ini bisa berbentuk pasangan item. Dimana Item pertama menunjukkan alamat
atau lokasi dari token pada tabel simbol. Item kedua adalah representasi
internal dari token. Semua token direpresentasikan dengan informasi yang
panjangnya tetap (konstan), suatu alamat (address atau pointer) dan sebuah
integer (bilangan bulat)
Syntax Analyzer
Pengelompokan token-token kedalam class syntax
(bentuk syntax), seperti procedure, Statement dan
expression
Misalnya: S AB
A aA | a
B bB | B
A SbA | ba
Parsing atau Proses Penurunan
Misalnya: S -> aB | bA
A -> a | aS |bAA
B -> b | bS | aBB
Algoritma ini membuat pohon parsing secara top-down, yaitu dengan cara
mencoba segala kemungkinan untuk setiap simbol non-terminal
S aAd | aB
Ab|c
B ccd | ddc
a A d a A d
b
Terjadi kegagalan (iii), dilakukan back track
(iv) S (v) S (vi) S
a A d a B a B
c c c d
Terjadi kegagalan lagi (iv), dilakukan back-track
Parsing: Brute force
Kelemahan dari metode-metode brute-force
lokasi backtrack
harus diubah dulu sehingga tidak rekursif kiri, Karena rekursif kiri akan
1. E T | T + E | T - E
TF|F*T|F/T
Fi
accept (diterima)
Brute force : Contoh
2. E T | E+T | E-T
T F | T* F | T / F
Fi
accept (diterima)
Meskipun ada rekursif kiri, tetapi tidak diletakkan sebagai aturan yang paling
kiri
3. E E+T | E-T | T
T T* F | T / F | F
Fi
Rekursif kiri, program akan mengalami loop
Brute force : Aturan produksi
Aturan Produksi yang rekursif memiliki ruas kanan (hasil produksi) yang
memuat simbol variabel pada ruas kiri
Sebuah produksi dalam bentuk
A A merupakan produksi rekursif kanan
= berupa kumpulan simbol variabel dan
terminal
contoh: S d S
B ad B
bentuk produksi yang rekursif kiri
A A merupakan produksi rekursif Kiri
contoh:
SSd
B B ad
Aturan produksi : Brute force
Pisahkan Aturan produksi yang rekursif kiri dan yang tidak; misalnya
Aturan produksi yang rekursif kiri
A A 1 | A 2 | ... | A n
A 1 | 2 | ... | n
Aturan produksi : Brute force
1. A 1 Z | 2 Z | ... | n Z
2 Z 1 | 2 | ... | n
3 Z 1 Z | 2 Z | ... | n Z
Aturan produksi : Brute force
Pergantian dilakukan untuk setiap aturan produksi dengan simbol ruas kiri
yang sama, bisa muncul variabel Z1, Z2 dst, sesuai dengan variabel yang
menghasilkan rekurisif kiri
S Sab | Sbd
Ruas Kiri untuk S: 1=ab , 2=bd
Aturan Produksi yang tidak rekursif kiri
S aSc | dd | ff
dari situ didapat untuk Ruas Kiri untuk S: 1 = aSc, 2 = dd, 3= ff
Aturan produksi : Brute force
Langkah berikutnya adalah penggantian yang rekursif kiri
S Sab | Sbd, dapat digantikan dengan
1. S aScZ1 | ddZ1 | ffZ1
2. Z1 ab | bd
3. Z1 abZ1 | bdZ1
aturan produksi maka produksi rekursif kiri diletakkan pada bagian belakang
atau terkanan, hal ini untuk menghindari looping pada awal proses parsing
sehingga butuh waktu yang cukup lama serta memerlukan memori yang
Metode ini digunakan untuk aturan produksi yang memiliki alternatif yang
sedikit
Parsing: Recursive Descent Parser
Parsing dengan Recursive Descent Parser
Dengan cara penurunan secara recursif untuk semua variabel dari awal sampai ketemu
terminal
Beda dengan turing yang selalu maju dan mundur dalam melakukan parsing
Aturan Produksi memakai Recursif
Descent :
Semua simbol variabel dijadikan prosedur/fungsi
Jika ketemu simbol terminal pada aturan produksi ,
maka panggil prosedurnya
Penelusuran bersifat top down mengikuti sintaks
sesuai pola pada diagram sintaks
Fungsi/prosedur ditulis untuk setiap non terminal dari
suatu produksi. Setiap fungsi/prosedur akan
melemparkan nilai benar atau salah bergantung
pada apakah fungsi tersebut mengenali substring
yang diterima sebagai ekspansi dari non terminal.
Contoh :
Grammar dengan BNF :
<program> ::= t_PROG t_ID t_SEMICOL <block> t_DOT
<block> ::= t_BEGIN <statement> {t_SEMICOL <statement>}
t_END
<statement> ::= t_ID t_ASS <simple exp> |
t_IF <exp> t_THEN <statement>|
t_IF <exp> t_THEN <statement> t_ELSE
<statement>
<exp> ::= <simple_exp> t_EQ <simple exp> |
<simple_exp> t_LT <simple_exp>|
<simple_exp> t_GT <simple_exp>
Dst…….
Penggalan program untuk grammar
tsb
Semantics Analyser
Memeriksa tipe
Melakukan pemeriksaan terhadap kesesuaian tipe dalam statement - statement
yang ada, Misalnya bila terdapat suatu operasi, diperiksa tipe operand nya
Semantics Analyser
Contohnya;
expresi yang mengikut IF berarti tipenya boolean, akan diperiksa tipe
identifier dan tipe ekspresinya
Bila ada operasi antara dua operand maka tipe operand pertama harus
bisa dioperasikan dengan operand yang kedua
Ada dua macam intermediate code yaitu Notasi Postfix dan N-Tuple
Notasi POSTFIX
<Operand> <Operand> < Operator>
Misalnya :
( a +b ) * ( c+d )
maka Notasi postfixnya
ab+ cd+ *
Semua instruksi kontrol program yang ada diubah menjadi notasi postfix, misalnya
IF <expr> THEN <stmt1> ELSE <stmt2>
POSTFIX
Instruksi : a:= 1
WHILE a < 5 DO
a := a + 1
Dalam bentuk Postfix
10 a 18 a
11 1 19 a
12 := 20 1
13 a 21 +
14 5 22 :=
15 < 23 13
16 25 24 BR
17 BZ 25
TRIPLES NOTATION
Notasi pada triple dengan format
<operator> <operand> <operand>
Contoh:
A := D * C + B / E
Jika dibuat intermidiate code triple:
1. * , D, C
2. /, B, E
3. +, (1), (2)
4. :=, A, (3)
Result atau hasil adalah temporary variable yang dapat ditempatkan pada memory
atau register . Problemnya adalah bagaimana mengelola temporary variable
seminimal mungkin
Contoh:
A := D * C + B / E
hasil dari code generator akan diterima oleh code optimation , Misalnya
untuk kode assembly diatas dioptimasikan menjadi:
LDA A
ADD B
STO T1
LDA C
ADD D
MUL T1
STO T2
Perjalanan sebuah intruksi
<assign>
Id1 := <Expr>
LDA A
Source ADD Y
Token-token
Program Id1:=Id2+Id1 Id2 + Id1 Code Generator STO X
X =Y+X Analisis Analisis dan Analisis
Leksikal Sintaksis sematiks
Tabel
Simbol
Error Handling
Kesalahan Program
Penanganan Kesalahan
Reaksi Compiler Pada kesalahan
Error Recovery
Error repair
Kesalahan Program
Kesalahan Sintaks
misalnya dalam operasi aritmatika dengan tanda kurung yang
jumlahnya kurang, contoh
A:= X + (B * (C+D)
Kesalahan Semantics
Error Handling - Kesalahan Program
Kesalahan Semantics
Tipe data yang salah
Contoh : int c;
c = 1.5 * 0.78
Unit Deletion
Menghapus keseluruhan suatu unit sintaksik (misalnya : <block>, <exp>,
<statement> dan sebagainya
Mempermudah untuk melakukan error repairing
Error Handling - Error Recovery
Mekanisme Ad Hoc
Tergantung pada sipembuat compiler
Contoh lain
Procedure Increment ;
begin
x := X + 1
end;
end;
Dependensi Optimasi
Optimasi Lokal
Optimasi Global
Dependensi Optimasi
bertujuan untuk menghasilkan kode program yang berukuran lebih kecil dan lebih cepat
Machine Dependent Optimizer
Machine Independent Optimizer (Optimasi lokal dan Optimasi global)
Teknik Optimasi : Optimasi Lokal
Optimasi Lokal : adalah optimasi yang dilakukan hanya pada suatu blok dari
source code, dengan cara:
Folding
menganti konstata atau ekpresi yang bisa dievaluasi pada saat compile time dengan
nilai komputasinya. Misalnya:
A := 2 + 3 + B bisa diganti dengan A:= 5 + B
5 dapat mengantikan ekspresi 2 + 3
Redundant-Subexpression Elimination
hasilnya digunakan lagi dari pada dilakukan computasi ulang, contoh:
A:= B + C
X := Y + B + C
Teknik Optimasi : Optimasi Lokal
Optimasi dalam sebuah Iterasi
Loop Unrrolling:Menganti suatu loop dengan menulis statement
yang ada dalam loop ditulis beberapa kali
Karena sebuah iterasi pada implemnetasi ke level rendah,
memerlukan :
Inisialisasi nilai awal, pada loop dilakukan sekali pada saat permulaan
eksekusi loop
Penge-test-an, apakah variabel loop telah mencapai kondisi terminasi
Adjustment yaitu: penambahan atau pengurangan nilai pada variabel
loop dengan jumlah tertentu
Operasi yang terjadi pada tubuh perulangan (loop body)
Teknik Optimasi : Optimasi Lokal
Contoh :
FOR I := 1 to 2 DO
A[I] := 0;
dapat dioptimasikan menjadi
A[1] := 0;
A[2] := 0;
FOR I:= 1 to 10 DO X := 5
BEGIN FOR I:= 1 to 10 DO
X := 5 BEGIN
A := A + 1 A := A + 1
END: END:
Teknik Optimasi : Optimasi Lokal
Strength Reduction
Bagi Programmer
Unreachable/dead code: Kode yang tidak pernah dieksekusi
misalnya :
X := 5;
IF X = 0 THEN
A := A + 1
Instruksi
A := A + 1 tidak pernah dikerjakan
Teknik Optimasi : Optimasi GLobal
Unused parameter : parameter yang tidak pernah
digunakan dalam procedure
Misalnya :
Program pendek;
var a, b: integer
begin
a := 5;
end;
Bagi Compiler
Meningkatkan efisiensi eksekusi program
Menghilangkan useless code/kode yang tidak terpakai
var A, B, C, D, E, I, J, X, Y : integer;
begin
B := 5;
A := 10 - B / 4 * 3 + 2;
C := A + B;
Y := 10;
D := A + B – E;
for I := 1 to 85 do
begin
X := X + 1;
B := B – X;
Y := 7;
end
While Y< 5 do
E := E – B;
end
Tabel Informasi
Dua fungsi penting Tabel Informasi
Tipe identifier
Object time address
Dimensi dari identifier yang
bersangkutan
Nomor baris variabel yang
dideklarasikan
Nomor baris variabel yang
direferensikan
Field link
Tabel Informasi - Implementasi
Ada beberapa jenis Tabel Informasi
program
Tabel blok: mencatat varibel-variabel yang ada pada blok yang sama
Tipe dari identifier yang bersangkutan; seperti Integer (bilangan bulat), Char,
boolean , array, record, file
level dari identifier (depth of block); hal ini menyangkut letak identifier dalam
program, konsepnya sama dengan pembentukan tree, misalnya main program
level 0
Tabel Informasi - Identifier
0 A
1 B
2 X
3 Z
4 C
TabId: Array [0..tabmax] of record
nama : String;
Tabel Informasi
link
Obj
: integer;
: object;
- contoh
Tipe : Types;
ref : Integer;
normal : Boolean;
Level : 0.. Maxlevel;
address : Integer;
End
Dimana
objek =(konstant, variabel, prosedur, fungsi)
Types = (notipe, int, reals, booleans, chars, arrays, record
Tabel Informasi - Array
Tabel Array
dipergunakan untuk menyimpan informasi suatu identifier yang bertipe array,
tabel ini memilik field:
No. Urut suatu array dalam tabel
Tipe dari indeks array yang bersangkutan
Tipe element array
Referensi dari elemen array
Index batas atas dan bawah array
Jumlah elemen array
Ukuran total array (total = atas - bawah + 1) x elemen size
Elemen size
Tabel Informasi - Block
Tabel Blok
Dipergunakan untuk menyimpan informasi blok-
blok yang ada pada tabel utama. Berisikan
field
no urut blok
batas awal blok
batas akhir blok
ukuran parameter/parameter size
ukuran variabel/ variabel size
last variabel
last parameter
Tabel Informasi - Block
Contoh
Program A
Var B : Integer;
Procedure X (Z:char);
Var C : Integer;
begin
....
Untuk Blok A Blok B
last variable =2 4
Variable size = 2 (dianggap int 2 byte) 2
Last parameter = 0 (tanpa parameter) 3
parameter size =0 1 (char butuh
1 byte)
Tabel Informasi - Implementasi
Tabel Real
Dipergunakan untuk menyimpan nilai dari suatu identifier yang bertipe real
(pecahan). Elemen-elemen dari tabel ini adalah sebagai berikut;
NO urut elemen
Nilai real suatu variabel real yang mengacu ke indeks tabel ini
Pemikirannya disini setiap tipe yang memiliki oleh suatu bahasa akan
memiliki tabelnya sendiri
Tabel Informasi - Implementasi
Tabel String
no Urut elemen
Karakter-karakter yang merupakan konstanta
Tabel Informasi - Implementasi
Tabel Display
menyimpan informasi-informasi mengenai blok-blok yang lagi aktif.
Elemen-elemen yang terdapat dalam tabel ini adalah:
No Urut tabel
Blok yang aktif