Kamis, 09 Juni 2011

TEKNIK KOMPILASI (TEKNIK OPTIMASI)

TEKNIK OPTIMASI

Dependensi optimasi. Tahapan optimasi kode bertujuan untuk menghasilkan kode program yang berukuran lebih kecil dan lebih cepat eksekusinya. Berdasarkan ketergantungannya pada mesin, optimasi di bagi  menjadi :
  1. Machine Dependent Optimizer. Kode dioptimasi sehingga lebih efisien pad mesin tertentu. Optimasi ini memerlukan informasi mengenai feature yang ada pada mesin tujuan dan mengambil keuntungan darinya untuk menghasilkan kode yang lebih pendek atau dieksekusi lebih cepat.
  2. Machine Independent Optimizer. Strategi optimasi yang bisa diaplikasikan tanpa tergantung pada mesin tujuan tempat kode yang dihasilkan akan dieksekusi nantinya. Mesin ini meliputi optimasi lokal dan optimasi global.
OPTIMASI LOKAL
Optimasi Lokal adalah optimasi yang dilakukan hanya pada suatu blok dari source code, cara-caranya sebagai berikut:
  1. Folding. Mengganti konstansta atau ekspresi yang bisa dievaluasi pada saat compile time dengan nilai komputasinya. Misalkan Instruksi ;
A:=2+3+B

bisa diganti menjadi

A:=5+B

  1. Redundant-Subexpression Elimination. Sebuah ekspresi yang sudah pernah dikomputasi, digunakan lagi hasilnya, ketimbang melakukan komputasi ulang. Misalkan terdapat urutan instruksi :
A:=B+C
X:=Y+B+C

kemunculan kedua dari B+C yang redundan bisa diatasi dengan memanfaatkan hasil komputasinya yang sudah ada pada instruksi sebelumnya. Perhatikan, hal ini bisa dilakukan dengan catatan belum ada perubahan pada variabel yang berkaitan.

  1. Optimisasi dalam sebuah iterasi.
a.     Loop Unrolling: Menggantikan suatu loop dengan menulis statement dalam loop beberapa kali. Hal ini didasari pemikiran, sebuah iterasi pada implementasi level rendah akan memerlukan operasi sebagai berikut.
      Inisialisasi/pemberian nilai awal pada variabel loop. Dilakukan sekali pada saat permulaan eksekusi loop.
      Pengujian, 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).
Dalam setiap perulangan akan terjadi pengujian dan adjusment yang menambah waktu eksekusi. Contoh pada instruksi :

FOR I:=1 to 2 DO
A[I]:=0;

terdapat instruksi untuk inisialisasi I menjadi 1. serta operasi penambahan nilai/increment 1 dan pengecekan variabel I pada setiap perulangan. Sehingga untuk perulangan saja memerlukan lima instruksi, ditambah dengan instruksi assignment pada tubuh perulangan menjadi tujuh instruksi. Dapat dioptimasikan menjadi :

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

yang hanya memerlukan dua instruksi assignment saja. Untuk menentukan optimasi ini perlu dilihat perbandingan kasusnya dengan tanpa melakukan optimasi.
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;

kita ,melihat bawa tidak terjadi perubahan /manipulasi pada variabel X didalam iterasi, karena itu kita bisa mengeluarkan instruksi tersebut keluar iterasi, menjadi:

X:=5;
FOR I:=1 TO 10 DO
BEGIN
A:=A+I
END;
  1. Strength Reduction. Penggantian suatu 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 tertentu dengan penjumlahan. Contoh lain, instruksi :
A:=A+1;
dapat digantikan dengan: INC(A);



OPTIMISASI GLOBAL

Optimisasi global biasanya dilakukan dengan analisis flow, yaitu suatu graf berarah yang menunjukkan jalur yang mungkin selama dieksekusi program. Kegunaannya adalah sebagai berikut:  
1.    Bagi pemrogram menginformasikan :
    a. Unreachable/dead code: kode yang tidak akan pernah dieksekusi. Misalnya terdapat urutan      
        instruksi:   
        
        X:=5;
        IF X:=0 THEN 
        A:=A+1 
       
        Instruksi A:=A+1 tidak akan pernah dieksekusi
    b. Unused parameter pada prosedur: parameter yang tidak akan pernah digunakan didalam prosedur
        Contohnya : 
        
        Procedure Jumlah (a,b,c:integer);
         var x: integer 
         begin 
            x:=a+b 
         end;
       
         kita lihat parameter c tidak pernah digunakan didalam prosedur, sehingga seharusnya tidak perlu     
         diikutrestakan. 
    c. Unused Variable: Variabel yang tidak pernah dipakai dalam program. Contohnya : 
        
        Program Pendek; 
        var a,b:integer; 
        begin 
            a:=5; 
        end; 
        
        variabel b tidak pernah digunakan dalam program sehingga bisa dihilangkan.
   d.   Variabel yang dipakai tanpa nilai awal. Contohnya: 
         
         Program awal;
         var a,b: integer; 
         begin 
            a:=5; 
            a:=a+b; 
         end;
         
         kita lihat variabel b digunakan tanpa memiliki nilai awal/belum di-assign.
2.  Bagi kompilator:
  •   Meningkatkan efisiensi eksekusi program.
  • Menghilangkan useless code/kode yang tidak terpakai.

Tidak ada komentar: