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

  • Mendeteksi kesalahan.
  • Melaporkan kesalahan.
  • Tindak lanjut pemulihan/perbaikan.

  • Bentuk pelaporan kesalahan :

  • Pesan kesalahan dalam bahasa alami.
  • Nama dan atibut identifier.
  • Tipe-tipe yang terkait.

  • Contoh bentuk pesan kesalahan :

    Error 162 Jumlah : unknown identifier

    Bisa diartikan :

  • Kode kesalahan = 162
  • Pesan kesalahan = unknown identifier
  • Nama identifier = Jumlah

  • 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).

  • Kompilator crash : berhenti atau hang.
  • Looping : Kompilator masih berjalan tapi tidak pernah berakhir karena looping tak hingga
  • Menghasilkan program obyek yang salah; kompilator melanjutkan proses sampai selesai, tapi program obyek yang dihasilkan salah, dan baru diketahui setelah program dieksekusi.

  • 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 :

  • Reaksi yang sudah dapat dilakukan, yaitu kompilator melaporkan error dan selanjutnya melakukan perbaikan dan melanjutkan proses kompilasi sampai ditemukan error lain atau sampai menghasilkan program objek yang valid.
  • Reaksi yang belum dapat dilakukan, yaitu kompilator mengoreksi kesalahan, lalu menghasilkan program objek sesuai dengan yang diinginkan programmer. Diperlukan semacam sistem pakar atau kecerdasan buatan untuk mengimplementasi kompilator semacam ini.




  • 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

  • Panic mode
  • Maju terus dan mengabaikan teks sampai bertemu delimiter (misal ; )

  • Unit deletion
  • 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 :

  • Tipe identifier
  • Diatasi dengan membangkitkan identifier dummy, misalnya :


    Var A:= string; begin A:=0; end;

    Kesalahan diperbaiki dengan membangkitkan identifier baru, mis: B yang bertipe integer.


  • Tipe konstanta
  • 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 :

  • Inisialisasi/pemberian nilai awal variable loop.
  • Test, apakah variable loop telah mencapai batas.
  • Penyesuaian, yaitu penembahan atau pengurangan nilai variable loop dengan nilai tertentu.
  • Operasi yang terjadi pada blok loop.
  • Pada setiap perulangan akan terjadi test dan penyesuaian yang menambah waktu eksekusi.


    Contoh :


    For I:= 1 to 2 do A[I] := 0;

    Memerlukan 1 instruksi inisialisasi, masing-masing 2 kali instruksi untuk test, penyesuaian, dan assignment.

    Dapat dioptimasi menjadi :


    A[1] := 0; A[2] := 0;

    Yang hanya memerlukan dua instruksi assignment saja.


    b. Frequency Reduction

    Pemindahan statement ke tempat yang lebih jarang dieksekusi.


    Contoh :


    For I := 1 to 10 do Begin X := 5; A := A + I; End;

    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 :


    X:=5; If X=0 then A:= A+ 1;

    2. Unused parameter pada prosedur


    Contoh :


    Procedure Jumlah(a,b,c : integer); Var x : integer; begin x:=a+b; end;

    3. Unused variable dalam program


    Contoh :


    Program Contoh1; Var a, b : integer; begin a:=5; end;

    4. Variabel yang dipakai tanpa nilai awal


    Contoh :


    Program Contoh2; var a, b : onteger; begin a:=5; a:=a+b; end;

    Kegunaan bagi kompilator :

    1. Meningkatkan efisiensi eksekusi program

    2. Menghilangkan useless code