One-Pass Compilator Sederhana
Proses Kompilasi
Source
Code -> Compiler -> Object Code -> Eksekusi Komputer (+Data) ->
Hasil
Source
code dan data diproses pada saat yang berbeda.
Compile
time : saat source code diubah ke object code.
Run
time : saat object code dieksekusi.
Proses Interpretasi
Source
Code -> Interpreter (+Data) -> Hasil
Source
code dan data diproses pada saat yang sama.
Model Kompilator
Sebuah
kompilator memiliki dua fungsi :
1.
Fungsi Analis : dekomposisi program sumber menjadi bagian-bagian dasarnya.
Source
Code -> Lexical Analyzer : Scanner -> Syntactic Analyzer : Parser ->
Semantic Analyzer : Intermediate Code Generator
2.
Fungsi Sintesis : pembangkitan dan optimasi kode.
Code
Generator -> Code Optimizer -> Object Code
Keterangan
:
Scanner
: memecah program sumber menjadi besaran leksik/token.
Parser
: memeriksa urutan kemunculan token.
Analisis
Semantik : biasanya digabungkan dengan intermediate code generator (bagian yang
berfungsi membangkitkan kode antara).
Code
Generator : membangkitkan kode objek.
Code
Optimizer : memperkecil hasil dan mempercepat proses.
Tabel
Simbol : menyimpan semua informasi yang berhubungan dengan kompilasi.
Model
Kompilator seperti di atas disebut Multi Pass Compiler / Separate Compiler
yaitu Scanner dan Parser bekerja terpisah. Scanner menghasilkan semua token,
baru diproses oleh Parser.
Berbeda
dengan One Pass Compiler dimana Scanner baru bekerja menghasilkan tiap
token setelah mendapatkan perintah dari Parser.
Token
: besaran pembangun bahasa/representasi dari besaran leksik.
Mutu Kompilator
1.
Kecepatan dan waktu proses kompilasi.
Tergantung pada :
a. Penulisan algoritma kompilator, yaitu algoritma yang digunakan untuk
menuliskan program kompilator tersebut.
b. Kompilator pengkompilasi, sebuah program khusus yang menghasilkan kompilator
tersebut.
2.
Mutu program objek : ukuran dan kecepatan eksekusi dari program objek.
Tergantung pada :
Fungsi translasi yang digunakan (cara untuk melakukan perubahan dari source
code ke object code).
3.
Integrated Environment, yaitu fasilitas-fasilitas terintegrasi yang dimiliki
oleh kompilator tersebut. Misalnya untuk melakukan editing, debugging, maupun
testing.
Pembuatan Kompilator
Dapat
dilakukan dengan :
1.
Bahasa mesin, kesulitan sangat tinggi.
2.
Bahasa assembly, biasa digunakan sebagai tahap awal.
Keuntungan : object code berukuran kecil.
Kerugian : memerlukan usaha yang besar.
3.
Bahasa tingkat tinggi lain pada mesin yang sama.
Keuntungan : pemrograman mudah.
Kerugian : program hasil.
4.
Bahasa tingkat tinggi yang sama pada mesin yang berbeda.
5.
Bootstrap (diperkenalkan oleh Wirth).
Ide : kita bisa membangun sesuatu yang besar dengan dimulai dari bagian
intinya.
KOMPILASI,
Catatan ke-1 : Pendahuluan
Definisi
: 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 dapat digambarkan
melalui sebuah kotak hitam (black box)
berikut :
![]() |


![]() |
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



(scanner)
![]() |



(parser)
![]() |

![]() |
|||||
![]() |
|||||
![]() |
|||||
pembangkit

![]() |
pengoptimal kode



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.









temp2 := id3 * temp1
temp3 := id2 + temp2


![]() |
pengoptimal kode








id3
60 temp1
:= id3 * 60.0
id1 := id2 + temp1
![]() |
|||||
![]() |
|||||
![]() |
|||||

pembangkit kode
MOVF
id3, R2










-
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.
1.4
Bahasa Pemrograman
Bahasa
pemrograman adalah bahasa yang menjadi sarana manusia untuk
berkomunikasi dengan komputer. Pikiran manusia
yang tidak terstruktur harus dibuat terstruktur
agar bisa berkomunikasi dengan komputer. Komputer
memerlukan kepastian dan logika yang benar untuk dapat
melakukan suatu instruksi tertentu. Untuk itu diperlukan algoritma yg baik dan benar.
Penggolongan bahasa
pemrograman berdasarkan tingkat ketergantungannya dengan mesin :
a.
Bahasa Mesin
Bahasa
mesin adalah bahasa yang berisi kode-kode mesin yang hanya
dapat diinterpretasikan langsung oleh mesin komputer. Bahasa mesin sering
juga disebut native code (sangat tergantung pada mesin tertentu). Bahasa ini
merupakan bahasa level terendah dan berupa kode biner 0 dan 1. Sekumpulan
instruksi dalam bahasa mesin dapat membentuk microcode (semacam prosedur
dalam bahasa mesin).
Contoh:
untuk
mesin IBM/370
0001100000110101
= 1835
yang
berarti mengkopikan isi register 5 ke register 3
Keuntungan : Eksekusi cepat
Kerugian : Sangat sulit dipelajari manusia
b.
Bahasa Assembly
(Mnemonic Code)
Merupakan
bentuk simbolik dari bahasa mesin, dianggap sebagai bahasa pemrograman yang pertama kali berbentuk string dan lebih mudah dimengerti
manusia. Setiap kode bahasa mesin memiliki simbol sendiri dalam bahasa
assembly.
Misalnya
ADD untuk penjumlahan, MUL untuk perkalian, SUB untuk pengurangan, dan
lain-lain.
Sekumpulan
kode - kode bahasa assembly dapat membentuk makroinstruksi. Bahasa
assembly juga memiliki program pendebug-nya, tidak seperti bahasa mesin.
Misalnya:
Turbo Assembler dan debug pada DOS.
Assembler
akan mencocokkan token simbol dari awal s/d akhir, kemudian dikodekan menjadi
bahasa mesin.
Kelebihan : Eksekusi cepat, masih bisa dipelajari daripada bahasa mesin,
file hasil sangat kecil.
Kekurangan : Tetap
sulit dipelajari, program sangat panjang.
c.
Bahasa Tingkat Tinggi
(High Level Language) / user oriented
Bahasa
ini lebih dekat dengan bahasa manusia. Bahasa ini juga memberikan banyak sekali
fasilitas kemudahan pembuatan program, misalnya: variabel, tipe data,
konstanta, struktur kontrol, loop, fungsi, prosedur dan lain-lain. Contoh:
Pascal, Basic, C++, dan Java. Mendukung information hiding,
enkapsulasi, dan abstract data type.
Bahasa
Tingkat tinggi memiliki generasi, misalnya generasi ke-3 (Pascal, C/C++) dan
generasi ke-4 (Delphi, VB, VB.NET, Visual Foxpro)
Keuntungan : -
Mudah dipelajari
- Mendekati permasalahan
yang akan dipecahkan
- Kode program pendek
Kerugian : Eksekusi lambat
d.
Bahasa yang
berorientasi pada masalah spesifik (specific problem oriented).
Bahasa
ini adalah bahasa yang digunakan langsung untuk memecahkan
suatu masalah tertentu.
Contoh : SQL untuk
aplikasi database, COGO untuk aplikasi teknik sipil, Regex untuk mencocokkan pola
pada string tertentu, MatLab untuk matematika, dll.
Bahasa
problem oriented kadang digolongkan ke dalam bahasa tingkat tinggi.
1.5
Translator
Translator
(penerjemah) melakukan pengubahan source code / source program (program
sumber) ke dalam target code / object code / object program (program
objek).
Source
code ditulis dalam bahasa sumber, object code berupa bahasa pemrograman lain /
bahasa mesin pada suatu komputer.
Jadi
penerjemah membaca suatu program yang ditulis dalam bahasa sumber dan
menerjemahkan bahasa sumber ke dalam suatu bahasa lain.
Saat
melakukan proses penerjemahan, penerjemah akan melaporkan adanya
keanehan/kesalahan yang mungkin diketemukan.

Gambar 1.1. Alur kerja
Translator
Ada beberapa macam
translator, yaitu :
a.
Assembler
Source
code adalah bahasa assembly, object code adalah bahasa mesin
contoh : Turbo Assembler, Macro Assembler

Gambar 1.2. Alur kerja Assembler
b.
Interpreter
Input
berupa source code yaitu bahasa scripting seperti PHP, Basic, Perl, Javascript,
ASP, Java bytecode, Basic, Matlab, Matematica, Ruby.
Interpreter
tidak menghasilkan object code. Hanya menghasilkan translasi internal. Input dapat berasal dari
source code maupun dari inputan program dari user. Source code dan inputan
data user diproses pada saat yang bersamaan.
Pada
interpreter, program tidak harus dianalisis seluruhnya dulu, tapi bersamaan
dengan jalannya program.
Keuntungan : mudah bagi user, debuging cepat
Kekurangan : eksekusi program lambat, tidak langsung
menjadi program executable.

Gambar 1.3. Alur
kerja Intepreter
c.
Kompilator (Compiler)
Istilah
compiler muncul karena dulu ada
program yang menggunakan subrutin-subrutin atau pustaka-pustaka untuk keperluan
yang sangat khusus yang dikumpulkan menjadi satu sehingga diistilahkan compiled.
Input
berupa source code program seperti Pascal, C, C++. Object code adalah bahasa
assembly. Source code dan data input diproses pada saat yang berbeda.
Compile
time adalah saat pengubahan dari source
code menjadi object code. Runtime adalah saat eksekusi object code dan
mungkin menerima input data dari user. Output : bahasa assembly. Kemudian oleh
linker dihasilkan file EXE.
Kekurangan : debugging lebih lambat
Keuntungan : eksekusi program lebih cepat, menghasilkan
file executable yang berdiri sendiri.

Gambar 1.4. Alur kerja Kompilator
1.6
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.

1. Analisa Leksikal
2. Analisa Sintaks Tahap
analisa (front-end)
3. Analisa Semantik

5. Code optimization Tahap sintesa (back-end)
6. Object code generation

Gambar 1.5. Skema blok
kompilator
Keterangan
:
-
Analisa Leksikal (scanner)
-
Analisa Sintaks(parser)
-
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.
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)
Contoh :
pernyataan
pemberian nilai (assignment) :
position := initial +
rate * 60
Lexical analysis
Mengelompokkan
pernyataan tersebut menjadi token-token sebagai berikut :
1. Token identifier position
2. Token simbol
assignment :=
3. Token identifier initial
4. Token tanda plus +
5. Token identifier rate
6. Token tanda
perkalian *
7. Token konstanta
angka 60
Ketika identifier pada
program sumber ditemukan lexical analyzer, identifier dimasukkan ke tabel
simbol.
position
:= initial + rate * 60
diubah menjadi
id1 :=
id2 + id3 * 60
Syntax analysis
Memparsing
atau membentuk pohon sintaks pernyataan, yaitu :


Semantic analysis
Memeriksa
kebenaran arti program sumber, mengumpulkan informasi tipe bagi tahap
berikutnya. Tahap ini menggunakan pohon sintaks tahap syntax analysis untuk
identifikasi operator dan operand suatu ekspresi dan kalimat. Komponen penting
analisis semantik adalah pemeriksaan tipe, memeriksa operator yang harus
mempunyai operand yang diijinkan oleh spesifikasi bahasa sumber.
Karena misal adanya
pernyataan deklarasi di awal :
var
position, initial, rate : real
Maka konstanta 60
dikonversi menjadi real dengan fungsi inttoreal(60) menjadi konstanta
bilangan real.
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
Code Optimization
Tahap
code optimization proses identifikasi dan membuang operasi-operasi yang tidak
perlu dari intermediate code generation untuk penyederhanaan sehingga nantinya
kode mesin hasil menjadi lebih cepat. Kode-kode tersebut dioptimasi menjadi :
Temp1 := id3 * 60.0
Id1 := id1 + temp1
Code Generator
Tahap
akhir kompilator adalah pembangkitan kode target/objek dan biasanya kode mesin
atau assembly yang dapat direlokasi. Pembangkitan kode sangat bergantung pada
mesin yang dipakai, misal :
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1
1.7
Preprocessor
Preprocessor
adalah suatu program khusus menanggulangi terjadinya
beberapa modul yang terpisah saat melakukan penulisan bahasa sumber menjadi
beberapa file ke dalam suatu program baru. Suatu Preprocessor menghasilkan
suatu input bagi suatu kompilator. Hal ini mungkin dilakukan oleh suatu
kompilator antara lain:
·
Pemrosesan 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 :
a.
Mendefinisikan makro yang digunakan.
Parameter yang
didefinisikan pada makro disebut dengan parameter formal.
b.
Melakukan pemanggilan makro yang
mungkin juga mengandung beberapa parameter. Sedangkan parameter yang digunakan
untuk memanggil makro disebut dengan paramater actual.
·
Pengikutsertaan berkas (File
Inclusion)
Suatu
Preprocessor 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.
Misalnya pada bahasa C, isi dari berkas global.h dapat diikutsertakan dalam program yang sedang ditulis dengan menggunakan perintah #include global.h.
Misalnya pada bahasa C, isi dari berkas global.h dapat diikutsertakan dalam program yang sedang ditulis dengan menggunakan perintah #include global.h.
·
Preprocessor Rasional
Preprocessor
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.
·
Perluasan Bahasa
Preprocessor
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 untuk melakukan akses database.
1.8
Mutu
Compiler
a.
Kecepatan dan waktu
proses kompilasi
Hal
ini tergantung dari algoritma untuk menulis kompiler itu dan kompiler
pengkompilasi.
b.
Mutu program objek
Dilihat dari ukuran dan
kecepatan eksekusi program.
c.
Integrated
Development Environtment (IDE)
Fasilitas-fasilitas
terintegrasi yang dimiliki oleh kompiler. Misalnya untuk debugging, editing,
dan testing. Contoh : bandingkan antara compiler Pascal dan Clipper.
1.9
Bootstrap
Metode Bootstrap
dikembangkan oleh Nikolaus Writh, penulis bahasa
Pascal. Metode
Bootstrap adalah pembuatan kompilator secara bertingkat.

Gambar 1.6. Metode
Bootstrap
Metode
ini menganggap bahwa C dibangun dengan Assembly, B dibangun dengan C, dan A
dibangun dengan B. Jadi compiler dapat dibangan secara keseluruhannya dengan bahasa-bahasa
sebelumnya. Metode Bootstrap berarti menulis suatu bahasa dengan kompiler versi
sebelumnya.
Tidak ada komentar:
Posting Komentar