Kompetensi Dasar :
3.17 Menganalisis penanganan kesalahan pada program
4.17 Melakukan perbaikan penanganan kesalahan pada program
Materi Pokok :
1. Bentuk Kesalahan Program.
2. Memperbaiki program penanganan kesalahan dalam aplikasi web.
Bentuk Kesalahan Program
1. Kesalahan leksikal
Contoh kesalahan mengeja keyword, seperti "then" ditulis sebagai "ten".
2. Sintaks
Seperti contoh operasi aritmatika dengan jumlah parenthesis (tanda kurung) yang tidak pas, seperti :
A := X +(B*(C+D)
3. Semantik
Ada beberapa macam kesalahan semantik :
a. Tipe data yang salah
Var siswa : integer
tetapi selanjutnya ada instruksi yang melakukan operasi string terhadap variabel siswa
b. Penggunaan variabel yang belum didefinisikan atau dideklarasikan
Langkah – langkah penanganan kesalahan
Bentuk pelaporan kesalahan :
Contoh bentuk pesan kesalahan :
Error 162 Jumlah : unknown identifier
Bisa diartikan :
Adanya pesan kesalahan tersebut akan memudahkan programmer dalam mencarai dan melakukan perbaikan kesalahan.
Reaksi kompilator pada Kesalahan
1. Reaksi-reaksi yang tidak dapat diterima (tidak melaporkan error).
2. Reaksi yang benar tapi kurang dapat diterima dan kurang bermanfaat
Kompilator menemukan kesalahan pertama, melaporkan nya, lalu berhenti (halt). Ini bisa muncul bila pembuat kompilator menganggap jarang terjadi kesalahan dalam program, sehingga kemampuan kompilator untuk mendeteksi kesalahan hanya satu untuk setiap kali kompilasi. Programmer akan menghabiskan banyak waktu untuk mengulang-ulang proses kompilasi setiap kali ditemukan satu error.
3. Reaksi-reaksi yang dapat diterima :
Error Recovery
Error Recovery adalah pemulihan kesalahan bertujuan untuk mengembalikan parser ke kondisi stabil, supaya bisa melanjutkan proses parsing ke posisi selanjutnya. Strategi untuk melakukan error recovery sebagai berikut :
1. Mekanisme Ad Hoc (special purpose error recovery) Recovery yang dilakukan tergantung dari pembuat kompilator sendiri/spesifik, dan tidak terikat pada suatu aturan tertentu.
2. Syntax detected recovery Melakukan recovery berdasarkan sintaks yang sudah ditentukan.
3. Secondary Error Recovery, berguna untuk melokalisir error
Maju terus dan mengabaikan teks sampai bertemu delimiter (misal ; )
Menghapus keseluruhan suatu unit sintaktik (misal : <block>, <exp>, <statement>). Efeknya mirip dengan panic mode tetapi unit deletion memelihara kebenaran sintaks dari source program dan mempermudah untuk melakukan error repiring lebih lanjut.
4. Context sensitive Recovery
Berkaitan dengan semantik, misal bila terdapat variabel yang belum dideklarasikan (undefined variable) maka diasumsikan tipenya berdasar kemunculannya.
Error Repair
Error Repair adalah perbaikan kesalahan bertujuan untuk memodifikasi source program dari kesalahan dan membuatnya valid, sehingga memungkinkan kompilator untuk melakukan translasi program. Mekanisme error repair meliputi :
1. Mekanisme Ad Hoc Tergantung dari pembuat kompilator sendiri
2. Syntax directed repair Menyisipkan simbol terminal yang dianggap hilang atau membuang simbol terminal penyebab kesalahan. Contoh : while A < 1 I := I + 1
3. Context Sensitive Repair Dilakukan pada :
Diatasi dengan membangkitkan identifier dummy, misalnya :
|
Kesalahan diperbaiki dengan membangkitkan identifier baru, mis: B yang bertipe integer.
Memperbaiki dengan membangkitkan konstanta baru dengan tipe yang tepat.
4. Spelling Repair
Memperbaiki kesalahan pengetikan identifier, misal :
WHILLE A=1 Do
Identifier yang salah tersebut akan diperbaiki menjadi while
Dependensi Optimasi
1. Machine Dependent Optimizer
Code di optimasi sehinga lebih efisien dimesin tertentu. Optimasi ini memerlukan informasi mengenai feature yang ada pada mesin tujuan dan mengambil keuntungan darinya untuk menghasilkan code yang lebih pendek sehingga dieksekusi lebih cepat.
2. Machine Independent Optimizer
Startegi optimasi yang bisa diaplikasikan tanpa tergantung pada mesin tujuan tempat code akan dieksekusi nantinya.
Optimasi Lokal
Optimasi Lokal adalah optimasi yang dilakukan hanya pada satu blok dari source code. Berikut cara-caranya :
1. Folding
Mengganti konstanta atau ekspresi yang bisa dievaluasi pada saat compile time dengan nilai komputasinya.
Contoh :
A := 2 + 3 + B
bisa diganti menjadi :
A := 5 + B
2. Redundant-Subexpression Elimination
Sebuah ekspresi yang sudah pernah dikomputasi, digunakan lagi hasilnya, tanpa melakukan komputasi ulang.
Contoh :
A := B + C
X := Y + B + C
kemunculan berturut-turut dari ekspresi B+C memungkinkan hasil komputasi ekspresi B+C sebelumnya dapat digunakan pada ekspresi yang kedua.
3. Optimasi dalam sebuah iterasi
a. Loop Unrolling
Menggantikan suatu loop dengan menulis statement dalam loop beberapa kali, hal ini berdasarkan pemikiran bahwa sebuah iterasi pada implementasi tingkat rendah akan memerlukan operasi :
Pada setiap perulangan akan terjadi test dan penyesuaian yang menambah waktu eksekusi.
Contoh :
|
Memerlukan 1 instruksi inisialisasi, masing-masing 2 kali instruksi untuk test, penyesuaian, dan assignment.
Dapat dioptimasi menjadi :
|
Yang hanya memerlukan dua instruksi assignment saja.
b. Frequency Reduction
Pemindahan statement ke tempat yang lebih jarang dieksekusi.
Contoh :
|
Statement X := 5; dapat diletakkan diluar loop.
4. Strength Reduction
Penggantian suatu jenis operasi dengan jenis operasi lain yang lebih cepat dieksekusi. Misalkan pada beberapa komputer, operasi perkalian memerlukan waktu lebih banyak untuk dieksekusi dari pada operasi penjumlahan, maka penghematan waktu bisa dilakukan dengan mengganti operasi perkalian dengan operasi penjumlahan.
Contoh lain :
menggantikan operasi A:= A+1; dengan operasi INC(A);
Optimasi Global
Kegunaan bagi Programmer, menginformasikan adanya :
1. Unreachable/dead code
yaitu code yang tidak akan pernah diekseskusi
Contoh :
|
2. Unused parameter pada prosedur
Contoh :
|
3. Unused variable dalam program
Contoh :
|
4. Variabel yang dipakai tanpa nilai awal
Contoh :
|
Kegunaan bagi kompilator :
1. Meningkatkan efisiensi eksekusi program
2. Menghilangkan useless code