Pengantar Teknik Kompilasi Analisa Semantik Kode Antara dan

  • Slides: 25
Download presentation
Pengantar Teknik Kompilasi Analisa Semantik, Kode Antara, dan Pembangkitan Kode

Pengantar Teknik Kompilasi Analisa Semantik, Kode Antara, dan Pembangkitan Kode

Analisa Semantik �Semantic analyzer menggunakan pohon sintaks dan informasi pada tabel simbol untuk memeriksa

Analisa Semantik �Semantic analyzer menggunakan pohon sintaks dan informasi pada tabel simbol untuk memeriksa konsistensi semantik program sumber terhadap definisi bahasa �Komponen ini juga mencatat jenis informasi pada pohon sintaks atau tabel simbol untuk kemudian digunakan dalam pembangkitan kode antara

Analisa Semantik � Fungsi dari analisa semantik adalah untuk menentukan makna dari serangkaian instruksi

Analisa Semantik � Fungsi dari analisa semantik adalah untuk menentukan makna dari serangkaian instruksi yang terdapat pada program sumber � Untuk mengetahui makna, maka rutin analisa semantik akan memeriksa: ◦ Apakah variabel yang ada telah didefinisikan sebelumnya? ◦ Apakah variabel-variabel tersebut tipenya sama? ◦ Apakah operand yang akan dioperasikan tersebut ada nilainya? ◦ Panjang maksimum token identifier adalah 8 karakter ◦ Panjang maksimum ekspresi tunggal adalah 80 karakter ◦ Nilai bilangan bulat adalah -32768 s/d 32767 ◦ dst.

Analisa Semantik �Salah satu peran penting dari analisa semantik adalah type checking, dimana kompiler

Analisa Semantik �Salah satu peran penting dari analisa semantik adalah type checking, dimana kompiler memeriksa apakah setiap operator memiliki operand yang sesuai ◦ Misal, umumnya bahasa pemrograman menggunakan bilangan integer sebagai index bagi suatu array ◦ Kompiler harus melaporkan sebagai error apabila ada penggunaan bilangan float sebagai index pada array

Analisa Semantik �Bahasa tertentu mungkin mengizinkan semacam konversi yang disebut coercion ◦ 2+3=5 ◦

Analisa Semantik �Bahasa tertentu mungkin mengizinkan semacam konversi yang disebut coercion ◦ 2+3=5 ◦ 4, 3 + 5, 2 = 9, 5 ◦ 7 + 6, 3 = 13, 3

Analisa Semantik �Pemeriksaan yang dilakukan bertujuan untuk memastikan bahwa jenis programming error tertentu dapat

Analisa Semantik �Pemeriksaan yang dilakukan bertujuan untuk memastikan bahwa jenis programming error tertentu dapat dideteksi dan dilaporkan, mencakup: ◦ Type check, error saat operator digunakan pada operand yang tidak sesuai ◦ Flow-of-control check, pernyataan yang mengakibatkan aliran kontrol keluar dari construct harus memiliki tempat untuk memindahkan aliran kontrol tersebut ◦ Uniqueness check, pada situasi tertentu sebuah objek harus didefinisikan tepat satu kali

Kode Antara �Setelah analisa sintaks dan semantik, beberapa kompiler menghasilkan intermediate representation dari program

Kode Antara �Setelah analisa sintaks dan semantik, beberapa kompiler menghasilkan intermediate representation dari program sumber �Representasi ini perlu memiliki dua sifat penting: ◦ Mudah dihasilkan ◦ Mudah diterjemahkan ke program tujuan

Kode Antara �Kegunaan dari kode antara: ◦ Memperkecil usaha dalam membangun kompiler dari sejumlah

Kode Antara �Kegunaan dari kode antara: ◦ Memperkecil usaha dalam membangun kompiler dari sejumlah bahasa ke sejumlah mesin ◦ Proses optimasi lebih mudah (dibandingkan pada program sumber atau kode assembly dan kode mesin) ◦ Dapat melihat program internal yang mudah dimengerti

Kode Antara �Kode antara dapat memiliki banyak bentuk, salah satunya three-address code, yaitu deretan

Kode Antara �Kode antara dapat memiliki banyak bentuk, salah satunya three-address code, yaitu deretan instruksi yang tiap instruksinya terdiri atas paling banyak tiga buah operand �Sifat umum three-address code: ◦ Tiap instruksi memiliki paling banyak satu buah operator (selain assignment) sehingga saat menghasilkan kode ini kompiler harus menentukan urutan pelaksanaan ◦ Kompiler perlu membuat penyimpanan sementara untuk menyimpan nilai yang dihasilkan tiap instruksi ◦ Beberapa instruksi dapat memiliki kurang dari tiga operand

Kode Antara �Kode sumber ◦ position : = initial + rate * 60 �Analisis

Kode Antara �Kode sumber ◦ position : = initial + rate * 60 �Analisis Leksikal ◦ id 1 : = id 2 + id 3 * 60 � Analisis Sintaks ◦ : = id 1 + id 2 * id 3 60

Kode Antara �Analisis ◦ semantik : = id 1 + id 2 * id

Kode Antara �Analisis ◦ semantik : = id 1 + id 2 * id 3 inttoreal 60

Kode Antara �Kode ◦ ◦ antara temp 1 : = inttoreal (60) temp 2

Kode Antara �Kode ◦ ◦ antara temp 1 : = inttoreal (60) temp 2 : = id 3 * temp 1 temp 3 : = id 2 + temp 2 id 1 : = temp 3 �Kode antara dapat ditulis dalam beberapa bentuk, diantaranya postfix notation dan N-tuple

Kode Antara – Postfix Notation �Pada notasi postfix, operator ditulis mengikuti operand ◦ 3+4

Kode Antara – Postfix Notation �Pada notasi postfix, operator ditulis mengikuti operand ◦ 3+4 ◦ 3 -4+5 ◦ 3 -4 x 5 34+ 34 -5+ (3 - 4) x 5 3 - (4 x 5) 34 -5 x 345 x-

Kode Antara – Postfix Notation �Dibandingkan notasi aljabar, notasi postfix dinyatakan dapat melakukan perhitungan

Kode Antara – Postfix Notation �Dibandingkan notasi aljabar, notasi postfix dinyatakan dapat melakukan perhitungan dengan lebih cepat ◦ Ekspresi tidak membutuhkan parenthesis, operasi yang perlu dimasukkan lebih sedikit ◦ Perhitungan dengan notasi ini menghasilkan lebih sedikit kesalahan ◦ Jumlah angka yang perlu dimasukkan lebih sedikit �Notasi postfix dikatakan lebih sulit dipelajari dibandingkan notasi aljabar

Kode Antara – Postfix Notation � While there are input tokens left ◦ Read

Kode Antara – Postfix Notation � While there are input tokens left ◦ Read the next token from input ◦ If the token is a value �Push it onto the stack ◦ Otherwise, the token is an operator (operator here includes both operators and functions) �It is already known that the operator takes n arguments �If there are fewer than n values on the stack �(Error) The user has not input sufficient values in the expression �Else, Pop the top n values from the stack �Evaluate the operator, with the values as arguments �Push the returned results, if any, back onto the stack � If there is only one value in the stack ◦ That value is the result of the calculation � Otherwise, there are more values in the stack ◦ (Error) The user input has too many values

Kode Antara – Postfix Notation � 5 + ((1 + 2) x 4) -

Kode Antara – Postfix Notation � 5 + ((1 + 2) x 4) - 3 � 5 1 2 + 4 x + 3 Input Action Stack Notes 5 Operand 5 Push onto stack 1 Operand 15 Push onto stack 2 Operand 215 Push onto stack + Operator 35 4 Operand 435 Push onto stack x Operator 12 5 Pop 2 operands, calculate, push onto stack + Operator 17 Pop 2 operands, calculate, push onto stack 3 Operand 3 17 Pop 2 operands, calculate, push onto stack Push onto stack

Kode Antara – Quadruple �Quadruple adalah stuktur record dengan 4 buah field: op, arg

Kode Antara – Quadruple �Quadruple adalah stuktur record dengan 4 buah field: op, arg 1, arg 2, result �Three-address code ◦ x : = y + z �Quadruple ◦ +, y, z, x �Isi dari arg 1, arg 2, dan result umumnya pointer ke tabel simbol untuk nama yang direpresentasikan

Kode Antara – Triple �Untuk menhindari memasukkan temporary name ke tabel simbol, kita dapat

Kode Antara – Triple �Untuk menhindari memasukkan temporary name ke tabel simbol, kita dapat memanfaatkan posisi dari statement yang melakukan perhitungan �Dengan notasi triple, three-address code dapat direpresentasikan hanya dengan 3 field: op, arg 1, arg 2

Kode Antara – Triple �Instruksi ◦ A : = D * C + B

Kode Antara – Triple �Instruksi ◦ A : = D * C + B / E �Triple ◦ ◦ (0) (1) (2) (3) *, D, C /, B, E +, (0), (1) : =, A, (2)

Kode Antara – Perbandingan �Instruksi ◦ a : = b * -c + b

Kode Antara – Perbandingan �Instruksi ◦ a : = b * -c + b * -c Quadruple op. Triple arg 1 arg 2 (0) uminu s c (1) * b (2) uminu s c (3) * b (4) + t 2 (5) : = t 5 result op arg 1 arg 2 t 1 (0) uminu s c t 2 (1) * b t 3 (2) uminu s c t 3 t 4 (3) * b (2) t 4 t 5 (4) + (1) (3) a (5) : = a (4) t 1 (0)

Kode Antara – Indirect Triple �Kelemahan dari notasi triple adalah sulitnya melakukan optimasi ◦

Kode Antara – Indirect Triple �Kelemahan dari notasi triple adalah sulitnya melakukan optimasi ◦ Memindahkan statement yang berisi nilai sementara perlu mengubah semua rujukan statement tersebut pada array arg 1 dan arg 2 �Indirect triple memiliki dua list, yaitu list instruksi dan list eksekusi

Kode Antara – Indirect Triple �Instruksi ◦ A : = D * C +

Kode Antara – Indirect Triple �Instruksi ◦ A : = D * C + B / E ◦ F : = D * C �Indirect triple statement op arg 1 arg 2 (11) * D C (0) (11) (12) / B E (1) (12) (13) + (11) (12) (13) (14) : = A (13) (14) (15) : = F (11) (4) (11) (5) (15)

Pembangkitan Kode �Tahap pembangkitan kode akan mengambil intermediate representation dari kode sumber sebagai masukan

Pembangkitan Kode �Tahap pembangkitan kode akan mengambil intermediate representation dari kode sumber sebagai masukan dan memproduksi kode dengan program tujuan yang ekivalen

Pembangkitan Kode �Instruksi ◦ (A+B) * (C+D) �Quadruple ◦ +, A, B, T 1

Pembangkitan Kode �Instruksi ◦ (A+B) * (C+D) �Quadruple ◦ +, A, B, T 1 ◦ +, C, D, T 2 ◦ *, T 1, T 2, T 3

Pembangkitan Kode �Assembly ◦ LDA A ◦ ADD B //isi A ke akumulator //tambahkan

Pembangkitan Kode �Assembly ◦ LDA A ◦ ADD B //isi A ke akumulator //tambahkan isi akumulator dengan B ◦ ◦ ◦ ◦ STO T 1 LDA C ADD D STO T 2 LDA T 1 MUL T 2 STO T 3 //simpan isi akumulator ke T 1