Faramita Dwitama SEMANTIK Syntax mendefinisikan suatu bentuk bahasa. program yang benar dari suatu 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 : Algoritma Pemrograman 1C | 1 Faramita Dwitama 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 programprogram 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 Algoritma Pemrograman 1C | 2 Faramita Dwitama 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) Algoritma Pemrograman 1C | 3 Faramita Dwitama 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 statemenstaemen 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. Algoritma Pemrograman 1C | 4 Faramita Dwitama 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. Algoritma Pemrograman 1C | 5 Faramita Dwitama 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. Algoritma Pemrograman 1C | 6 Faramita Dwitama 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 . Algoritma Pemrograman 1C | 7