Code Genarator By Kustanto Posisi Code Generation Tahap
Code Genarator By Kustanto
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 optimizer intermediate code generator target program symbol table 2
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 heuristic yang bagus, tapi tidak selalu berarti optimal code. 3
Issue-issue dalam Code Generator Design � Walaupun sangat tergantung kepada target machine dan operating system, masalah-masalah yang penting dalam code generation adalah : ◦ ◦ ◦ ◦ Input untuk code generator Target program Memory Management Instruction Selection Register Allocation Pemilihan Urutan Evaluation Pendekatan Code Generator 4
Input Untuk Code Generator � Input untuk code generator terdiri dari intermediate representation dari source program yang dihasilkan oleh frontend, bersama dengan informasi di dalam symbol table yang digunakan untuk menentukan run time address dari data object yang ditunjukkan oleh nama-nama 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. 5
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 terpisah. 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. 6
Memory Management Memetakan nama di dalam source program ke address dari data object dalam run-time memory dikerjakan bersama oleh front-end 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 R 0, R 1, . . . , Rn-1 – op source, destination � – – MOV (move source to destination) ADD (add source to destination) SUB (subtract source to destination) Address mode Instruction Cost 7
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, R 0 /* load R 0 to register y */ ADD z, R 0 /* R 0 to add z*/ MOV R 0, x /* dari x to store R 0 */ � 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, R 0 ADD c, R 0 MOV R 0, a MOV a, R 0 ADD e, R 0 MOV R 0, d � Di sini statement ketiga dan keempat akan redundant, juga statement yang ketiga jika a tidak digunakan secara berurutan. 8
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. � 9
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 NPComplete Problem. 10
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 11
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) /* code for c */ 0: return address action 1 8: call p arr action 2 halt 56: i /* code for p */ 60: j action 3 return Activation Record for p (88 bytes) 0: return address 4: buf 84: n 12
� Selesai
- Slides: 13