Sunday, May May 4, 2008 INTERMEDIATE CODE GENERATOR Proses kompilasi dari suatu kompilator pada dasarnya dapat dibagi ke dalam 2 bagian utama yaitu bagian analisis dan bagian sintesis.Pada saat proses compiler ada tahap di mana pembentukan program sasaran dibentuk berdasarkan reprensentasi antara yang dihasilkan pada tahap analisis,tahap yang di maksud adalah tahap sintesis dimana tahapa sintesis terbagi dalam 3 bagian yaitu •
intermediate code generator
•
code optimizer
•
code generator . Sintesis adalah membangun program sasaran yang diinginkan dari bentuk antara .
Pada bagian ini kita akan menjelaskan sedikit tentang bagian pertama dari tahap sintesis yaitu intermediate code generator,yaitu membangkitkan kode antara (intermediate code) berdasarkan pohon parsing. Pohon parse selanjutnya diterjemahkan oleh suatu penerjemah yang dinamakan penerjemah berdasarkan sintak (syntax-directed translator). asil penerjemahan ini biasanya merupakan perintah tiga alamat (three-address code) yang merupakan representasi program untuk suatu mesin abstrak. Perintah tiga alamat bisa berbentuk !uadruples (op, arg", arg2, result), tripels (op, arg", arg2). arg2). #kspresi dengan satu argumen dinyatakan dengan menetapkan arg2 dengan - (strip, dash). $ntermediate adalah adalah sebuah representasi yang disiapkan untuk mesin abstrak tertentu.%i mana intermediatae tersebut harus memiliki dua si&at yang harus terpenuhi yaitu' %apat dihasilkan dengan mudah udah ditranslasikan menjadi program sasaran(target program) *epresentasi kode antara biasanya berbentuk perintah tiga alamat (three-address code), baik berbentuk !uadruples ataupun triples.+ika kita ingin mengambil mengambil sedikit contoh tentang cara kerja intermediate maka kita bisa melihat bagaimana intermediate bekerja dalam mengcompile sebuah bahasa pemrograman yang sederhana,dimana ahap-tahap ahap-tahap compiler yang dianalisa meliputi tahap ta hap scanner, parser, constrainer dan tahap code genera tor. Scanner
mengambil karakter-karakter input dan mengelompokkannya menjadi token-token. Parser pada compiler ini merupakan program-drien parser yang meujudkan grammar dalam bentuk algoritma, bersi&at top-don dan termasuk recursie-descent parser untuk grammar //("). 0onstrainer memeriksa aturan pendeklarasian ariabel, sedangkan tahap intermediate code generator menghasilkan bentuk positi&inya yang memudahkan proses pembentukan kode output pada tahap code generator. 1entuk dari intermediate code generator tergantung bagaimana pemrosesan yang dilakukan selama tahap sintesis, temp" ' inttoreal(4) temp2 ' id3 5 temp" temp3 ' id2 6 temp2 id" ' temp3 $mplementasi dari bentuk intermediate code generator dapat kita lihat seperti contoh berikut'
Syntax-Directed Transati!n
1agian yang akan menghasilkan intermediate &orm dari source code. 7ungsinya untuk menentukan maksud dari suatu source code. eskipun secara konseptual sintaks dari suatu program dipisahkan dari semantiknya, mereka bekerja sama secara dekat. 8eluaran dari bagian ini akan diberikan ke code genereator. 8ode-antara (intermediate code) dibentuk dari sebuah kalimat x dalam bahasa context &ree. 8alimat x ini adalah keluaran dari parser. Syntax-directed transalation adalah suatu urutan proses yang mentranslasikan parse tree menjadi kode-antara. ahap
pertama dari pembentukan kode antara adalah ealuasi atribut setiap token dalam kalimat x. 9ang dapat menjadi atribut setiap token adalah semua in&ormasi yang disimpan di dalam tabel symbol. #aluasi dimulai dari parse tree. 8umpulan aturan yang menetapkan aturanaturan semantik untuk setiap produksinya dinamakan syntax-directed de&inition. syntax-directed translation yang mentranslasikan ekspresi intinya menjadi ekspresi posit&inya. #kspresi intinya ini dapat dilihat sebagai sebuah kalimat yang dihasilkan oleh parser. 0ontoh "' %iketahui ' ". kalimat x ' : - ; 6 2 2. grammar < =# . # 6 .# - ., . 4.".3.....:> 3. syntax-directed de&inition ' Produksi ?turan Semantik # . # " 6 # ' # " .t @ .t @ A6 A # . # " - # ' # " .t@ .t @ A-A # . # ' .t # . 4 # ' A4B # . " # ' A"B ... ... # . : # ' A:B catatan ' ". /ambang A@A menyatakan concatenation. 2. engingat catatan ", aturan semantik kedua produksi pertama adalah concate dua operan diikuti sebuah operator.
/angkah-langkah translasi ". pembentukan parse tree ' 2. pembentukan annonated parse tree ' # # :;-26 # 6 #.t :;- 6 .t 2 # - 2 #.t : - .t ; 2 ; .t : ; :: Transati!n Sc"e#e
ranslation scheme adalah grammar context &ree dimana sebuah &rase yang disebut semantic actions disertakan di sisi kanan setiap produksinya. Semantic actions ini adalah sebuah nilai sebagai hasil ealuasi atribut pada sebuah node. %alam translation schemes, &rase yang menyatakan action diapit dengan kurung kuraal. . Pada syntaxdirected translation hasil akhir ealuasi atribut ditetapkan pada root dari parse tree melalui kunjungan dept-&irst traersal sedangkan pada translation scheme hasil tersebut ditetapkan pada setiap node (termasuk lea&) juga secara dept-&irst traersal. 0ontoh sebuah translation scheme dengan semantic action-nya adalah ' rest . 6 term =print(A6B)> rest " , Pada contoh di atas, aksi =print(A6B)> akan dilakukan setalah ealuasi terhadap term selesai dan ealuasi terhadap rest " belum dilakukan. %alam representasi parse tree, semantic action pada translation scheme digambarkan dengan garis putus-putus sebagai lea& tambahan. %ari penjelasan di atas terlihat baha translation scheme mirip dengan syntax-directed translation kecuali dalam prosedur ealuasi nilai atribut pada setiap nodenya. Pada syntax-directed translation hasil akhir ealuasi atribut ditetapkan pada root dari parse tree melalui kunjungan dept-&irst traersal sedangkan pada translation scheme
hasil tersebut ditetapkan pada setiap node (termasuk lea&) juga secara dept-&irst traersal. Cramar dan kalimat pada contoh " di atas mempunyai translation schemes dan parse tree sebagai berikut # # . # 6 =print(A6B)> # . # - =print(A-B)> #.# . 4 =print(A4B)> # . " =print(A"B)> # - =print(A-B)>2 =print(A2B)> ... # . : =print(A:B)> ;=print(A;B)> : print(A:B)> 6 =print(A6B)> Syntax Tree
Parse tree seringkali disebut sebagai concrete syntax tree. Parse tree tidak e&isien karena mengandung in&ormasi yang berlebihanD sebagai gantinya, kalimat dinyatakan sebagai abstract syntax tree atau sering disingkat sebagai syntax tree saja. %alam syntax tree setiap operator maupun keyord tidak muncul sebagai lea&.
c!nt!" $
syntax tree untuk kalimat x ' : - ; 6 2 dan y ' i& 1 then S " else S 2 ' 6 i&-then-else -2 1S"S2 :; Me#%entu& Syntax Tree Se%ua" E&s'resi
Pada pasal ini akan dibentuk sebuah syntax tree dimana setiap node-nya dinyatakan sebagai data record. Setiap record paling tidak mengandung sebuah label yang dapat berupa identi&ier, konstanta, atau operator. Proses pembentukan ini memerlukan tiga buah &unction berikut ' ". mknode(op, le&t, right) ' membentuk node operator dengan label op dan dua &ield lainnya berupa pointer ke anak kiri dan anak kanan, 2. mklea&(id, entry) ' membentuk node identi&ier dengan label id dan sebuah &ield berupa pointer ke symbol table. Pelacakan identi&ier pada symbol table. 3. mklea&(num, al) ' membentuk node konstanta dengan label id dan sebuah &ield yang mengandung nilai bilangan. 0ontoh' %iberikan ekspresi ' a - E 6 c, dengan a dan c adalah identi&ier. Syntax tree akan dibentuk secara bottom-up. 1erikut ini adalah algoritma pembentukan syntax tree untuk ekspresi yang diinginkan beserta bentuk syntax tree yang dihasilkannya ' (") p" ' mklea&(id, entrya)D dimana ' (2) p2 ' mklea&(num, E)D -p", p2, p3, pE, p; ' pointer ke node
(3) p3 ' mknode(A-A, p", p2)D -entrya, entryc ' pointer ke symbol table (E) pE ' mklea&(id, entryc)D masing-masing untuk identi&ier a dan c (;) p; ' mknode(A6A, p3, pE)D 6 - id id num E entry untuk c entry untuk a Crammar untuk ekspresi contoh 2 adalah ' < =# . # 6 .#-., . (#).id.num>, sedangkan syntax directed de&inition-nya adalah ' Produksi ?turan Semanti # . # " 6 #.nptr ' mknode(A6B, # " .nptr, .nptr) # . # " - #.nptr ' mknode(A-B, # " .nptr, .nptr) # . #.nptr ' .nptr # . (#) .nptr ' #.nptr # . id .nptr ' mklea&(id, id.entry) # . num .nptr ' mklea&(num, num.al) pada tabel di atas nptr adalah synthesiFed attribute, masing-masing untuk # dan . Sebuah atribut di sebuah node adalah synthesiFed attribute jika nilai atribut pada node tersebut ditentukan dari nilai-nilai atribut anak-anaknya. T"ree Address C!de
1entuk umum three address code bagi sebuah pernyataan adalah ' x ' y op F,
dimana x, y, F adalah nama atau konstanta, sedangkan op adalah operator aritmatika atau operator logika. #kspresi panjang seperti ' x 6 y 5 F dapat dinyatakan dengan three address code menjadi ' t" ' y 5 FD t2 ' x 6 t"D ' t2. erdapat dua &ormat untuk three address code, yaitu &ormat !uadruple (op, arg", arg2, result) dan &ormat triple (op, arg", arg2). $si dari arg", arg2, dan result adalah pointer ke symbol table. +ika isi tersebut adalah temporary identi&ier, maka nama tersebut harus dimasukkan ke dalam symbol table begitu nama tersebut dideklarasikan atau diciptakan. 0ontoh'%iberikan pernyataan ' a ' b 5 - c 6 b 5 - c. *angkaian three address code dari pernyataan ini adalah ' t" ' - cD t2 ' b 5 t"D t3 ' - cD tE ' b 5 t3D t; ' t2 ' tED a ' t; Pernyataan !uadruple dan triple dari pernyataan di atas adalah ' abel &ormat !uadruple abel &ormat truple '
GH
HP arg" arg2 result
Hp arg" arg2
4
uminus c t"
uminus c
"
5 b t" t2
5 b (4)
2
uminus c t3
uminus c
3
5 b t3 tE
(3) 5 b (2)
E
6 t2 tE t;
6 (") (3)
;
' t; a
' a (E)
7ormat !uadruple untuk opearor unary seperti A- cB menyebabkan arg2 tidak digunakan. 7ormat triple digunakan untuk menghindari penggunaan temporary identi&ier seperti
yang terjadi pada &ormat !uadruple. 7ormat triple ini benar-benar mendayagunakan posisi baris pernyataan. Sebagai contoh, pada baris kedua dari tabel &ormat triple terlihat baha isi arg2 adalah (4), yang tak lain dari Auminus cB.