Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Chapter 17 Pembentukan Kode Intermediate. Kode intermediate:  representasi lanjutan/intermediate dari suatu sumber program.  Jenis representasi intermediate:

Presentasi serupa


Presentasi berjudul: "Chapter 17 Pembentukan Kode Intermediate. Kode intermediate:  representasi lanjutan/intermediate dari suatu sumber program.  Jenis representasi intermediate:"— Transcript presentasi:

1 Chapter 17 Pembentukan Kode Intermediate

2 Kode intermediate:  representasi lanjutan/intermediate dari suatu sumber program.  Jenis representasi intermediate: - pohon sintak - notasi posfik - kode tiga alamat

3 Kode tiga alamat :  barisan statement-statement yang masing-masing biasanya memuat tiga alamat, dua alamat untuk operand dan satu alamat untuk hasil.  Bentuk umumnya: x := y op z

4 Kode tiga alamat (cont.)  Bentuk umumnya: x := y op z  dimana x,y dan z adalah nama- nama, konstanta atau nama sementara yang dibentuk oleh compiler. op adalah sembarang operator seperti operator aritmetika atau logikal.

5 Kode tiga alamat (cont.)  Contoh : a := b * -c + b * -c, kode tiga alamatnya sbb: t 1 := -c t 2 := b * t 1 t 3 := -c t 4 := b * t 3 t 5 := t 2 + t 4 a := t 5

6 Jenis-jenis statement tiga alamat  Statement tiga alamat: sejenis kode asembel. Bisa terdiri dari label simbol dan statement flow of control (if, while, dsb).  Label simbol merepresentasikan indeks dari statement tiga alamat dalam suatu array yang menyimpan kode intermediate.

7 Jenis-jenis statement tiga alamat  x := y op z, dimana op adalah operator biner.  x := op y, dimana op adalah operator unari.  x := y  goto L, lompatan tak bersyarat.  if x relop y goto L, lompatan bersyarat.  param x dan call p,n untuk pemanggilan prosedur dan juga return y.  statement berindeks x := y[i] dan x[i] := y.  x := &y, x := *y, *x := y.

8 Jenis-jenis statement tiga alamat (cont.)  Pembentukan kode tiga alamat didefinisikan dalam bentuk Definisi berdasarkan sintaks atau Skema Translasi.  Dalam prosesnya, nama sementara dibuatkan untuk setiap node interior di dalam pohon sintaksnya.

9 Jenis-jenis statement tiga alamat (cont.)  Dalam pembentukan kode tiga alamat untuk ekspresi: E.place merupakan nama yang akan menyimpan nilai dari E. E.code merupakan barisan statement tiga alamat untuk mengevaluasi E. Newtemp memberikan sebarisan nama-nama yang berbeda.

10 Produksi Aturan Semantik  S  id := E S.code := E.code || gen(id.place ':=' E.place)  E  E 1 + E 2 E.place := newtemp; E.code := E 1.code || E 2.code || gen(E.place ':=' E 1.place '+' E 2.place)  E  E 1 * E2 E.place := newtemp; E.code := E 1.code || E 2.code || gen(E.place ':=' E 1.place '*' E 2.place)

11 Produksi Aturan Semantik (cont.)  E  - E 1 E.place := newtemp; E.code := E 1.code || gen(E.place ':=' 'uminus' E 1.place)  E  (E 1 ) E.place := E 1.place; E.code := E 1.code  E  id E.place := id.place; E.code := ' '

12 Produksi Aturan Semantik (cont.)  S  while E do S 1 S.begin := newlabel; S.after := newlabel; S.code := gen(S.begin ':') || E.code || gen('if' E.place '=' '0' 'goto' S.after) || S 1.code || gen('goto' S.begin) || gen(S.after ':')

13 Implementasi statement tiga alamat  Implementasi statement tiga alamat dilakukan dalam bentuk record- record dengan field-field untuk operator dan operand. Quadruples Tripels Tripels tidak langsung

14 Quadrupels  Struktur record dengan empat field untuk op, arg1, arg2, dan result. op memuat kode untuk op. x := y op z, y di arg1, z di arg2, x di result. x := x := -y atau x := y tidak memakai arg2. param tidak memakai arg2 atau result. label target dari lompatan bersyarat ataupun tidak ditempatkan pada result. isi pada arg1, arg2, dan result biasanya pointer ke tabel simbol.

15 Quadrupels (cont.)  Contoh: z := b * -c + b * -c OpArg1Arg2Result (0)uminusct1t1 (1)*bt1t1 t2t2 (2)uminusct3t3 (3)*bt3t3 t4t4 (4)+t2t2 t4t4 t5t5 (5):=t5t5 a

16 Tripels  Memakai 3 field, tidak memakai field result  op, arg1, arg2. arg1 dan arg2 bisa berupa pointer ke tabel simbol (untuk nama atau konstan) atau pointer ke struktur tripel (untuk nilai sementara).

17 Tripels (cont.)  Contoh : opArg1Arg2 (0)uminusc (1)*b(0) (2)uminusc (3)*b(2) (4)+(1)(3) (5)assigna(4)

18 Tripels tidak langsung  Memakai list yang terdiri dari pointer yang menunjuk pada tripel [array statement]. Statement (0) (14) (1) (15) (2) (16) (3) (17) (4) (18) (5) (19) OpArg1Arg2 (14)uminusc (15)*b(14) (16)Uminusc (17)*b(16) (18)+(15)(17) (19)assigna(18)

19 Kebaikan vs. Keburukan  Quadrupel Lokasi tempat sementara dapat diakses secara langsung melalui tabel simbol. Statement-statement dengan mudah dapat dipindahpindahkan lokasinya, menguntungkan optimisasi compiler. Butuh space lebih banyak.

20 Kebaikan vs. Keburukan  Tripel Semua acuan (referensi) terhadap statement harus diubah, jika statement-statement dipindah-pindah untuk optimisasi  sulit untuk dioptimisasi. Space, lebih sedikit dibanding quadrupel.

21 Kebaikan vs. Keburukan  Tripel tidak langsung (TTL) Mirip seperti quadrupel Pemindahan statement dilakukan dengan merubah susunan list statement. Jika nama sementara dipakai berulang- ulang, TTL ini sangat menghemat space.

22 Deklarasi  Dalam prosedur yang tidak nested.  Offset : dipakai untuk memonitor address relatif setiap deklarasi suatu id baru dilakukan, offset ditambah dengan 'panjang' type id tersebut.

23 Deklarasi  Enter(name,type,offset)} : membuat entri tabel simbol dengan nama 'name', memberikan 'type'nya dan juga 'offset'nya. P  =, {offset := 0} D D  P ; D D  id : T {enter(id.name, T.type, offset);} offset := offset + T.width T  integer {T.type := integer; T.width := 4} T  real {T.type := real; T.width := 8}

24 Prosedur nested  1 tabel simbol utk 1 prosedur  Aturan semantik: mktable(previous): membentuk tabel simbol baru dan mengembalikan suatu pointer yang menunjuk pada tabel baru. previous :  menunjuk pada tabel simbol sebelumnya (milik prosedur pengurungnya).  ditempatkan pada header dalam tabel simbol yang baru.

25 Prosedur nested (cont.) enter(table,name,type,offset) : membentuk entri baru untuk name pada tabel simbol table. Juga disimpan type dan offset milik name. addwidth(table,width)} : mencatat panjang (besar) kumulatif dari semua entri di dalam tabel pada headernya. enterproc(table,name,newtable)} : membentuk entri baru untuk prosedur name pada tabel simbol table. Newtable menunjuk pada tabel simbol untuk prosedur name.

26 Prosedur nested (cont.)

27  Contoh : program sort; a : integer; x : integer; proc readarray; i : integer; proc exchange; proc quicksort; k : ….. v : ….. proc partition; i : ….. j : …..

28 Chapter 18 Pembentukan Kode Intermediate (lanjutan)

29 Ekspresi boolean  E  E or E | E and E | not E | (E) | id relop id | true | false  relop , ≤, =, ≠, ≥  Asumsi : or dan and asosiatif kiri or presedensinya lebih rendah dari and, lalu not.

30 Representasi boolean:  True := 1, false := 0  Nilai ekspresi boolean berupa posisi yang dicapai dalam program misal E 1 or E 2, maka jika E 1 true, sisa ekspresi tidak perlu dievaluasi  optimisasi compiler.

31 Representasi boolean (cont.):  Contoh: a or b and not c t 1 := not c t 2 := b and t 1 t 3 := a or t 2  Sedangkan ‘a < b’ ekivalen dengan if a < b then 1 else 0. Hal ini bisa ditulis dalam kode tiga alamat berikut (misal dimulai pada statement 100) : 100: if a < b goto : t := 0 102: goto : t := 1 104:

32 Representasi boolean (cont.):  Contoh lalu dibuat berdasarkan skema translasi berikut dimana: emit - mencetak statement tiga alamat pada file output lalu menaikkan 'nextstat'. nextstat - adalah indek dari statement tiga alamat berikutnya didalam output. newtemp - memberikan nama sementara yang baru.

33 Representasi boolean (cont.):  E  E 1 or E 2 {E.place := newtemp; emit(E.place ':=' E 1.place 'or' E 2.place)}  E  E 1 and E 2 {E.place := newtemp; emit(E.place ':=' E 1.place 'and‘ E 2.place)}  E  not E 1 {E.place := newtemp; emit(E.place ':=' 'not' E 1.place)}

34 Representasi boolean (cont.):  E  ( E 1 ) {E.place := E 1.place}  E  id 1 relop id 2 {E.place := newtemp; emit('if' id 1.place relop.op id 2.place 'goto‘ nextstat+3); emit(E.place ':=' '0') emit('goto' nextstat+2) emit(E.place ':=' '1')}

35 Representasi boolean (cont.):  E  true {E.place := newtemp; emit(E.place ':=' '1')}  E  false {E.place := newtemp; emit(E.place ':=' '0')}

36 a < b or c < d and e < f  Translasinya sbb: 100if a < b goto t 2 := 1 101t 1 := 0108if e < f goto goto t 3 := 0 103t 1 := 1110goto if c < d goto t 3 := 1 105t 2 := 0112t 4 := t 2 and t 3 106goto t 5 := t 1 or t 4

37 Statement flow of control  Dengan grammar : S  if E then S 1 | if E then S 1 else S 2 | while E do S  Untuk semua E: E.true adalah label yang akan dituju jika E adalah true. E.false adalah label yang akan dituju jika e adalah false.

38 Statement flow of control (cont.)  Contoh: a < b or c < d and e < f Misalkan label Ltrue dan Lfalse sudah dibuat, Ltrue label yang akan dituju jika ekspresi benar, Lfalse label yang akan dituju jika ekspresi salah. if a < b goto Ltrue goto L 1  redundant L 1 : if c < d goto L 2 goto Lfalse L 2 :if e < f goto Ltrue goto Lfalse

39 Statement flow of control (cont.)  Redundant dapat dihilangkan dengan: Optimisasi peephole Merubah bentuk ekspresi, misal id 1 < id 2 menjadi if id 1 ≥ id 2 goto E.false.  Contoh: while a < b do if c < d then x := y + z else x := y + z

40 Statement flow of control (cont.) 

41 Case statement/switch  hampir mirip/bentuk umum dari if-then-else  switch E begin case V 1 : S 1 case V 2 : S 2. case V (n-1) : S (n-1) default : S n end

42 Case statement/switch  Pada saat switch terbaca: buat label 'test' dan 'next' buat nama sementara 't' buat kode E, evaluasi E, simpan di t goto test  Saat case terbaca: buat label L i masukkan ke tabel simbol pointer ke entri tabel simbol itu dan nilai V i disimpan pada stack. (untuk mengatasi switch di dalamnya).

43 Dua versi statement 3-alamat switch:

44

45 Backpatching :  proses pemberian nilai pada label, dilakukan setelah nilai ini diketahui.  Untuk memudahkan, implementasinya mamakai quadrupels, yang berbentuk array of record. Label merupakan indek array.

46 Backpatching : (cont.)  Fungsi-fungsi yang dipakai: makelist(i), membuat list baru yang hanya memuat indek/label i, lalu menghasilkan pointer yang menunjuk pada list itu. merge(p 1, p 2 ), menggabung list yang ditunjuk oleh p 1 dan p 2, menghasilkan pointer yang menunjuk pada gabungan list ini. backpatch(p,i), memasukkan i sebagai label untuk masing-masing statement pada list yang ditunjuk oleh p.

47 Backpatching : (cont.)  Atribut tersintesa truelist dan falselist dipakai untuk membentuk kode lompatan ekspresi boolean.  M.quad : mencatat angka/indek statement pertama pada E 2.  Contoh: a < b or c < d and e < f Produksi E  a < b membentuk: 100 : if a < b goto : goto...

48 Backpatching : (cont.) M pada E  E 1 or M E 2 sudah terlihat, M mencatat nextquad sebagai 102. E  c < d membentuk 102: if c < d goto : goto... M pada E  E 1 and M E 2 sudah terlihat, M mencatat nextquad sebagai 104. E  e < f membentuk 104: if e < f goto : goto...

49 Backpatching : (cont.) E 1  E 1 and M E 2 melakukan backpatch({102}, 104). Ini mengakibatkan: 100: if a < b goto : goto : if c < d goto : goto : if c < f goto : goto...


Download ppt "Chapter 17 Pembentukan Kode Intermediate. Kode intermediate:  representasi lanjutan/intermediate dari suatu sumber program.  Jenis representasi intermediate:"

Presentasi serupa


Iklan oleh Google