Search for Knowledge
“A mistake is a signal that it is time to learn something new, something you didn’t know before.”

Semantic

Syntax mendefinisikan suatu bentuk program yang benar dari suatu bahasa.

Semantik mendefiniskan arti dari program yang benar secara syntax dari bahasa tersebut.

Semantik merupakan suatu bahasa membutuhkan semacam ekspresi 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, 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
Semantic 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 melebih parsing. Hal ini dapat dilakukan jika semantic sudah dirumuskan.

6. Pemahaman yang lebih baik dari desain bahasa
Jika suatu rumusan semantic sulit untuk dideksripsikan 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 mendefinisikan suatu mesin buatan (Abstrak) dengan instruksi-instruksi primitive, tidak perlu realistic, tetapi dengan cukup sederhana supaya tidak muncul kesalahpahaman. Deskripsi semantic dari bahasa pemrograman menentukan suatu translasi ke kode. Semantic Operasional menceritakan bagaimana perhitungan yang dilakukan dengan mendefinisikan bagaimana mensimulasikan pelaksanaan program.

2. Detonational Semantic
Menggambarkan apa yang diproses dengan objek matematika.
– Pendefinisan denotasi sebuah bahasa terdiri dari tiga bagian : sintax, abstrax dari bahasa itu, aljabar semantic yang menggambarkan model komputasi dan fungsi nilai. akkan
Pada pendekatan ini diberikan suatu fungsi yang memetakkan 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 teoria matematika program yang ditulis dalam bahasa. Pada pendekatan ini didefinisikan suatu tindakan program yang dibangun dengan properti logika yang menyimpan status computer sebelum dan sesudah dieksekusi.
– Rumus semantic terbagi jadi 3 :
{P}c{Q}
– Dimana c adalah struktur kendali dalam bahasa 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 dimana P sudah dipenuhi dan c sudah selesai, maka c diselesaikan pada saat pernyataan dipenuhi.
Contoh :
Program to compute S = sumi = 1
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 diantara syarat-syarat tersebut.

Contoh definisi 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(pusj(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
Menerjemahkan 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 berada.

Proses analisa sintaks dan analisa semantic merupakan proses yang sangat erat kaitannya 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 routin semantics. Untuk mengetahui makna, maka routin ini akan memeriksa :
– Apakah variabel yang ada telah didefinisikan terlebih dahulu
– Apakah variabel-variabel tersebut tipenya sama
– Apakah operand yang akan dioperasikan tersebut ada nilainya, dst
– Menggunakan table simbol
– Pemeriksaan bisa dilakukan pada tabel identifier

Pengecekan yang dilakukan dapat berupa :
– Memeriksa penggunaan nama-nama (yang berlaku)
* Duplikasi
Apakah sebuah nama terjadi pendefinisan lebih dari 2 kali. Pengecekkan dilakukan pada bagian pengelolaan block.
* Terdefinisi
Apakah nama yang dipakai program sudah terdefinisi belum. Pengecekkan dilakukan pada semua tempat kecuali block.

* Memeriksa tipe
Melakukan pemeriksaan terhadap kesesuaian tipe dalam statemen-statemen yang ada. Misal bila terdapat suatu operandnya, diperiksa tipe operasinya.

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 :
– Dapat dihasilkan dengan mudah
– Mudah ditranslasikan menjadi program sasaran (target program) Representasi kode antara biasanya berupa 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 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 attribut setiap token adalah semua informasi yang disimpan didalam table simbol. Evaluasi dari Parse Tree.

Pandang sebuah node n yang ditandai sebuah token x pada parse tree. Kita tuliskan x.a untuk menyatakan attribut a untuk token x pada node n tersebut. Nilai x.a pada node n tersebut dievaluasi dengan menggunakan aturan semantic nntuk attribut a. Aturan semantic ini ditetapkan untuk setiap produksi dimana x adalah ruas kiri produksi sebuah parse tree yang menyertakan nilai-nilai attribut pada setiap nodenya dinamakan nonated parse tree. Kumpulan aturan yang menetapkan aturan-aturan semantic untuk setiap tahap produksi yang dinamakan syntax directed definition.

Untuk jelasnya berikut ini adalah sebuah syntax directed translation yang menstranslasikan ekspresi infix menjadi exspresi 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|T-E|I,T->0|1|2|…|9}
3. Syntax directed definition

Pragmatic
Pragmatic sebuah bahasa pemrograman berhubungan dengan kemudahan implementasi, efisiensi dari suatu aplikasi, metodologi pemrograman.
Contoh :
– Pemanfaatan dan Alokasi memory yang tepat
– Kecepatan pemrosesan pada bahasa program java atau C++

Pragmatic adalah aspek praktis tentang bagaimana membangun dan memakai fitur-fitur dari sebuah bahasa pemrograman 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 dimana didalamnya 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 tetapi 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 menadi sumber kesulitan bagi programmer
– Solusi 1 : Batasi pengguna sehingga reference ke variabel lokal tidak diakses untuk waktu yang lama
– Solusi 2 : dengan menggunakan reference count
– Solusi 3 : garbage collection

2. Coroutines
– Memisahkan simulation language dengan problem
– Menyediakan struktur kontrol yang lebih natural dari subprogram pada umumnya.
 – Corooutines dapat dianggap sebagai subprogram yang tidak dibutuhkan untuk menghentikan kemudian memanggil program da melaksanakan dari titik dimana eksekusi dihentikan. Tapi coroutines tidak boleh rekursif.

3. Safety
– Pemeriksaan penulisan nama variabel (konsistensi)
– Pendeklarasian yang tepat, dengan menentukan jenis variabel yang dimaksud sesuai dengan penggunaan variabel.
– Fasilitas pengecekan yang mengurangi redudansi compiler cek setiap penggunaan dari setiap entitas agar tidak berulang.

Referensi
http://streamvoyage.com/3Kl1