SEMANTIK
Syntax mendefinisikan suatu bentuk
program yang benar dari suatu
bahasa. Semantik mendefinisikan arti dari program yang benar secara syntax dari bahasa tersebut.
Semantik suatu bahasa
membutuhkan semacam ekpresi untuk mengirimkan suatu nilai kebenaran (TRUE, FALSE, NOT atau nilai INTEGER). Dalam banyak kasus,
program hanya dapat dieksekusi jika benar serta mengikuti aturan syntax
dan
semantic.
Semantic
suatu
bahasa pemrograman
mempunyai
banyak
potensial,
beberapa diantaranya adalah:
1. Standarisasi bahasa pemrograman
Banyak usaha yang dilakukan
untuk menstandarisasi bahasa
pemrograman
seperti COBOL,
PASCAL, FORTRAN,dsb
untuk
lebih memudahkan
programmer
menggunakannya.
2. Referensi untuk user
Programmer
membutuhkan suatu dokumentasi yang
pasti
supaya
user
dapat mengoperasikan program yang dibuat dengan baik
3. Pembuktian
dari program yang benar
Secara matematis, program tidak mungkin bekerja dan berjalan jika
tidak ada semantic
4.
Referensi untuk implementor
Semantis akan mencegah suatu gaya bahasa yang tidak kompatibel yang
diwujudkan
dalam
suatu implementasi berbeda walaupun
dengan bahasa yang sama
5. Implementasi otomatis
Suatu
tool dapat secara otomatis membuat
translasi
bahasa yang
melebihi parsing. Hal ini dapat
dilakukan
jika
semantic
sudah
dirumuskan.
6.
Pemahaman yang lebih baik dari desain bahasa
Jika suatu rumusan semantic sulit untuk dideskripsikan secara formal
maka rumusan semantic
tersebut
juga akan sulit digunakan
oleh programmer.
Dua alasan mengapa
perlu
memahami
suatu
desain
bahasa pemrograman
dengan lebih
baik yaitu :
1. Memahami dengan lebih
baik suatu desain
bahasa pemrograman
berarti membantu
menguasai dan menggunakan bahasa tersebut.
2. Memahami dengan lebih
baik suatu desain
bahasa pemrograman
secara detail
membantu
programmer
untuk memperbaiki
proses
pengembangan
program menjadi lebih baik.
Teknik Semantic :
1. Operational Semantic
Pendekatan
ini mendefenisikan suatu mesin buatan (abstrak) dengan
instruksi-instruksi
primitive,
tidak perlu realistic, tetapi
dengan cukup sederhana
supaya
tidak
muncul kesalahpahaman.
Deskripsi
semantic dari bahasa pemrograman
menetukan suatu translasi ke kode. semantik operasional menceritakan bagaimana perhitungan yang
dilakukan dengan mendefinisikan bagaimana mensimulasikan
pelaksanaan program.
2. Detonational Semantic
menggambarkan apa yang diproses
dengan objek matematika.
Pendefinisian
denotasi
sebuah
bahasa terdiri
dari
tiga bagian:
sintaks abstrak dari bahasa itu,
aljabar semantik yang menggambarkan model komputasi dan
fungsi nilai
Pada pendekatan ini diberikan suatu fungsi yang memetakan
program- program komputer yang ditunjukkan ke dalam bentuk nilai-nilai abstrak
secara matematika
(angka, nilai kebenaran, fungsi matematika,
dsb)
3. Axiomatic Semantic
Aksiomatik semantik bahasa pemrograman mendefinisikan sebuah teori
matematika
program yang ditulis dalam bahasa.
Pada pendekatan ini dedefenisikan
suatu
tindakan program yang dibangun dengan properti
logika
yang menyimpan
status computer
sebelum dan sesudah dieksekusi.
• Rumus semantik terbagi jadi 3:
• {P} c {Q}
• Di mana c adalah struktur kendali dalam bhs pemrograman, P dan Q
adalah pernyataan sehubungan dengan
properti
dari
objek
program (seringkali
variabel). P adalah prekondisi dan Q
adalah poskondisi.
• Arti dari
• {P} c {Q}
• Adalah
jika c dilaksanakan di mana P sudah dipenuhi dan c
sudah selesai, maka c diselesaikan pada saat pernyataan Q dipenuhi
Contoh :
Program to compute S
= sumi=1
nA[i]
S,I :=
0,0 while I < n do
S,I := S+A[I+1],I+1 end
4. Algebraic Semantic
Semantik Aljabar menggambarkan arti sebuah program dengan definisi
aljabar.
Pada pendekatan
ini dipertimbangkan
suatu
objek
komputasi yang
menjadi syarat-syarat dalam aljabar multi stored. Program
mengimplementasikan fungsi
yang dapat
diwujudkan
dengan
suatu
persamaan di antara syarat-syarat tersebut.
Contoh :
Defenisi aljabar
dari integer Stack
• Domains:
• Nat (the natural numbers
• Stack ( of
natural numbers)
• Bool (boolean values)
• Functions:
• newStack: () -> Stack
• push : (Nat, Stack) -> Stack
• pop: Stack -> Stack
• top: Stack ->
Nat
• empty : Stack -> Bool
• Axioms: or
• pop(push(N,S))
= S
• top(push(N,S)) = N
• empty(push(N,S)) = false
• empty(newStack()) = true
• Errors:
• pop(newStack())
• Defining Equations:
• newStack() = []
• push(N,S) = [N|S]
• pop([N|S]) = S
• top([N|S]) = N
5. Translation Semantic
Menterjemahkan
sebuah
program ke bahasa
lain, biasanya
bahasa
mesin Seperti
dalam pengambilan keputusan
secara alamiah dengan logika,
program diberi suatu arti dari aturan yang diturunkan yang
menggambarkan penilaian gagasan suatu bahasa.
Proses analisa sintaks dan analisa semantic merupakan 2 proses yang sangat erat kaitannya sulit untuk dipisahkan.
Contoh : A:=(A+B)*(C+D)
Parser
hanya
akan mengenali symbol-simbol ‘:=’, ‘+’, ‘*’, parser
tidak mengetahui makna dari symbol-simbol tersebut. Untuk mengenali
makna dari simbol-simbol tersebut maka compiler memanggil routin semantics.
Untuk mengetahui makna, maka routin ini akan memeriksa :
Apakah variabel yang ada telah
didefenisikan terlebih dahulu
Apakah variabel-variabel tersebut tipenya sama
Apakah operand yang akan dioperasikan tersebut ada
nilainy, dst
Menggunakan table symbol
Pemeriksaan bisa dilakukan pada table identifier, table display dsb
Pengecekkan yang dilakukan dapat berupa :
Memeriksa penggunaan nama-nama (keberlakuannya)
Duplikasi
Apakah
sebuah
nama terjadi pendefenisian lebih
dari
2
kali.
Pengecekkan
dilakuak pada bagian pengelolaan block.
Terdefenisi
Apakah nama yang dipakai pada program sudah terdefenisi atau belum. Pengecekkan dilakukan pada semua tempat kecuali block.
Memeriksa tipe
Melakuakan pemeriksaan terhadap
kesesuaian tipe
dalam
statemen-
statemen 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
bisa dioperasikan dengan operand yang
kedua
Analisa Semantic sering juga digunakan dengan intermediate code yang akan
menghasilkan intermedia code
SYNTAX DIRECTED
TRANSLATOR
Kode antara (intermediate
code) adalah
sebuah
representasi yang
disiapkan untuk mesin abstrak tertentu. Dua sifat yang harus dipenuhi oleh
kode antara adalah :
1.
Dapat dihasilkan dengan mudah
2.
Mudah ditranslasikan menjadi program sasaran (target program)
Representasi kode antara biasanya
berbentuk tiga alamat (three
address
code), baik berbentuk quadruples
atau triples.
Kode antara (intermediate code) dibentuk dari sebuah kalimat X dalam
bahasa context free. Kalimat
ini adalah keluaran dari parser. Kalimat ini tentu saja dapat dinyatakan dalam represntasi pohon parsing (parse tree). Syntax directed translation adalah suatu urutan proses yang mentranslasikan parse tree menjadi kode
antara. Tahap pertama dari pembentukkan kode antara adalah evaluasi atribut setiap
tokn adalah semua informasi yang disimpan di dalam table symbol.
Evaluasi 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 semantic untuk atribut a. Aturan semantic ini ditetapkan untuk setiap
produksi dimana x
adalah ruas
kiri produksi sebuah parse tree yang menyertakan nilai-nilai atribut pada setiap nodenya dinamakan nonated parse tree. Kumpulan
aturan yang menetapkan aturan-aturan semantic untuk setiap tahap produksinyadinamakan syntax
directed definition.
Untuk jelasnya
berikut ini
adalah sebuah
syntax
directed
translation
yang mentranslasikan ekspresi infix menjadi ekspresi postfix. Ekspresi infix ini
dapat dipandang sebagai sebuah kalimat yang dihasilkan oleh parser.
Contoh :
Diketahui : 1. Kalimat X: 9-5+2
2. Grammar
Q = {E E+T| E – T | I, T 0|1|2|...|9}
3. Syntax directed definition
PRAGMATIG
Pragmatic sebuah bahasa pemrograman berhubungan dengan
:
• Kemudahan Implementasi
• Efisiensi dari suatu Aplikasi
• Metodologi Pemrograman contoh :
– Pemanfaatan dan
Alokasi memori yang tepat
– Kecepatan pemrosesan
– Pada bhs.prog JAVA
atau C++
Pragmatik
adl aspek praktis tentang bagaimana membangun
dan memakai fitur-fitur
dari sebuah bahasa pemrogramang untuk mencapai tujuan.
1. Heap
& Pointer
Variabel heap
adalah variabel yang bisa diciptakan dan dihapus kapan saja.
Heap variabel tidak memiliki
nama dan bisa diakses dengan pointer.
Heap adalah sebuah
blok memori di mana di dalamnya ada
potongan-potongan informasi itu dialokasi dan
dikosongkan dengan
cara tertentu
Jangka waktu hidup heap itu dimulai dari saat dia dibuat hingga dia
tidak diakses lagi.
Kadang ada sebuah operasi deallocator yang memaksa penghapusan
sebuah variabel heap.
Ketika sebuah
variabel heap dihapus dia sebenarnya masih
ada
dalam memori tapi tidak bisa diakses, sehingga menjadi garbage
Jika seorang programmer bisa men-dealokasi variabel, akan terjadi masalah.
Pointer yang mengarah ke variabel
heap yang
sudah
terhapus, maka variabel ini menjadi dangling reference
Garbage
dan dangling
reference
menjadi
sumber
kesulitan bagi
programmer
Solusi I: Batasi penggunaannya sehingga reference ke variabel lokal tidak diakses
untuk waktu yang lama
Solusi II: dengan menggunakan reference count
Solusi III: garbage collection
2. Coroutines
– Memisahkan simulation language dengan problem
– Menyediakan struktur kontrol yang lebih
natural dari pada
subprogram pada umumnya
– Coroutines dapat
diangggap
sebagai
subprogram yang tidak dibutuhkan untuk menghentikan, kemudian memanggil program dan
melaksanakan dari titik dimana
eksekusi
dihentikan. Tapi
coroutines tidak boleh rekursif.
3. Safety
– Pemeriksaan penulisan nama variabel (konsistensi)
– Pendeklarasian yang tepat
Menentukan apakah jenis variabel yang dimaksud sesuai dengan
penggunaan variabel.
– Fasilitas
pengecekan yang mengurangi redundansi
Compiler cek setiap penggunaan dari setiap entitas agar tidak
berulang .
0 komentar:
Posting Komentar