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