Makalah
Kelompok
9 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 dibagi menjadi
:
- 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.
- 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 adalah optimasi yang dilakukan hanya pada
suatu blok dari source code, cara-caranya sebagai berikut:
- 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
- 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.
- Optimisasi dalam sebuah iterasi.
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.
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;
- 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:
a)
Bagi pemrogram menginformasikan :
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
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.
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.
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.
b)
Bagi kompilator:
Meningkatkan efisiensi eksekusi program.
Menghilangkan useless code/kode yang tidak
terpakai.
Kelompok
10 Tabel Informasi
TABEL INFORMASI / SIMBOL
Fungsi Tabel Informasi atau Tabel Simbol :
ü Membantu
pemeriksaan kebenaran semantik dari program sumber.
ü Membantu
dan mempermudah pembuatan intermediate code dan proses pembangkitan
kode.
Untuk mencapai fungsi tersebut dilakukan dengan
menambah dan mengambil atribut variabel
yang dipergunakan pada program dari tabel. Atribut, misalnya nama, tipe, ukuran
variabel.
Tabel Simbol berisi daftar dan informasi identifier
pokok yang terdapat dalam program sumber, disebut Tabel Pokok / Utama.
Tabel Pokok belum mengcover semua informasi, untuk
itu disediakan tabel lagi sebagai pelengkap Tabel Pokok.
Untuk mengacu pada tabel simbol yang bersesuaian
dengan suatu indentifier tertentu, maka pada Tabel Pokok harus
disediakan field yang bisa menjembatani identifier dari Tabel Pokok ke
tabel-tabel lain yang bersesuaian.
Untuk itu, pemilihan elemen tabel pada Tabel Pokok
maupun tabel lainnya, merupakan sesuatu yang sangat penting.
Elemen pada Tabel Simbol bermacam-macam, tergantung
pada jenis bahasanya.
Misalnya :
- No urut identifier : Menentukan nomor urut identifier dalam tabel simbol.
- Nama identifier : Berisi nama-nama identifier (nama variabel, nama tipe, nama konstanta, nama procedure, nama fungsi, dll) yang terdapat pada program sumber. Nama-nama ini akan dijadikan referensi pada waktu analisa semantik, pembuatan intermediate code, serta pembangkitan kode.
- Tipe identifier : Berisi keterangan/informasi tipe dari record dan string, maupun procedure dan function.
- Object time address : address yang mengacu ke alamat tertentu.
- Dimensi dari identifier yang bersangkutan.
- Nomor baris variabel dideklarasikan.
- Nomor baris variabel direferensikan.
- Field link.
Beberapa jenis :
- Tabel Identifier : Berfungsi menampung semua dentifier yang terdapat dalam program.
- Tabel Array : Berfungsi menampung informasi tambahan untuk sebuah array.
- Tabel Blok : Mencatat variabel-variabel yang ada pada blok yang sama.
- Tabel Real : menyimpan elemen tabel bernilai real.
- Tabel String : Menyimpan informasi string.
- Tabel Display : Mencatat blok yang aktif.
Tabel Identifier
Memiliki field :
ü No
urut identifier dalam tabel
ü Nama
identifier
ü Jenis/obyektif
dari identifier : Prosedur, fungsi, tipe, variabel, konstanta
ü Tipe
dari identifier yang bersangkutan : integer, char, boolean, array,
record, file, no-type
ü Level
: Kedalaman identifier tertentu, hal ini menyangkut letak identifier
dalam program. Konsepnya sama dengan pembentukan tree, misal main program
= level 0. Fiel ini digunakan pada run time untuk mengetahui current
activation record dan variabel yang bisa diakses.
Untuk identifier yang butuh penyimpanan
dicatat pula :
•
Alamat relatif/address dari identifier
untuk implementasi
•
Informasi referensi (acuan) tertentu ke
alamat tabel lain yang digunakan untuk
mencatat informasi-informasi yang diperlukan yang menerangkannya.
•
Link
: Menghubungkan identifier ke identifier
lainnya, atau yang dideklarasikan pada level yang sama.
•
Normal : Diperlukan pada pemanggilan
parameter, untuk membedakan parameter by value dan reference
(berupa suatu variabel boolean)
Contoh , terdapat
listing program sebagai berikut :
Program A;
var B : integer;
Procedure X(Z:char);
var C : integer
Begin
…….
Tabel Identifier
akan mencatat semua identifier :
0 A
1 B
2 X
3 Z
4 C
Contoh implementasi
tabel identifier :
TabId: array [0..tabmax] of
record
name : string;
link : integer;
obj : objek;
tipe
: types;
ref : integer;
normal : boolean;
level :
0..maxlevel;
address : integer;
end;
Di mana : objek = (kontant, variabel, prosedur,
fungsi)
types = (notipe, int, reals, booleans, chars,
arrays, record)
Tabel Array
Memiliki field :
ü No
urut suatu array dalam tabel
ü Tipe
dari indeks array yang
bersangkutan
ü Tipe
elemen array
ü Referensi
dari elemen array
ü Indeks
batas bawah array
ü Indeks
batas atas array
ü Jumlah
elemen array
ü Ukuran
total array ( total size = (atas-bawah+1) x elemen size)
ü Elemen
size
(ukuran tiap elemen)
Tabel Array diacu dengan field referensi pada
Tabel Identifier.
Contoh implementasi Tabel Array :
TabArray
: array [1...tabmax] of
record
indextype,
elementype : types;
elemenref,
low, high, elemensize, tabsize : integer
end;
Tabel Blok
Memiliki field :
ü No
urut blok
ü Batas
awal blok
ü Batas
akhir blok
ü Ukuran
parameter / parameter size
ü Ukuran
variabel / variabel size
ü Last
variable
ü Last
parameter
Contoh implementasi
tabel blok :
TabBlok: array [1..tabmax] of
record
lastvar, lastpar, parsize,
varsize: integer;
end;
Dari contoh listing
program berikut :
Program a;
var B: integer;
Procedure X(Z:char);
var C : integer
Begin
…….
Akan diperoleh, untuk blok Program A :
last
variable = 2
variable
size = 2 (dianggap integer butuh dua byte)
last
parameter = 0 (tanpa parameter)
parameter
size = 0
Untuk blok Procedure X :
last
variable = 4
variable
size = 2
last
parameter = 3
parameter
size = 1 (dianggap char butuh satu byte)
Tabel Real
Elemen tabel real :
ü No
urut elemen
ü Nilai
real suatu variabel real yang mengacu ke indeks tabel ini
Contoh implementasi tabel real :
TabReal
: array [1..tabmax] of real
(pemikiran : setiap tipe yang dimiliki oleh suatu
bahasa akan memeiliki tabelnya sendiri)
Tabel String
Elemennya :
ü No
urut elemen
ü Karakter-karakter
yang merupakan konstanta
Contoh implementasi tabel string :
TabString
: array [1..tabmax] of string
Tabel Display
Elemennya :
ü No
urut tabel
ü Blok
yang aktif
Pengisian tabel display dilakukan dengan konsep
stack. Urutan pengaksesan : Tabel
Display – Tabel Blok – Tabel Simbol.
Contoh implementasi Tabel Display :
TabDisplay
: array [1..tabmax] of integer
Interaksi Antar Tabel
Pertama kali tabel display akan menunjuk blok mana
yang sedang aktif. Dari blok yang aktif ini, akan diketahui
identifier-identifier yang termasuk dalam blok tersebut. Untuk pertama kalinya,
yang akan diacu adalah identifier yang paling akhir, kemudian identifier
sebelumnya, dan seterusnya. Informasi suatu identifier ini mungkin belum
lengkap. Untuk itu dari tabel identifier ini mungkin akan dicari kelengkapan
informasi dari suatu identifier ke tabel yang sesuai (tabel real, tabel string,
atau tabel array).
Komentar
Posting Komentar