download

Matakuliah
Tahun
Versi
: T0174 / Teknik Kompilasi
: 2005
: 1/6
Pertemuan 25 & 26
Code Generation
1
Learning Outcomes
Pada akhir pertemuan ini, diharapkan mahasiswa
akan mampu :
• Mahasiswa dapat menunjukkan hasil code
genarator dari suatu kasus kompilasi program
(C3)
• Mahasiswa dapat membuat diagram / skema
perancangan compiler yang paling optimal (C4)
2
Outline Materi
•
•
•
•
•
Issues dalam disain code generator
The target machine
Basic block dan flow graph
Representasi DAG dari basic block
Register allocation and assignment
3
Posisi Code Generation
• Tahap terakhir dari kompiler adalah code generator.
Input code generator adalah intermediate representation
dari source program, sedangkan outputnya adalah target
program yang ekivalen.
• Posisi code generator dalam kompiler adalah sebagai
berikut :
source
program
front
end
intermediate
code
code
optimizer
intermediate
code
code
generator
target
program
symbol
table
4
Persyaratan code generator :
• output code harus benar dan berkualitas tinggi,
yaitu harus menggunakan resources dari target
machine secara efektif.
• harus efisien.
• Secara matematis, masalah untuk
membangkitkan code yang optimal adalah
undecidable.
• Secara praktek, kita akan mengguna-kan teknik
heuristik yang bagus, tapi tidak selalu berarti
optimal code.
5
Issue-issue dalam Code
Generator Design
• Walaupun sangat tergantung kepada target
machine dan operating system, masalahmasalah yang penting dalam code generation
adalah :
–
–
–
–
–
–
–
Input untuk code generator
Target program
Memory Management
Instruction Selection
Register Allocation
Pemilihan Urutan Evaluation
Pendekatan Code Generator
6
Input Untuk Code Generator
• Input untuk code generator terdiri dari intermediate
representation dari source program yang dihasilkan oleh
front-end, bersama dengan informasi di dalam symbol
table yang digunakan untuk menentukan run time
address dari data object yang ditunjukkan oleh namanama dalam intermediate representation.
• Diasumsikan bahwa sebelum code generation, front-end
telah men-scan, men-parse, & menerjemahkan source
program ke dalam intermediate repre-sentation detail.
• Selain itu, diasumsikan telah dilakukan type checking,
sehingga type-conver-sion operator telah di-insert
dimana perlu & semantic error telah dideteksi.
7
Target Program
•
Output dari code generator adalah target program, yang bisa mengambil bentuk :
–
–
–
•
•
•
•
•
Absolute Machine Language
Relocatable Machine Language
Assembly Language
Target program dalam bentuk Absolute machine language mem-punyai keuntungan dapat
ditempatkan dalam lokasi yang fixed di dalam memory & langsung dapat dieksekusi.
Program yang kecil dapat di-kompile dan dieksekusi dengan cepat.
Contoh : sejumlah “student-job” compiler, seperti WATFIV dan PL/C
Keuntungan target program dalam bentuk Relocatable Machine Language Program
(Object Module) adalah sub-program dapat di-kompile secara terpi-sah.Satu set
relocatable object module dapat di-link bersama-sama & di-load oleh linking loader untuk
dieksekusi.
Walaupun keluar usaha ekstra untuk linking & loading,namun kita mendapat fleksibilitas
karena dapat mengkompile subroutine secara terpisah.
Assembly Language program sbg tar-get program mempunyai keuntungan kemudahan
proses code generation. Kita dapat men-generate symbolic instruction & menggunakan
fasilitas makro dari assembler untuk men-generate code. Biaya yang harus dikeluarkan
adalah tahap assembly setelah code generation.
8
Memory Management
• Memetakan nama di dalam source program ke address dari data
object dalam run-time memory dikerjakan bersama-sama oleh frontend dan code generator.
• Diasumsikan bahwa nama dalam three-address statement merefer
kepada symbol-table entry untuk nama tersebut.
• Tipe dalam deklarasi menentukan lebar (jumlah storage) yang
diperlukan untuk nama yang dideklarasikan.
–
Register R0, R1, . . ., Rn-1
–
op source, destination
–
–
MOV (move source to destination)
ADD (add source to destination)
SUB (subtract source to destination)
Address mode
Instruction Cost
9
Instruction Selection
•
•
•
Uniformity dan completeness dari instruction set adalah faktor yang penting.
Selain itu, faktor yang penting lainnya adalah instruction speed dan machine idiom.
Contoh :
– Setiap three-address statement dalam bentuk : x := y + z
– dimana x, y, dan z dialokasikan secara static, dapat diterjemahkan ke dalam sekuens code :
MOV y, R0 /* load y ke register R0 */
ADD z, R0 /* add z ke R0 */
MOV R0, x /* store R0 ke dalam x */
•
Namun statement-by-statement code generation ini sering menghasilkan code yang buruk.
Contoh : Sekuens dari statement
a := b + c
d := a + e
dapat diterjemahkan ke dalam :
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0
ADD e, R0
MOV R0, d
•
Di sini statement ketiga dan keempat akan redundant, juga statement yang ketiga jika a
tidak digunakan secara berurutan.
10
Register Allocation
• Instruksi yang melibatkan register operand biasanya
lebih pendek dan lebih cepat daripada yang melibatkan
operand di dalam memory.
• Karena itu, penggunaan register yang efisien sangat
penting untuk membangkitkan code yang baik.
• Penggunaan register dibagi ke dalam 2 sub-masalah :
– Selama register allocation, dipilih variable-variable
yang akan mene-tap di dalam register pada suatu titik
dalam program.
– Selama register assignment, diam-bil register khusus
dimana variabel akan menetap.
• Menemukan optimal assignment dari register untuk
variabel sulit, walaupun dengan single register.
• Secara matematis, problem ini adalah NP-Complete.
11
Pemilihan Urutan Evaluasi
• Urutan dilakukannya komputasi dapat
mempengaruhi efisiensi dari target code.
Beberapa urutan komputasi memerlukan
register yang lebih sedikit untuk
menampung intermediate result daripada
yang lainnya. Mengambil urutan terbaik
adalah NP-Complete Problem.
12
Pendekatan Code Generator
• Kriteria terpenting untuk code genera-tor
adalah menghasilkan code yang baik.
• Salah satu tujuan perancangan yang
penting dari Code Generator adalah :
– mudah diimplementasikan
– mudah ditest
– mudah di-maintain
13
Run-Time Storage
• Strategi alokasi : Static dan Stack
• Static allocation
– Pada static allocation statement call diterjemahkan
menjadi :
Move #here + 20, callee.static_area
GOTO calle.code_area
Three-Address
Code
Activation Record
for c (64 bytes)
Activation Record
for p (88 bytes)
/* code for c */
action1
call p
action2
halt
/* code for p */
action3
return
0:return address
8:
arr
0:return address
4:
buf
56:i
60:j
84:n
14
15
16
17