teknik kompilasi

advertisement
TEKNIK KOMPILASI
TEKNIK KOMPILASI
Firrar Utdirartatmo
Kat a Pengantar
Penulis memberanikan diri untuk menyusun buku ini karena
melihat kenyataan bahwa teknik kompilasi merupakan mata kuliah
yang diajarkan pada jurusan-jurusan informatika atau ilmu komputer. Sementara buku-buku referensi yang membahas mengenai materi kuliah tersebut, yang berbahasa Indonesia masih sangat jarang
ditemukan. Penulis memahami masih banyak mahasiswa yang mengalami kesulitan untuk membaca text-book berbahasa asing.
Buku ini ditujukan terutama untuk dibaca oleh para mahasiswa yang sudah pernah memperoleh perkuliahan teori bahasa dan
otomata. Meskipun begitu mereka yang belum pernah mempelajarinya tidak akan terlalu memperoleh kesulitan, karena penulis berusaha mengulang sedikit konsep-konsep yang penting dan perlu untuk diketahui. Untuk mereka yang belum mempelajari teori bahasa
diharapkan memperdalam sendiri pemahaman teori bahasa, khususnya mengenai otomata berhingga (finite state automata), aturan produksi, dan tata bahasa bebas konteks (context free grammar). Diharapkan pembaca telah mengenal bahasa pemrograman tingkat
tinggi dan struktur data. Pengetahuan mengenai bahasa assembly
akan banyak membantu.
Bisa dikatakan teknik kompilasi merupakan penerapan konsep-konsep yang sudah dipelajari pada teori bahasa dan otomata.
Penulis mencoba memberikan banyak contoh-contoh yang berkaitan
dengan suatu teori dalam setiap bab, untuk mempercepat pemahaman. Contoh-contoh yang digunakan kebanyakan memiliki kemiripan
dengan bahasa Pascal. Hal ini disengaja karena bahasa Pascal lebih
mudah untuk dibaca dan dipahami.
vi
Teknik Kompilasi
Listing program pada lampiran dibuat dengan menggunakan
Turbo Pascal. Diharapkan dengan mencoba-coba sendiri program pada lampiran tersebut akan membantu pemahaman pembaca mengenai pengembangan sebuah kompilator. Minimal para pembaca dapat
memahami mekanisme kerja sebuah kompilator. Mereka yang tertarik disarankan pula untuk membaca buku-buku lain mengenai teknik kompilasi, khususnya yang terdapat pada daftar pustaka. Sehingga diharapkan mampu melakukan pengembangan suatu kompilator yang lengkap.
Penulis berterima kasih kepada Bapak Dr. Ing. Farid Wazdi,
yang telah memberikan perkuliahan Teknik Kompilasi selama penulis menuntut ilmu di jurusan Teknik Informatika Institut Teknologi Bandung. Penulis juga mengucapkan terimakasih kepada segenap pihak yang telah membantu dan memberikan masukan bagi
penulis, sehingga dapat menyelesaikan buku ini.
Semoga buku ini dapat bermanfaat bagi pembaca, minimal
menjadi suatu panduan awal untuk mempermudah mereka yang
ingin mempelajari teknik kompilasi. Penulis memahami kekurangankekurangan yang terdapat pada buku ini karena keterbatasan pengalaman penulis, dan berharap pembaca bersedia memberikan koreksi
dan saran kepada penulis. Penulis dapat dicapai pada
<[email protected]>.
Yogyakarta, Januari 2001
Firrar Utdirartatmo
Daft ar I si
KATA PENGANTAR
DAFTAR ISI
DAFTAR ISTILAH
BAB 1. PENDAHULUAN
1.1 Bahasa Pemrograman
1.2 Translator
1.3 Model Kompilator
1.4 Mutu Kompilator
1.5 Pembuatan Kompilator
LATIHAN
v
vii
xi
1
1
3
5
11
13
14
BAB 2. PERANCANGAN BAHASA PEMROGRAMAN
2.1 Sumber Perancangan Bahasa Pemrograman
2.2 Tujuan Perancangan Bahasa Pemrograman
2.3 Detil Rancangan
2.4 Skenario Perancangan
LATIHAN
17
17
18
22
32
32
BAB 3. KONSEP DAN NOTASI BAHASA
3.1 Hirarki Chomsky
3.2 Diagram Keadaan
3.3 Notasi BNF
3.4 Diagram Sintaks
LATIHAN
35
35
39
40
40
41
BAB 4. ANALISIS LEKSIKAL
4.1 Tugas Scanner
4.2 Besaran Leksik
LATIHAN
43
43
43
49
viii
Teknik Kompilasi
BAB 5. ANALISIS SINTAKSIS
5.1 Pohon Sintaks
5.2 Metode Parsing
5.3 Parsing dengan Brute Force
5.4 Parsing dengan Recursive Descent Parser
LATIHAN
51
51
55
55
60
66
BAB 6. ANALISIS SEMANTIK, KODE ANTARA, DAN
PEMBANGKITAN KODE
6.1 Analisis Semantik
6.2 Kode Antara
6.3 Notasi Postfix
6.4 Notasi N-Tuple
6.5 Pembangkitan Kode
LATIHAN
67
67
69
69
71
73
75
BAB 7. CARA PENANGANAN KESALAHAN
7.1 Kesalahan Program
7.2 Penanganan Kesalahan
7.3 Reaksi Kompilator pada Kesalahan
7.4 Error Recovery
7.5 Error Repair
LATIHAN
77
77
78
78
79
81
82
BAB 8. TEKNIK OPTIMASI
8.1 Dependensi Optimasi
8.2 Optimasi Lokal
8.3 Optimasi Global
LATIHAN
83
83
83
85
87
BAB 9. TABEL INFORMASI
9.1 Kegunaan Tabel Informasi
9.2 Implementasi Tabel Informasi
9.3 Interaksi Antar Tabel
9.4 Contoh Implementasi Tabel Simbol
LATIHAN
89
89
92
96
96
100
DAFTAR PUSTAKA
LAMPIRAN 1
LAMPIRAN 2
LAMPIRAN 3
LAMPIRAN 4
LAMPIRAN 5
101
103
109
121
125
135
Daftar Isi
ix
LAMPIRAN 6
LAMPIRAN 7
LAMPIRAN 8
LAMPIRAN 9
LAMPIRAN 10
139
141
171
177
183
DAFTAR INDEKS
187
Pendahul uan
1.1 BAHASA PEMROGRAMAN
Manusia dapat melakukan interaksi secara efektif dengan
menggunakan media bahasa. Bahasa memungkinkan penyampaian
gagasan dan pemikiran, tanpa itu komunikasi akan sulit terjadi. Dalam lingkungan pemrograman komputer, bahasa pemrograman bertindak sebagai sarana komunikasi antara manusia dan permasalahannya dengan komputer yang dipakai untuk membantu memperoleh
pemecahan. Bahasa pemrograman menjembatani antara pemikiran
manusia yang sering tidak terstruktur dengan kepastian yang diperlukan oleh komputer untuk melakukan eksekusi. Suatu solusi
untuk suatu masalah akan menjadi lebih mudah bila bahasa pemrograman yang dipergunakan lebih dekat dengan permasalahan
tersebut. Oleh karena itu, bahasa harus memiliki konstruksi yang
merefleksikan terminologi dan elemen yang dipergunakan dalam
mendeskripsikan masalah dan independen dari komputer yang dipergunakan. Bahasa pemrograman seperti ini biasanya bahasa tingkat tinggi. Komputer digital, di sisi lain, menerima dan memahami
hanya bahasa tingkat rendah mereka sendiri, terdiri dari deretan nol
dan satu, yang sulit dipahami oleh manusia.
Bahasa pemrograman berdasarkan tingkat ketergantungannya
dengan mesin bisa meliputi:
1. Bahasa mesin
Merupakan bentuk terendah dari bahasa komputer. Setiap instruksi dalam program direpresentasikan dengan kode numerik,
yang secara fisik berupa deretan angka 0 dan 1. Sekumpulan
2
Teknik Kompilasi
instruksi dalam bahasa mesin bisa dibentuk menjadi microcode,
yaitu semacam prosedur dalam bahasa mesin.
2. Bahasa assembly
Merupakan bentuk simbolik dari bahasa mesin. Setiap kode operasi memiliki kode simbolik, misalnya ADD untuk penjumlahan
(addition) dan MUL untuk perkalian (multiplication). Sekumpulan instruksi dalam bahasa assembly bisa dibentuk menjadi makroinstruksi. Pada bahasa assembly tersedia alat bantu untuk diagnostik atau debug yang tidak terdapat pada bahasa mesin. Contoh produk yang ada untuk pengembangan dan debug bahasa
assembly di pasaran saat ini, misalnya Turbo Assembler dari
Borland, Macro Assembler dari Microsoft, DEBUG yang tersedia
pada DOS, dan Turbo Debugger. Instruksi dalam bahasa Assembly biasanya terdiri dari beberapa field, misalnya field operasi
diikuti satu atau lebih operan.
3. Bahasa tingkat tinggi (user oriented)
Disebut tingkat tinggi karena lebih dekat dengan manusia. Memberikan fasilitas yang lebih banyak, kontrol program yang terstruktur, kalang (nested), block, dan prosedur. Contohnya: Pascal,
BASIC
4. Bahasa yang problem oriented
Memungkinkan penyelesaian untuk suatu masalah atau aplikasi
yang spesifik. Contohnya: SQL (Structured Query Language) untuk aplikasi database, COGO untuk aplikasi teknik sipil. Bahasa
yang problem oriented kadang dimasukkan pula sebagai bahasa
tingkat tinggi.
Dalam buku ini akan difokuskan pada pengembangan kompilator untuk bahasa tingkat tinggi prosedural seperti Pascal.
Keuntungan bahasa tingkat tinggi dibandingkan bahasa tingkat rendah sebagai berikut:
1. Kemudahan untuk dipelajari, tidak membutuhkan latar belakang
pengetahuan mengenai perangkat keras (hardware)karena sifatnya yang machine independent.
2. Lebih mendekati permasalahan yang akan diselesaikan
3. Pemrogram tidak perlu mengetahui bagaimana representasi data
ke dalam bentuk internal di memory. Kemampuan untuk konversi data, seperti floating point misalnya sudah tersedia. Pe-
Pendahuluan
4.
5.
6.
7.
8.
9.
3
kerjaan tersebut ditangani oleh suatu sistem yang mentranslasikan program bahasa tingkat tinggi ke dalam bahasa mesin.
Memberikan banyak pilihan struktur kontrol seperti:
• kondisional (IF-THEN-ELSE)
• looping (REPEAT..UNTIL, FOR)
• struktur blok (BEGIN..END)
• nested statement
Struktur kontrol ini memberikan fasilitas untuk pemrograman
terstruktur, sehingga program mudah dibaca, dipahami dan dimodifikasi. Ini akan mengurangi biaya pemrograman karena program lebih sederhana.
Program lebih mudah di-debug. Bahasa tingkat tinggi menyediakan konstruksi yang mengurangi kesalahan pemrograman yang
biasa muncul pada bahasa tingkat rendah. Sebagai contoh, deklarasi suatu variabel akan menjadi sesuatu yang berguna dalam
mendeteksi kesalahan penggunaan variabel. Bahasa-bahasa
biasanya mengharuskan penggunaan pointer secara konsisten.
Suatu program yang terstruktur lebih mudah di-debug daripada
yang tidak terstruktur.
Kemampuan struktur data yang lebih baik, sehingga memfasilitasi pengekspresian suatu solusi dari masalah tertentu.
Karena ketersediaan feature seperti prosedur, bahasa tingkat
tinggi memungkinkan suatu deskripsi modular dan hirarkis dalam pemrograman. Suatu pekerjaan bisa diserahkan pada suatu
tim, dan memungkinkan pembagian kerja.
Kompatibilitas dan dokumentasi yang lebih baik dalam pengembangan program
Tidak bergantung pada mesin (machine independent) sehingga
memiliki portabilitas tinggi. Program hanya memerlukan sedikit
perubahan untuk bisa dieksekusi pada mesin yang berbeda arsitektur internalnya dan instruksi bahasa mesinnya. Portabilitas
ini akan mengurangi biaya.
Agar dapat dieksekusi, sebuah program dalam bahasa tingkat
tinggi tentu saja harus ditranslasikan ke dalam bahasa mesin. Pada
bagian berikutnya akan dibahas mengenai translator.
1.2 TRANSLATOR
Sebuah translator melakukan pengubahan source code/source
program (program sumber) ke dalam target code/object code/object
Download