Semantik
Sintaks mendefinisikan suatu bentuk program yang benar dari suatu
bahasa.
Semantic mendefinisikan arti dari program yang benar
secara sintaks Dari bahasa tersebut.
Semantic suatu bahasa membutuhkan semacam
ekspresi untuk mengirimkan suatu nilai
kebenaran (True, False, NOT, atau nilai
integer).
Ilmu
semantik berkaitan dengan program dan bagaimana cara meramalkan hasil
pelaksanaan program. Ilmu semantik suatu bahasa program menguraikan hubungan
antara sintaksis dan model perhitungan. Ilmu semantik berhubungan dengan
sintaksis membangun model komputasional.
Ilmu semantik: sintaksis--> model
komputasional
Ada beberapa teknik yang digunakan dalam ilmu
semantik bahasa program, yaitu :
secara aljabar, secara aksioma,
denotational, operasional, dan terjemahan
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)
a.
Duplikasi : Apakah
sebuah nama terjadi pendefinisian lebih dari 2 kali.
Pengecekan dilakukan pada bagian pengelolaan block
b.
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
Teknik-teknik Pendeskripsian Semantik
Bahasa Pemrograman :
a. 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.
b. 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).
c. Axiomatic Semantic
Pada pendekatan ini didefinisikan suatu
tindakan program yang dibangun dengan properti logika yang menyimpan status
komputer sebelum dan sesudah eksekusi.
d. 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.
e. 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+*
2.
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)
3. 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
EmoticonEmoticon