Semantik

Semantik

Konsep Semantik Bahasa Pemrograman (Semantik Analisis)

Dari pembahasan bab-bab terdahulu maka kita ketahui bahwa proses ini merupakan proses kelanjutan dari proses kompilasi sebelumnya, yaitu analisa leksikal (scanning) dan analisa sintaks (parsing)
Bagian terakhir dari tahapan analisis adalah analisis semantik
Memanfaatkan pohon sintaks yang dihasilkan dari parsing
Proses analisa sintaks dan analisa semantik merupakan 2 proses yang sangat erat kaitannya dan sulit untuk dipisahkan
Contoh : A = (A + B) * (C + D)
Parser hanya akan mengenali simbol-simbol :=, +, *, parser tidak mengetahui makna dari simbol-simbol tersebut
Untuk mengenali makna dari simbol-simbol tersebut, maka compiler memanggil routine semantics

Untuk mengetahui makna, maka routine ini akan memeriksa :

apakah variabel yang ada telah didefinisikan sebelumnya
apakah variabel-variabel tersebut tipenya sama
apakah operand yang akan dioperasikan tersebut ada nilainya, dst
menggunakan tabel simbol
pemeriksaan bisa dilakukan pada tabel identifier, tabel display, dan tabel block

Pengecekan yang dilakukan dapat berupa :

Memeriksa penggunaan nama-nama (keberlakuannya)
Duplikasi  :   Apakah sebuah nama terjadi pendefinisian lebih dari 2 kali.
Pengecekan dilakukan pada bagian pengelolaan block
Terdefinisi :  Apakah nama yang dipakai pada program sudah terdefinisi atau
belum. Pengecekan dilakukan pada semua tempat kecuali block

Memeriksa Tipe
Melakukan pemeriksaan terhadap kesesuaian tipe dalam statement yang ada, misalnya bila terdapat suatu operasi, diperiksa tipe operandnya.
Contoh :
Ekspresi yang mengikuti If berarti tipenya Boolean, akan diperiksa tipe identifier dan tipe ekspresinya
Bila ada operasi antara 2 operand maka tipe operand yang pertama harus dioperasikan dengan operand yang kedua

Analisa semantik sering juga digolongkan dengan Intermediate Code yang akan menghasilkan output Intermediate Code.

Syntax-Directed Translation

Kode antara (Intermadiate Code) adalah sebuah representasi yang disiapkan untuk mesin abstrak tertentu. Dua sifat yang harus dipenuhi oleh kode antara adalah :
dapat dihasilkan dengan mudah
mudah ditranslasikan menjadi program sasaran (target program)

Representasi kode antara biasanya terbentuk tiga alamat (three-address code), baik berbentuk quadruples ataupun triples.

Kode antara (intermediate code) dibentuk dari sebuah kalimat x dalam bahasa context free. Kalimat x ini adalah keluaran dari parser. Kalimat ini tentu saja dapat dinyatakan dalam representasi pohon parsing (parse tree).

Syntax-directed translation adalah suatu urutan proses yang mentranslasikan parse tree menjadi kode antara. Tahap pertama dari pembentukan kode antara adalah evaluasi atribut setiap token dalam kalimat x. Yang dapat menjadi atribut setiap token adalah semua informasi yang dapat disimpan di dalam tabel simbol. Evaluasi dimulai dari parse tree.

Pandang sebuah node n yang ditandai sebuah token x pada parse tree. Kita tuliskan x.a untuk menyatakan atribut a untuk token x pada node n tersebut. Nilai x.a pada node n tersebut dievaluasi dengan menggunakan aturan semantik (semantic rule) untuk atribut a. Aturan semantik ini ditetapkan untuk setiap produksi dimana x adalah ruas kiri produksi. Sebuah parse tree yang menyertakan nilai-nilai atribut pada setiap nodenya dinamakan Annonated parse tree. Kumpulan aturan yang menetapkan aturan-aturan semantik untuk setiap produksinya dinamakan syntax-directed definition.

Untuk jelasnya berikut ini adalah sebuah syntax-directed translation yang mentransasikan ekspresi infix menjadi ekspresi postfix. Ekspresi infix ini dapat dipandang sebagai sebuah kalimat yang dihasilkan oleh parser.

Diketahui :
1. Kalimat x : a – 5 + 2
2. Grammar Q = { E → E + T │ E – T │ T, T → 0│1│2│…│9}
3. Syntax-directed definition :



Catatan :
lambang ‘││’ menyatakan concatenation
aturan semantik kedus produksi pertama adalah concate dua operand diikuti sebuah operator

Langkah-langkah translasi

1. Pembentukan Parse Tree

E


E + T
   

E - T 2

T 5

9

2. Pembentukan Annonated Parse Tree

E = 95  2 +

E.t = 95 - + T.t = 2

E.t = 9     - T.t = 5    2

T.t = 9    5

   9

Teknik-teknik Pendeskripsian Semantik Bahasa Pemrograman
Operational Semantic
Pendekatan ini mendefinisikan suatu mesin buatan (Abstract) dengan instruksi-instruksi primitif, tidak perlu realistik, tetapi cukup sederhana supaya tidak muncul kesalahpahaman. Deskripsi semantik dari bahasa pemrograman menentukan suatu translasi ke kode.

Denotational Semantic
Pada pendekatan ini, diberikan suatu fungsi yang memetakan program-program komputer yang ditunjuk ke dalam bentuk nilai-nilai abstrak secara matematika (angka, nilai, kebenaran, fungsi matematika, dsb).

Axiomatic Semantic
Pada pendekatan ini didefinisikan suatu tindakan program yang dibangun dengan properti logika yang menyimpan status komputer sebelum dan sesudah eksekusi.

Algebraic Semantic
Pada pendekatan ini dipertimbangkan suatu objek komputasi yang menjadi syarat-syarat dalam aljabar multi-sorted. Program mengimplementasikan fungsi yang dapat diwujudkan dengan suatu persamaan diantara syarat-syarat tersebut.

Structured Operational atau Natural Semantic
Seperti dalam pengambilan keputusan secara alamiah dengan logika. Program diberi suatu arti dari aturan yang diturunkan yang menggambarkan penilaian gagasan suatu bahasa.

KODE ANTARA / INTERMEDIATE CODE

Merupakan : hasil dari tahapan analisis, yang dibuat oleh kompilator pada saat mentranslasikan program dari bahasa tingkat tinggi.

Kegunaan :
Untuk memperkecil usaha dalam membangun kompilator dari sejumlah bahasa ke sejumlah mesin, dengan adanya kode antara yang lebih machine independent maka kode antara yang dihasilkan dapat digunakan lagi pada mesin lainnya.
Proses optimasi masih lebih mudah. Beberapa strategi optimasi lebih mudah dilakukan pada kode antara daripada program sumber atau pada kode assembly dan kode mesin.
Bila melihat program internal yang mudah dimengerti. Kode antara ini akan lebih mudah dipahami daripada kode assembly atau kode mesin.

Kerugian :
Bila dilakukan dua kali translasi , membutuhkan waktu yang relatif lama.

2 macam kode antara :
- NOTASI POSTFIX
 
  Pada suatu operasi :
   Notasi infix         : letak operator berada di tengah
   Notasi Postfix   : operator diletakkan paling akhir, disebut juga notasi sufix  atau reverse polish.

Sintax Notasi Postfix : 

   C/ :  1.  (a + b) * (c + d) dalam bentuk postfix : ab+cd+*
IF <exp> THEN <stmt1> ELSE <stmt2> dalam bentuk postfix :
  <exp> <label1> BZ <stmt1> <label2> BR <stmt2>
                                                                        ↓       ↓
                                                                       Label 1  label2

Arti notasi Postfix :
Jika kondisi ekspresi salah maka instruksi akan meloncat ke label1 dan
Menjalankan statement2 . bila kondisi ekspresi benar, maka statement1
Akan dijalankan lalu Meloncat ke label2. label1 dan label2 sendiri
menunjukkan posisi tujuan loncatan, untuk label1 posisinya tepat sebelum
statement2, dan label2 setelah statement2

BZ : branch if zero (zero=salah), bercabang/meloncat jika kondisi yang
      dites salah)
BR : branch, bercabang/meloncat tanpa ada kondisi yang dites)

IF a > b THEN
        c = d
    ELSE
   c = e

diubah ke postfix :
11  a
12  b
13  >
14  22 {menunjuk label1}
15  BZ
16  c
17  d
18  =
19 
20  25 {menunjuk label2}
21 BR
22  c
23  e
24  =
25

Artinya :
- bila ekspresi ( a > b ) salah, maka loncat ke instruksi no. 22
- bila ekspresi ( a > b ) benar, tidak terjadi loncatan, instruksi berlanjut ke no. 16        sampai 18, lalu loncat ke no. 25



NOTASI N-TUPEL
Triples notation         -  Quadruples Notation

   Bila pada postfix setiap baris instruksi hanya terdiri dari satu tupel, maka
   pada notasi tupel N-tupel setiap baris dapat terdiri ari beberapa tupel.

  

TRIPLES NOTATION (3 tupel)


C/ :  1. A:=D*C+B/E
          Kode antara tripel :  1. *, D, C
                                          2. /, B, E
                                          3. +, (1), (2)
                                          4. :=, A, (3)
       2. IF x > y THEN
              x = a  b
          ELSE
              X = a + b

          Kode antara triple : 
          1. >, x, y
          2. BZ, (1), (6) {bila kondisi (1) salah loncat ke (6)
          3. -, a, b
          4. =, x, (3)
          5. BR,  , (8)
          6. +, a, b
          7. =, x, (6)
          8.

Kekurangan Notasi triples :

Sulit pada saat melakukan optimasi, maka dikembangkan indirect triples yang
memiliki 2 list (senarai), yaitu :     -  list instruksi : berisi notasi triples
  -  list eksekusi : mengatur urutan eksekusinya

QUADRUPLES NOTATION ( 4 tupel )  


Hasil :  temporary variabel yang dapat ditempatkan pada memory atau
         register. Masalah yang ada bagaimana mengelola temporary variabel
         (hasil) seminimal mungkin.

C/ :  A:=D*C+B/E
      Kode antaranya adalah : 1. *, D, C, T1
                                            2. /, B, E, T2
                                            3. +, T1, T2, A

Comments

Popular Posts