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-
staemen 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
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.
– 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.
BISA JUGA DOWNLOAD MATERI LAINNYA :
0 komentar:
Posting Komentar