Powered By Blogger

Selasa, 09 Juli 2013

Teknik Kompilasi



Kesalahan Program
Kesalahan Program dapat berupa
ü  Kesalahan leksikal
       Kesalahan dalam mengetik/mengeja 
       Misal THEN dituliskan dengan TEN atau THN
ü  Kesalahan Sintaks
       misalnya dalam  operasi aritmatika dengan tanda kurung yang jumlahnya kurang, contoh
       A:= X + (B * (C+D)
ü  Kesalahan Semantics
       Tipe data yang salah
Contoh : VAR c : integer;
                       c = 1.5 * 0.78
       Variable belum didefinisikan
Misal :     B := B + 1
tetapi b belum didefinisikan

Error Handling - Penanganan Kesalahan
ü  Misal: compiler menemukan kesalahan, yang bisa meliputi
       Kode kesalahan
       Pesan Kesalahan dalam bahasa alami
       Nama dan atribut identifier
       contoh : error 162 Jumlah: Unknow identifier
       Dapat diartikan: Kode kesalahan =162, pesan kesalahan = unknown identifier, nama identifier = jumlah
Error Handling - Reaksi terhadap Kesalahan
ü  Reaksi-reaksi yang tidak dapat diterima
l  Compilator crash: Berhenti atau hang
l  Looping : compilator tidak bisa berhenti (infinite/onbounded loop)
l  Menghasilkan Obyek program yang salah : berbahaya, bisa diketahui/muncul setelah program dieksekusi
ü  Reaksi yang benar, tapi kurang dapat diterima dan kurang bermanfaat
l  Compilator menemukan kesalahan pertama, melaporkannya, lalu berhenti (halt)
l  Pemrogram membuang waktu untuk melakukan pengulangan compilasi untuk setiap kali terdapat sebuah error

Error Handling - Error Recovery
Bertujuan mengembalikan parser ke kondisi stabil agar supaya dapat melanjutkan proses parsing ke posisi selanjutnya.
ü  Mekanisme Ad Hoc
l  Recovery yang dilakukan tergantung dari si pembuat compiler
l  Tidak terikat pada suatu aturan tertentu
l  Disebut juga dengan istilah purpose error recovery
ü  Syntax directed Recovery
misal  begin
               A := A + 1  ; 
                 B := B + 1;
                 C := C + 1
            end ;

Pada contoh diatas, compiler akan mengenali sebagai (dalam Notasi BNF)
                begin  <statement>  ?  ,  statement>  ;  <statement> end;
? Akan diperlakukan sebagai ‘;
*        Second Error Recovery : untuk melokalisir kesalahan
l  Panic Mode
       Maju terus sampai ketemu delimiter
       Contoh : IF A = 1  Kondisi :=  true;
       Pada kondisi diatas THEN  tidak ada, compiler melanjutkan sampai ketemu delimiter (;)
l  Unit Deletion
       Menghapus keseluruhan suatu unit sintaksik (misalnya : <block>, <exp>, <statement> dan sebagainya
       Mempermudah untuk melakukan error repairing

Error Handling - Error repair
Memperbaiki kesalahan dan membuat source program valid (memodifikasi)
ü  Mekanisme Ad Hoc
l  Tergantung pada sipembuat compiler
ü  Syntax directed Repair
l  Menyisipkan / membuang simbol terminal yang dianggap hilang atau yang menyebabkan error
l  contoh  WHILE A < 1
                       I := I = 1;
l  compiler akan menyisipkan DO
l  Contoh  lain
    Procedure Increment ;
    begin
        x := X + 1
     end;
    end;
l  Kelebihan simbol end, yang menyebabkan kesalahan, maka compiler akan membuangnya
ü  Context Sensitive Repair
l  Tipe identifier: membuat identifier dummy
                var A : String
                begin
                 A := 0;
                end
maka compilator akan memperbaiki kesalahan dengan membuat identifier baru , misalnya B bertipe integer
l  Spelling Repair: memperbaiki kesalahan pengetikan pada identifier, misalnya:
    WHILLE  A = 1 DO
identifier yang salah tersebut diperbaiki menjadi  WHILE

Teknik Optimasi : Optimasi  Lokal
Optimasi Lokal : adalah optimasi yang dilakukan hanya pada suatu blok dari source code, dengan cara:
ü  Folding
menganti konstata atau ekpresi yang bisa  dievaluasi pada saat compile time dengan nilai komputasinya. Misalnya:
A := 2 + 3 + B  bisa diganti dengan  A:= 5 + B 
5 dapat mengantikan ekspresi 2 + 3
ü  Redundant-Subexpression Elimination
hasilnya digunakan lagi dari pada dilakukan computasi ulang, contoh:
A:= B + C
X := Y + B + C
ü  Optimasi dalam sebuah  Iterasi
l  Loop Unrrolling:Menganti suatu loop  dengan menulis statement yang ada dalam loop ditulis beberapa kali
l  Karena sebuah iterasi pada implemnetasi ke level rendah, memerlukan :
       Inisialisasi nilai awal, pada loop dilakukan sekali pada saat permulaan eksekusi loop
       Penge-test-an, apakah variabel loop telah mencapai kondisi terminasi
       Adjustment yaitu: penambahan atau pengurangan nilai pada variabel loop dengan jumlah tertentu
       Operasi yang terjadi  pada tubuh perulangan (loop body)
n  Contoh :
FOR I := 1 to 2 DO
     A[I] := 0;
dapat dioptimasikan menjadi
A[1] := 0;
A[2] := 0;
n  Frequency Reduction: Pemindahan statement ke tempat yang lebih jarang dieksekusi, contoh
FOR I:= 1 to 10 DO                 X := 5     
BEGIN                                    FOR I:= 1 to 10 DO 
   X := 5                                   BEGIN
   A := A + 1                                                 A := A + 1
END:                                       END:

ü  Strength Reduction
      Penggantian suatu operasi dengan operasi lain yang lebih cepat dieksekusi
      misalnya: pada komputer operasi perkalian memerlukan waktu eksekusi lebih banyak dari pada operasi penjumlahan
      contoh lain
                                A:= A + 1
      dapat digantikan dengan
                                INC(A)

Teknik Optimasi : Optimasi  Global
      Unused parameter : parameter yang tidak pernah digunakan dalam procedure
       Misalnya :
                procedure penjumlahan(a,b,c ; Integer);
                                var x : integer;
                                begin
                                   x := a + b;
                                end
Parameter c  tidak pernah digunakan sehingga tidak perlu diikut sertakan

       Variabel : variabel yang dipakai tanpa nilai awal. Contoh
Program Awal;
var a, b: integer
begin
                 a := 5
    a := a + b;
end;
n  variabel b digunakan tetapi tidak memiliki harga awal
ü  Bagi Compiler
      Meningkatkan  efisiensi eksekusi program
      Menghilangkan useless code/kode yang tidak terpakai
ü  var A, B, C, D, E, I, J, X, Y : integer;
ü  begin
ü                    B := 5;
ü        A := 10 - B / 4 * 3 + 2;
ü        C :=  A + B;
ü        Y := 10;
ü        D := A + B – E;
ü  for  I := 1 to 85 do
ü  begin
ü                  X := X + 1;
ü                  B := B – X;
ü                  Y := 7;
ü  end
ü  While Y< 5 do
ü                  E := E – B;
ü  end

Pemrograman Visual



PINJAMAN

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;


class Peminjaman
{
                public Peminjaman()
                {
                                try
                                {
                                                Class.forName("org.sqlite.JDBC");
                                }
                                catch (Exception e)
                                {
                                                System.out.println("Tedapat Kesalahan pada Koneksi ODBC Anda:"+e);
                                }
                               
                                final JFrame frame=new JFrame("Transaksi Peminjaman");
                                JLabel lNoAnggota=new JLabel("No Anggota           :");
                                JLabel lNama=new JLabel("Nama                     :");
                                JLabel lKodeBuku=new JLabel("Kode Buku           :");
                                JLabel lJudul=new JLabel("Judul                    :");
                                JLabel lTglPinjam=new JLabel("Tgl Pinjam         :");
                                JLabel lTglKembali=new JLabel("Tgl Kembali       :");
                                final JTextField NoAnggota=new JTextField(5);
                                final JTextField Nama=new JTextField(15);
        final JTextField KodeBuku=new JTextField(5);
        final JTextArea Judul=new JTextArea(5,15);
              JScrollPane Scroll=new JScrollPane(Judul,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        final JTextField TglPinjam=new JTextField(15);
        final JTextField TglKembali=new JTextField(15);
       
        JButton Save=new JButton("Save");
        Save.setMnemonic('S');
        Save.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent ae)
                {
                String sql="insert into Peminjaman values('"+NoAnggota.getText()+"','"+KodeBuku.getText()+"','"+Judul.getText()+"','"+TglPinjam.getText()+"','"+TglKembali.getText()+"')";
                if(NoAnggota.getText().trim().equals("")||Nama.getText().trim().equals("") 
                ||KodeBuku.getText().trim().equals("")||Judul.getText().trim().equals("")
                ||TglPinjam.getText().trim().equals("")||TglKembali.getText().trim().equals(""))
            {
                JOptionPane.showMessageDialog(frame,"Data Belum Lengkap!Silahkan Lengkapi",
                "Save Data",JOptionPane.WARNING_MESSAGE);
                NoAnggota.requestFocus();
            }
            else
            {
                try
                {
                Connection connection=DriverManager.getConnection("JDBC:sqlite:datapinjam.db","","");
                Statement statement=connection.createStatement();
                statement.executeUpdate(sql);
                JOptionPane.showMessageDialog(frame,"Data Sudah Tersimpan",
                "Save Data",JOptionPane.WARNING_MESSAGE);
               
                NoAnggota.setText("");
                Nama.setText("");
                KodeBuku.setText("");
                Judul.setText("");
                TglPinjam.setText("");
                TglKembali.setText("");
                NoAnggota.requestFocus();
                statement.close();
                connection.close();
                }
            catch(Exception e)
                {
                System.out.println("Kesalahan pada Database Anda:"+e);
                }
            }
            }
        });
       
        JButton Browse=new JButton("Browse");
        Browse.setMnemonic('B');
        Browse.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent ae)
                {
                String sql="select * from Peminjaman where NoAnggota='"+NoAnggota.getText()+"'";
            try
            {
            Connection con=DriverManager.getConnection("JDBC:sqlite:datapinjam.db","","");
                Statement statement=con.createStatement();
            ResultSet rs=statement.executeQuery(sql);
            if(rs.next())
            { 
                NoAnggota.setText(rs.getString(1));
                Nama.setText(rs.getString(2));
                KodeBuku.setText(rs.getString(3));
                Judul.setText(rs.getString(4));
                TglPinjam.setText(rs.getString(5));
                TglKembali.setText(rs.getString(6));
                NoAnggota.requestFocus();
            }
            else
            {
                NoAnggota.setText("");
                Nama.setText("");
                KodeBuku.setText("");
                Judul.setText("");
                TglPinjam.setText("");
                TglKembali.setText("");
                JOptionPane.showMessageDialog(frame,"No Anngota tidak Ada","Browse Data",JOptionPane.WARNING_MESSAGE);
                NoAnggota.requestFocus();
            }
            statement.close();
            con.close();
            } 
            catch(Exception exc)
                {
                System.out.println("Kesalahan pada Database Anda:"+exc);
                }
            }
          });
       
        JButton Delete=new JButton("Delete");
        Delete.setMnemonic('D');
        Delete.addActionListener(new ActionListener()
            {
            public void actionPerformed(ActionEvent ae)
                {
                NoAnggota.setText("");
                Nama.setText("");
                KodeBuku.setText("");
                Judul.setText("");
                TglPinjam.setText("");
                TglKembali.setText("");
                NoAnggota.requestFocus();
                }
            }); 
               
        JButton Exit=new JButton("Exit");
        Exit.setMnemonic('E');
        Exit.addActionListener((new ActionListener()
            {
            public void actionPerformed(ActionEvent e)
               {
               frame.setVisible(false);
               }
            }));                 
 
        JPanel panel1=new JPanel();
        JPanel panel2=new JPanel();
        JPanel panel3=new JPanel();
        JPanel panel4=new JPanel();
        JPanel panel5=new JPanel();
        JPanel panel6=new JPanel();
        JPanel panel7=new JPanel();
       
        panel1.setLayout(new FlowLayout());
        panel2.setLayout(new FlowLayout());
        panel3.setLayout(new FlowLayout());
        panel4.setLayout(new FlowLayout());
        panel5.setLayout(new FlowLayout());
        panel6.setLayout(new FlowLayout());
        panel7.setLayout(new FlowLayout());
       
        panel1.add(lNoAnggota);
        panel1.add(NoAnggota);
        panel2.add(lNama);
        panel2.add(Nama);
        panel3.add(lKodeBuku);
        panel3.add(KodeBuku);
        panel4.add(lJudul);
        panel4.add(Judul);
        panel4.add(Scroll);
        panel5.add(lTglPinjam);
        panel5.add(TglPinjam);
        panel6.add(lTglKembali);
        panel6.add(TglKembali);
        panel7.add(Save);
        panel7.add(Browse);
        panel7.add(Delete);
        panel7.add(Exit);
        
       
       
        Container konten;
        konten=frame.getContentPane();
        konten.setLayout(new GridBagLayout());
        GridBagConstraints pos=new GridBagConstraints();
        pos.anchor=GridBagConstraints.WEST;
        pos.gridx=1;
        pos.gridy=1;
       
        konten.add(panel1,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel2,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel3,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel4,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel5,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel6,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;
       
        konten.add(panel7,pos);
        pos.gridx++;
        pos.gridy++;
        pos.gridx=1;

       
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }
    public static void main(String args[])
                {
                                Peminjaman frmPeminjaman = new Peminjaman();
                } }