Dokumen tersebut membahas tentang code generation dalam desain kompiler, termasuk konsep kode perantara, representasi kode perantara seperti notasi postfix dan three-address code, serta teknik-teknik dasar pembuatan kode seperti macro expansion dan static simulation."
2. Code Generation
1 Apa itu kode perantara?
2 Dua representasi untuk mengekspresikan bahasa perantara
3 Notasi Postfix
4 Three-address Code
5 Struktur Data untuk Pembuatan Kode
6 P Code
7 Teknik Dasar Code Generation
3. 1 Apa itu kode perantara?
Selama penerjemahan program sumber ke dalam kode objek
untuk mesin target, kompiler dapat menghasilkan kode bahasa
tingkat menengah, yang dikenal sebagai kode perantara atau teks
perantara. Kompleksitas kode ini terletak di antara kode bahasa
sumber dan kode objek. Kode antara dapat direpresentasikan
dalam bentuk notasi postfix, pohon sintaksis, graf berarah asiklik
(DAG), kode tiga alamat, quadruples, dan triples.
4. 1 Apa itu kode perantara?
Manfaat menggunakan kode perantara dibandingkan pembuatan kode
langsung adalah sebagai berikut:
Kode perantara tidak bergantung pada mesin, yang memudahkan penargetan ulang
kompiler untuk menghasilkan kode untuk prosesor yang lebih baru dan berbeda
Kode perantara lebih dekat ke mesin target dibandingkan dengan bahasa sumber
sehingga lebih mudah untuk menghasilkan kode objek
Kode perantara memungkinkan pengoptimalan kode yang tidak bergantung pada
mesin. Beberapa teknik khusus digunakan untuk mengoptimalkan kode perantara
oleh ujung depan kompiler.
Terjemahan yang diarahkan sintaksis mengimplementasikan generasi kode
perantara dengan demikian, dengan menambah parser, itu dapat dilipat menjadi
parsing
5. High-level intermediate representation: Representasi ini lebih
dekat dengan program sumber. Dengan demikian, ini mewakili
struktur tingkat tinggi dari suatu program, yaitu, menggambarkan
struktur hierarki alami dari program sumber. Contoh representasi
ini adalah grafik asiklik terarah (DAG) dan pohon sintaksis.
Representasi ini cocok untuk tugas pemeriksaan tipe statis. Fitur
penting dari representasi tingkat tinggi diberikan sebagai berikut:
• mempertahankan struktur program karena lebih dekat ke
program sumber.
• dapat dibangun dengan mudah dari program sumber.
• Tidak mungkin untuk memecahkan program sumber untuk
mengekstrak tingkat berbagi kode karena pengoptimalan kode
dalam representasi ini menjadi sedikit rumit.
2 Dua representasi untuk mengekspresikan bahasa perantara
Dua representasi bahasa perantara dikategorikan sebagai berikut:
6. Low-level intermediate representation: Representasi ini lebih
dekat ke mesin target di mana ia mewakili struktur tingkat rendah
dari suatu program. Ini sesuai untuk tugas-tugas yang bergantung
pada mesin seperti alokasi register dan pemilihan instruksi. Contoh
khas dari representasi ini adalah kode tiga alamat. Fitur penting
dari representasi tingkat rendah diberikan sebagai berikut:
• dekat dengan mesin target.
• Itu membuat lebih mudah untuk menghasilkan kode objek.
• Upaya tinggi diperlukan oleh program sumber untuk
menghasilkan representasi tingkat rendah.
2 Dua representasi untuk mengekspresikan bahasa perantara
Dua representasi bahasa perantara dikategorikan sebagai berikut:
7. 3 Notasi Postfix
Umumnya, kita menggunakan notasi infiks untuk mewakili ekspresi aritmatika
seperti perkalian dua operan a dan b. Dalam notasi infiks, operator selalu
ditempatkan di antara dua operan, seperti a * b. Namun dalam notasi postfix
(juga dikenal sebagai pemolesan terbalik atau notasi sufiks), operator digeser ke
ujung kanan, seperti ab*. Dalam notasi postfix, tanda kurung tidak diperlukan
karena posisi dan jumlah argumen operator hanya mengizinkan satu cara untuk
mendekode ekspresi postfix. Notasi postfix dapat diterapkan pada operator k-
ary untuk sembarang k > 1. Jika ß adalah operator k-ary dan a1, a2, . . . , ak
adalah ekspresi postfix apa pun, kemudian setelah menerapkan ß ke ekspresi,
ekspresi dalam notasi postfix direpresentasikan sebagai a1 a2 ...akß
8. 3 Notasi Postfix
Sebagai contoh, perhatikan ekspresi infiks berikut dan notasi postfix yang
sesuai:
• (l + m) * n is an infix expression, the postfix notation will be l m + n *.
• p * (q + r) is an infix expression, the postfix expression will be p q r + *.
• (p - q) * (r + s) + (p - q) is an infix expression, the postfix expression will
be p q - r s + * p q - +.
9. 3 Notasi Postfix
proses evaluasi ekspresi postfix
Notasi postfix dapat dengan mudah dievaluasi dengan menggunakan stack, dan
umumnya proses evaluasi memindai kode postfix dari kiri ke kanan.
1. Jika simbol pemindaian adalah operan, maka ia akan didorong ke tumpukan,
dan pemindaian dilanjutkan.
2. Jika simbol pemindaian adalah operator biner, maka dua operan paling atas
akan dikeluarkan dari tumpukan. Operator diterapkan ke operan ini, dan
hasilnya didorong kembali ke tumpukan.
3. Jika simbol pemindaian adalah operator unary, itu diterapkan ke bagian atas
tumpukan dan hasilnya didorong kembali ke tumpukan.
Note: Hasil dari operator unary dapat ditampilkan di dalam kurung. Sebagai
contoh, (−X).
11. 4 Three-address code
Apa itu three-address code?
String bentuk X: = Y OP Z, di mana op adalah operator biner, Y dan Z adalah
alamat operan, dan X adalah alamat hasil operasi, dikenal sebagai pernyataan
tiga alamat. Operator op dapat berupa operator aritmatika fixed atau
floating-point, atau operator logika. X, Y, dan Z dapat dianggap sebagai
konstanta atau sebagai nama yang telah ditentukan oleh programmer atau
nama sementara yang dihasilkan oleh compiler.
Pernyataan ini disebut sebagai "pernyataan tiga alamat" karena penggunaan
tiga alamat, satu untuk hasil dan dua untuk operan. Urutan pernyataan tiga
alamat tersebut dikenal sebagai kode tiga alamat.
Ekspresi aritmatika yang rumit tidak diperbolehkan dalam kode tiga alamat
karena hanya satu operasi yang diizinkan per pernyataan. Misalnya,
pertimbangkan ekspresi A + B * C, ekspresi ini berisi lebih dari satu operator
sehingga representasi ekspresi ini dalam pernyataan tiga alamat tunggal tidak
dimungkinkan.
12. 4 Three-address code
Apa itu three-address code?
Oleh karena itu, kode tiga alamat dari ekspresi yang diberikan adalah sebagai
berikut:
T1: = B * C
T2: = A + T1
dimana T1 and T2 nama sementara yang dihasilkan oleh kompiler
13. 4 Three-address code
Jenis Three-address code :
1. Assignment statements: Pernyataan-pernyataan ini dapat
direpresentasikan dalam bentuk berikut:
• X: = Y op Z, di mana op adalah setiap operator biner logis/aritmatika.
• X: = op Y, di mana op adalah operator unary seperti logika negasi, operator
konversi, dan operator shift.
• X: = Y, di mana nilai Y ditetapkan ke operan X.
2. Indexed assignment statements: Pernyataan-pernyataan ini dapat
direpresentasikan dalam bentuk berikut:
• X: = Y[I]
• X[I]: = Y, dimana X, Y dan saya merujuk ke objek data dan diwakili oleh
pointer ke tabel simbol.
14. 4 Three-address code
Jenis Three-address code :
3. Address and pointer assignment statements: Pernyataan-pernyataan ini dapat
direpresentasikan dalam bentuk berikut: :
• X: = addr Y defines that X is assigned the address of Y.
• X: = *Y defines that X is assigned the content of location pointed to by Y.
• *X: = Y sets the r-value of the object pointed to by X to the r-value of Y.
4. Jump statements: Pernyataan lompat terdiri dari dua jenis — bersyarat dan tidak
bersyarat yang bekerja dengan operator relasional dan direpresentasikan dalam bentuk
berikut:
• Lompatan tanpa syarat direpresentasikan sebagai goto L, di mana L menjadi label.
Instruksi ini berarti bahwa pernyataan tiga alamat ke-L adalah yang berikutnya akan
dieksekusi.
• Lompatan bersyarat seperti jika X relop Y ke L, di mana relop menandakan operator
relasional (£, =, >, dll.) yang diterapkan antara X dan Y. Instruksi ini menyiratkan bahwa
jika hasil dari ekspresi X relop Y benar maka pernyataan berlabel L dieksekusi. Jika
tidak, pernyataan segera setelah jika X relop Y goto L dieksekusi.
15. 4 Three-address code
Jenis Three-address code :
5. Procedure call/return statements: Pernyataan-pernyataan ini dapat didefinisikan dalam bentuk
berikut: :
• param X dan panggil P, n, di mana mereka diwakili dan biasanya digunakan dalam pernyataan
tiga alamat sebagai berikut:
param X1
param X2
.
.
.
param Xn
call P, n
Di sini, urutan pernyataan tiga alamat dihasilkan sebagai bagian dari panggilan prosedur P(X1, X2,
. . . , Xn), dan n dalam panggilan P, n didefinisikan sebagai bilangan bulat yang menentukan jumlah
total aktual parameter dalam panggilan.
• Y = panggilan p, n mewakili panggilan fungsi
• return Y, mewakili pernyataan return, di mana Y adalah nilai yang dikembalikan
16. 5 Struktur Data untuk Pembuatan Kode
Implementasi yang paling umum adalah mengimplementasikan kode tiga
alamat pada dasarnya seperti yang ditunjukkan sebagai, yang berarti bahwa
empat bidang diperlukan. Satu untuk operasi dan tiga untuk alamat. Untuk
instruksi yang memiliki kurang dari tiga alamat, satu atau lebih bidang
alamat diberi nilai null atau "kosong". Pilihan bidang mana yang tergantung
pada implementasinya. Karena empat bidang diperlukan, representasi kode
tiga alamat seperti itu disebut quadruple.
17. 5 Struktur Data untuk Pembuatan Kode
Contoh Tiny Program
{ sample program
in tiny language—
computes factorial
}
Read x; {input an integer}
If 0 < x then { don’t compute if x < = 0 }
fact := 1;
repeat
fact := fact * x;
x := x – 1
until x = 0;
write fact {output factorial of x }
end
18. 5 Struktur Data untuk Pembuatan Kode
Three-address code untuk TINY program :
read x
t1 = x > 0
if_false t1 goto L1
fact = 1
label L2
t2 = fact * x
fact = t2
t3 = x – 1
x = t3
t4 = x == 0
if_false t4 goto L2
write fact
label L1
halt
19. 5 Struktur Data untuk Pembuatan Kode
Penerapan Quadruple untuk three-address code
(rd, x, _, _)
(gt, x, 0, t1)
(if_f,t1,L1,_)
(asn,1,fact,_)
(lab,L2,_,_)
(mul,fact,x,t2)
(asn,t2,fact,_)
(sub,x,1,t3)
(asn,t3,x,_)
(eq,x,0,t4)
(if_f,t4,L2,_)
(wri,fact,_,_)
(lab,L1,_,_)
(halt,_,_._)
20. P-code (portable-code) adalah istilah yang dipakai untuk merepresentasikan
sejumlah instruksi yang ditujukan untuk meningkatkan efisiensi serta unjuk
kerja masa dieksekusi oleh perangkat lunak penerjemah (interpreter) atau
untuk mempermudah penerjemahan menjadi kode mesin.
6 P Code
22. 6 P Code
Versi P-Code untuk ekspresi ini adalah....
ldc 2 ; load constant 2
lod a ; load value of variable a
mpi ; integer multiplication
lod b ; load value of variable b
ldc 3 ; load constant 3
sbi ; interger substraction
adi ; integer addicition
23. 7 Teknik Dasar Code Generation
Yaitu memodifikasi transversal postorder dari pohon syntax yang diimplementasikan
dengan grammar atribut selama proses parser jika sebuah pohon syntax tidak dihasilkan
secara jelas.
Algoritma dasar dapat digambarkan seperti prosedur rekursif berikut:
procedure genCode(T:treenode);
begin
if T is not nil then
generate code to prepare for code of left child of T;
genCode(left child of T);
generate code to prepare for code of right child of T;
genCode(right child of T);
generate code to implement the action of T;
end
24. 7 Teknik Dasar Code Generation
Code generation dari intermediate code melibatkan 2 teknik standar, yaitu:
1. Macro Expansion, melibatkan pergantian dari masing-masing instruksi
intermediate code dengan sebuah rangkaian yang sama dengan instruksi kode
target.
2. Static Simulation, melibatkan simulasi straight-line dari efek intermediate code
dan menghasilkan kode target untuk mencocokkan efek tersebut
25. 7 Teknik Dasar Code Generation
Code generation dari intermediate code melibatkan 2 teknik standar, yaitu:
1. Macro Expansion, melibatkan pergantian dari masing-masing instruksi
intermediate code dengan sebuah rangkaian yang sama dengan instruksi kode
target.
2. Static Simulation, melibatkan simulasi straight-line dari efek intermediate code
dan menghasilkan kode target untuk mencocokkan efek tersebut
26. Code generation dari intermediate code melibatkan 2 teknik standar, yaitu:
Jika kode antara mempunyai tipe data Boolean dan operasi logika seperti
and dan or, kemudian nilai dari ekspresi Boolean dapat dikomputasikan
dalam kode antara dengan cara yang sama seperti ekspresi aritmatika.
Pembuatan kode dari logical expression