979-756-058-1-122_kompilasi

10
TEKNIK KOMPILASI

Transcript of 979-756-058-1-122_kompilasi

Page 1: 979-756-058-1-122_kompilasi

TEKNIK KOMPILASI

Page 2: 979-756-058-1-122_kompilasi

TEKNIK KOMPILASI

Firrar Utdirartatmo

Page 3: 979-756-058-1-122_kompilasi

Penulis memberanikan diri untuk menyusun buku ini karena

melihat kenyataan bahwa teknik kompilasi merupakan mata kuliah yang diajarkan pada jurusan-jurusan informatika atau ilmu kom-puter. Sementara buku-buku referensi yang membahas mengenai ma-teri kuliah tersebut, yang berbahasa Indonesia masih sangat jarang ditemukan. Penulis memahami masih banyak mahasiswa yang meng-alami kesulitan untuk membaca text-book berbahasa asing.

Buku ini ditujukan terutama untuk dibaca oleh para maha-siswa yang sudah pernah memperoleh perkuliahan teori bahasa dan otomata. Meskipun begitu mereka yang belum pernah mempelajari-nya tidak akan terlalu memperoleh kesulitan, karena penulis ber-usaha mengulang sedikit konsep-konsep yang penting dan perlu un-tuk diketahui. Untuk mereka yang belum mempelajari teori bahasa diharapkan memperdalam sendiri pemahaman teori bahasa, khusus-nya mengenai otomata berhingga (finite state automata), aturan pro-duksi, dan tata bahasa bebas konteks (context free grammar). Di-harapkan pembaca telah mengenal bahasa pemrograman tingkat tinggi dan struktur data. Pengetahuan mengenai bahasa assembly akan banyak membantu.

Bisa dikatakan teknik kompilasi merupakan penerapan kon-sep-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 pemaham-an. Contoh-contoh yang digunakan kebanyakan memiliki kemiripan dengan bahasa Pascal. Hal ini disengaja karena bahasa Pascal lebih mudah untuk dibaca dan dipahami.

Kata Pengantar

Page 4: 979-756-058-1-122_kompilasi

vi Teknik Kompilasi

Listing program pada lampiran dibuat dengan menggunakan Turbo Pascal. Diharapkan dengan mencoba-coba sendiri program pa-da lampiran tersebut akan membantu pemahaman pembaca menge-nai pengembangan sebuah kompilator. Minimal para pembaca dapat memahami mekanisme kerja sebuah kompilator. Mereka yang ter-tarik disarankan pula untuk membaca buku-buku lain mengenai tek-nik kompilasi, khususnya yang terdapat pada daftar pustaka. Se-hingga diharapkan mampu melakukan pengembangan suatu kompi-lator yang lengkap.

Penulis berterima kasih kepada Bapak Dr. Ing. Farid Wazdi, yang telah memberikan perkuliahan Teknik Kompilasi selama pe-nulis menuntut ilmu di jurusan Teknik Informatika Institut Tek-nologi Bandung. Penulis juga mengucapkan terimakasih kepada se-genap 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 kekurangan-kekurangan yang terdapat pada buku ini karena keterbatasan peng-alaman penulis, dan berharap pembaca bersedia memberikan koreksi dan saran kepada penulis. Penulis dapat dicapai pada <[email protected]>.

Yogyakarta, Januari 2001

Firrar Utdirartatmo

Page 5: 979-756-058-1-122_kompilasi

KATA PENGANTAR v DAFTAR ISI vii DAFTAR ISTILAH xi BAB 1. PENDAHULUAN 1 1.1 Bahasa Pemrograman 1 1.2 Translator 3 1.3 Model Kompilator 5 1.4 Mutu Kompilator 11 1.5 Pembuatan Kompilator 13 LATIHAN 14 BAB 2. PERANCANGAN BAHASA PEMROGRAMAN 17 2.1 Sumber Perancangan Bahasa Pemrograman 17 2.2 Tujuan Perancangan Bahasa Pemrograman 18 2.3 Detil Rancangan 22 2.4 Skenario Perancangan 32 LATIHAN 32 BAB 3. KONSEP DAN NOTASI BAHASA 35 3.1 Hirarki Chomsky 35 3.2 Diagram Keadaan 39 3.3 Notasi BNF 40 3.4 Diagram Sintaks 40 LATIHAN 41 BAB 4. ANALISIS LEKSIKAL 43 4.1 Tugas Scanner 43 4.2 Besaran Leksik 43 LATIHAN 49

Daftar Isi

Page 6: 979-756-058-1-122_kompilasi

viii Teknik Kompilasi

BAB 5. ANALISIS SINTAKSIS 51 5.1 Pohon Sintaks 51 5.2 Metode Parsing 55 5.3 Parsing dengan Brute Force 55 5.4 Parsing dengan Recursive Descent Parser 60 LATIHAN 66

BAB 6. ANALISIS SEMANTIK, KODE ANTARA, DAN PEMBANGKITAN KODE 67

6.1 Analisis Semantik 67 6.2 Kode Antara 69 6.3 Notasi Postfix 69 6.4 Notasi N-Tuple 71 6.5 Pembangkitan Kode 73 LATIHAN 75 BAB 7. CARA PENANGANAN KESALAHAN 77 7.1 Kesalahan Program 77 7.2 Penanganan Kesalahan 78 7.3 Reaksi Kompilator pada Kesalahan 78 7.4 Error Recovery 79 7.5 Error Repair 81 LATIHAN 82 BAB 8. TEKNIK OPTIMASI 83 8.1 Dependensi Optimasi 83 8.2 Optimasi Lokal 83 8.3 Optimasi Global 85 LATIHAN 87

BAB 9. TABEL INFORMASI 89 9.1 Kegunaan Tabel Informasi 89 9.2 Implementasi Tabel Informasi 92 9.3 Interaksi Antar Tabel 96 9.4 Contoh Implementasi Tabel Simbol 96 LATIHAN 100

DAFTAR PUSTAKA 101 LAMPIRAN 1 103 LAMPIRAN 2 109 LAMPIRAN 3 121 LAMPIRAN 4 125 LAMPIRAN 5 135

Page 7: 979-756-058-1-122_kompilasi

Daftar Isi ix

LAMPIRAN 6 139 LAMPIRAN 7 141 LAMPIRAN 8 171 LAMPIRAN 9 177 LAMPIRAN 10 183 DAFTAR INDEKS 187

Page 8: 979-756-058-1-122_kompilasi

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. Da-lam lingkungan pemrograman komputer, bahasa pemrograman ber-tindak sebagai sarana komunikasi antara manusia dan permasalah-annya dengan komputer yang dipakai untuk membantu memperoleh pemecahan. Bahasa pemrograman menjembatani antara pemikiran manusia yang sering tidak terstruktur dengan kepastian yang di-perlukan oleh komputer untuk melakukan eksekusi. Suatu solusi untuk suatu masalah akan menjadi lebih mudah bila bahasa pe-mrograman 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 di-pergunakan. Bahasa pemrograman seperti ini biasanya bahasa ting-kat 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 ins-truksi dalam program direpresentasikan dengan kode numerik, yang secara fisik berupa deretan angka 0 dan 1. Sekumpulan

Pendahuluan

Page 9: 979-756-058-1-122_kompilasi

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 ope-rasi memiliki kode simbolik, misalnya ADD untuk penjumlahan (addition) dan MUL untuk perkalian (multiplication). Sekumpul-an instruksi dalam bahasa assembly bisa dibentuk menjadi makr-oinstruksi. Pada bahasa assembly tersedia alat bantu 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 yang tersedia pada DOS, dan Turbo Debugger. Instruksi dalam bahasa Assem-bly 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. Mem-berikan fasilitas yang lebih banyak, kontrol program yang ter-struktur, 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) un-tuk 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 kompi-lator untuk bahasa tingkat tinggi prosedural seperti Pascal.

Keuntungan bahasa tingkat tinggi dibandingkan bahasa ting-kat rendah sebagai berikut:

1. Kemudahan untuk dipelajari, tidak membutuhkan latar belakang pengetahuan mengenai perangkat keras (hardware)karena sifat-nya 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 kon-versi data, seperti floating point misalnya sudah tersedia. Pe-

Page 10: 979-756-058-1-122_kompilasi

Pendahuluan 3

kerjaan tersebut ditangani oleh suatu sistem yang mentranslasi-kan program bahasa tingkat tinggi ke dalam bahasa mesin.

4. 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 di-modifikasi. Ini akan mengurangi biaya pemrograman karena pro-gram lebih sederhana.

5. Program lebih mudah di-debug. Bahasa tingkat tinggi menyedia-kan konstruksi yang mengurangi kesalahan pemrograman yang biasa muncul pada bahasa tingkat rendah. Sebagai contoh, de-klarasi 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.

6. Kemampuan struktur data yang lebih baik, sehingga mem-fasilitasi pengekspresian suatu solusi dari masalah tertentu.

7. Karena ketersediaan feature seperti prosedur, bahasa tingkat tinggi memungkinkan suatu deskripsi modular dan hirarkis da-lam pemrograman. Suatu pekerjaan bisa diserahkan pada suatu tim, dan memungkinkan pembagian kerja.

8. Kompatibilitas dan dokumentasi yang lebih baik dalam pengem-bangan program

9. Tidak bergantung pada mesin (machine independent) sehingga memiliki portabilitas tinggi. Program hanya memerlukan sedikit perubahan untuk bisa dieksekusi pada mesin yang berbeda ar-sitektur 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