Programming Language Concept Session 13

Programming Language Concept  Session 13


  • Programming yang menggunakan bentuk logika simbolik sebagai bahasa programming sering dikenal dengan logic programming
  • Bahasa yang didasari pada logika simbolik dikenal dengan logic programming language, atau declarative language

Intro Singkat ke Predikat Kalkulus

  • Proposition merupakan pernyataan logika yang berkemungkinan (atau tidak) bernilai true
  • Proposition berisi objek dan hubungan objek dengan satu sama lain
  • Logika yang dapat digunakan untuk keperluan dasar logika formal:
    – Menyatakan proposition
    – Menyatakan hubungan antar proposition
    – Menjelaskan bagaimana proposition baru
  • Bentuk tertentu logika simbolik yang digunakan untuk programming logika dikenal predicate calculus
  • Objek di proposition diwakilkan antara constant atau variable
  • Constant merupakan simbol yang mewakili objek
  • Variable merupakan simbol yang dapat mewakili objek berbeda di waktu yang berbeda
  • Atomic proposition berisi compound term
  • Compound term merupakan satu elemen relasi metematika, ditulis seperti fungsi matematika
    Fungsi matematika merupakan suatu pemetaan
    – Dapat ditulis sebagai tabel
  • Compound term dibuat dari dua bagian:
    Functor: simbol fungsi yang menamakan hubungan
    – Daftar berurut parameter (tuple)
    – Contoh:

    student(jon)

    like(seth, OSX)

    like(nick, windows)

    like(jim, linux)

  • Proposition dapat dikondisikan di dua bentuk:
    – Fact: proposition diasumsikan menjadi true- Query: kebenaran proposition akan ditentukan
  • Compound proposition memiliki dua atau lebih proposition atomic, dan proposition dihubungkan oleh operator
  • Operator logika:

  • Quantifier

Overview of Logic Programming


  • Salah satu karakteristik esensial bahasa programming logika adalah semanticnya, yang dikenal dengan declarative semantic
  • Declarative semantic lebih sederhana dari semantic di bahasa imperative

Term


  • Term merupakan suatu constant, variable, atau structure
  • Constant merupakan atom atau integer
  • Atom merupakan nilai simbolik dari Prolog
  • Atom berisi antara:
    – Kumpulan huruf, digit, dan underscore yang dimulai dengan huruf kecil
    – Kumpulan karakter ASCII yang dapat dicetak dibatasi oleh apostrophe
  • Variable merupakan kumpulan huruf, digit, dan underscore apapun yang dimulai dengan huruf capital
  • Instantiation merupakan pengikatan variable ke nilai
  • Structure mewakili atomic proposition

Fact Statement


  • Digunakan untuk hipotesis
  • Klausa Headless Horn:

female(shelley).

male(bill).

father(bill, jake).

Rule Statement


  • Digunakan untuk hipotesis
  • Kalusa Headed Horn
  • Sisi kanan : antecedent (bagian if)
    – Dapat berupa single term atau conjunction
  • Sisi kiri : consequent (bagian then)
    – Harus berupa single term
  • Conjuntion merupakan multiple term yang dipisahkan oleh operator logika AND
  • Contoh:

ancestor(mary,shelley):- mother(mary,shelley).

Goal Statement


  • Untuk teorema pembuktian, teorema dalam bentuk proposition yang kita ingin system membuktikan atau tidak – goal statement
  • Beberapa format sebagai headless Horn

man(fred)

  • Proposition conjunctive dan proposition dengan variable juga legal goal

father(X, mike)

Inferencing Process of Prolog


  • Quary disebut goal
  • Jika goal merupakan compound proposition, tiap faktanya merupakan subgoal
  • Untuk membuktikan suatu goal true, harus mencari rantai aturan inference dan atau fakta, untuk goal Q:

P2 :- P1

P3 :- P2

Q :- Pn

  • Proses membuktikan subgoal dikenal dengan matching, satisfying, atau resolution
  • Matching merupakan proses pembuktian proposition
  • Membuktikan subgoal disebut satisfying subgoal tersebut
  • Pendekatan mulai dengan fakta dan aturan database dan mencoba mencari rentetan match yang membawa ke goal disebut dengan bottom-up resolution, atau forward chaining
  • Pendekatan mulai dengan goal dan mencoba mencari rentetan matching proposition yang membawa ke beberapa set fakta awal di database disebut top-down resolution, atau backward chaining
  • Implementasi prolog menggunakan backward chaining
  • Ketika goal memiliki lebih dari satu subgoal, dapat menggunakan antara:
    Depth-first search: mencari bukti lengkap untuk subgoal pertama sebelum mengerjakan yang lainnya
    Breadth-first search: mengerjakan semua subgoal secara pararel
  • Prolog menggunakan depth-first search
  • Goal dengan banyak subgoal, jika gagal menunjukkan kebenaran salah satu subgoal, mempertimbangkan kembali subgoal sebelumnya untuk mencari solusi alternative, disebut backtracking
  • Backtracking mulai mencari diamana pencarian sebelumnya ditinggalkan
  • Backtracking dapat memakan banyak waktu dan tempat karena mungkin mencari semua kemungkinan bukti ke tiap subgoal

Aritmatika Sederhana


  • Prolog mendukung variable integer dan aritmatika integer
  • Operator is mengambil ekspresi aritmatika sebagai operand kanan dan variable sebagai operand kiri, contoh:

A is B / 17 + C

  • Tidak sama dengan pernyataan assignment, berikut ini illegal:

Sum is Sum + Number.

  • Contoh:

speed(ford,100).

speed(chevy,105).

speed(dodge,95).

speed(volvo,80).

time(ford,20).

time(chevy,21).

time(dodge,24).

time(volvo,24).

distance(X,Y) :-          speed(X,Speed),

time(X,Time),

Y is Speed * Time.

A query: distance(chevy, Chevy_Distance).

Trace


  • Merupakan struktur built-in yang menampilkan instantiation ditiap langkah
  • Tracing model eksekusi – empat kejadian:
    – Call (permulaan mencoba untuk satisfy goal)
    – Exit (ketika goal sudah di-satisfy)
    – Redo (ketika backtrack terjadi)
    – Fail (ketika goal gagal)
  • Contoh:

likes(jake,chocolate).

likes(jake, apricots).

likes(darcie, licorice).

likes(darcie, apricots).

trace.

likes(jake, X), likes(darcie, X).

  • 1 Call: likes(jake, _0)?

(1) 1 Exit: likes(jake, chocolate)

(2) 1 Call: likes(darcie, chocolate)?

(2) 1 Fail: likes(darcie, chocolate)

  • 1 Redo: likes(jake, _0)?

(1) 1 Exit: likes(jake, apricots)

(3) 1 Call: likes(darcie, apricots)?

(3) 1 Exit: likes(darcie, apricots)

X = apricots

List Structure


  • List merupakan rentetan elemen angka berapapun
  • Elemen dapat berupa atom, atomic proposition, atau term lain (termasuk list lain)

[apple, prune, grape, kumquat]

[]                           (empty list)

        [X | Y]   (head X and tail Y)

  • Contoh append

append([], List, List).

append([Head | List_1], List_2, [Head | List_3]) :-

append (List_1, List_2, List_3).

Kekurangan Prolog


  • Resolution order control
    – Di lingkungan programming logika murni, urutan matches yang dicoba adalah tidak deterministik dan semua match akan dicoba secara concurrent
  • Asumsi closed-world
    – Satu-satunya pengetahuan hanya yang ada di database
  • Masalah negasi
    – Apapun yang dinyatakan di database diasumsikan menjadi false
  • Pembatasan intrinsik
    – Mudah untuk menyatakan proses pengurutan secara logika, namun susah untuk melakukannya

Aplikasi Programming Logika

  • Sistem manejemen database relasional
  • Sistem expert
  • Pemrosesan bahasa natural

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 16)
  • Logic Programming Languages / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 12

Programming Language Concept Session 12


  • Desain bahasa imperative didasari secara langsung pada arsitektur von Neumann
  • Desain bahasa fungsional didasari pada fungsi matematika

Mathematical Function


  • Mathematical function merupakan anggota pemeraan dari satu himpunan, dikenal dengan himpunan domain, ke himpuan lain, dikenal dengan himpunan range
  • Ekspresi lambda menjelaskan parameter dan pemetaan fungsi dalam bentuk berikut:

l(x) x * x * x

Untuk fungsi  cube(x) = x * x * x

  • Ekspresi lambda menggambarkan fungsi tanpa nama
  • Ekspresi lambda diterapkan ke parameter dengan meletakkan parameter tersebut setelah ekspresi, contoh:

 (l(x) x * x * x)(2)

Yang menghasilkan nilai 8

  • Higher-order function, atau functional form, merupakan bentuk yang mengambil antara fungsi sebagai parameter atau menghasilkan suatu fungsi sebagai hasilnya
  • Funtional form yang mengambil dua fungsi sebagai parameter dan menghasilkan suatu fungsi yang nilainya merupakan actual parameter function pertama yang dipakai ke aplikasi kedua, disebut function composition, seperti:

Bentuk: h º f ° g (° merupakan operator komposisi)

Yang aritnya h (x) º f ( g ( x))

Untuk f (x) º x + 2  dan g (x) º 3 * x,

h º f ° g menghasilkan (3 * x)+ 2

  • Apply-to-all merupakan functional form yang mengambil satu fungsi sebagai parameter dan menghasilkan suatu daftar nilai yang didapat dengan menerapkan fungsi yang didapat tadi ke tiap elemen dari daftar parameter, seperti:

Form: a

For h(x) º x * x

a(h, (2, 3, 4))  yields  (4, 9, 16)

LISP Sebagai Bahasa Pemrograman Fungsional Pertama


  • Tipe data objek: awalnya hanya atom dan list
  • Bentuk list: kumpulan sublist berkurung dan atau atom

(A B (C D) E)

  • Awalnya, LISP merupakan typeless language
  • List LISP disimpan secara internal sebagai single-linked list
  • Notasi lambda digunakan untuk menjelaskan fungsi dan definisinya. Aplikasi fungsi dan data memiliki bentuk yang sama,
    contoh:
    – Jika list (A B C) diintepretasikan sebagai data, maka menjadi daftar tiga atom sederhana , A, B, dan C
    – Jika diintepretasikan sebagai aplikasi fungsi, artinya fungsi bernama A diterapkan ke dua parameter, B dan C

Scheme


Fungsi Primitif dan Ekspresi LAMBDA

  • Fungsi aritmatika primitive: +, -, *, /, ABS, SQRT, REMAINDER, MIN, MAX
  • Bentuk ekspresi lambda didasari dari notasi :

(LAMBDA (x) (* x x)

x disebut variable pengikat

  • Ekspresi lambda dapat diterapkan ke parameter, contoh:

((LAMBDA (x) (* x x)) 7)

  • Ekspresi LAMBDA dapat memiliki jumlah parameter berapapun

DEFINE

  • Terdapat dua bentuk:

Untuk mengikat suatu simbol ke ekspresi, contoh:

(DEFINE pi 3.141593)

Untuk mengikat name ke ekspresi lambda

(DEFINE (square x) (* x x))

  • Proses evaluasi: parameter pertama tidak dievaluasi, parameter kedua dievaluasi dan diikat ke parameter pertama

Numeric Predicate Function


Function               Meaning

=           Equal

<>          Not equal

>           Greater than

<           Less than

>=          Greater than or equal to

<=          Less than or equal to

EVEN?       Is it an even number?

ODD?        Is it an odd number?

ZERO?       Is it zero?

  • Di Scheme, nila dua Boolean adalah #T dan #F

List Function


  • QUOTE – mengambil satu parameter; mengembalikan parameter tersebut tanpa evaluasi
  • QUOTE dibutuhkan karena intrepeter Scheme, bernama EVAL, selalu mengevaluasi parameter ke aplikasi fungsi sebelum menerapkan fungsi tersebut. QUOTE digunakan untuk menghindari evaluasi parameter ketika tak dibutuhkan
  • QUOTE dapat disingkat dengan operator prefix apostrophe:

‘(A B) ekuivalen dengan (QUOTE (A B))

  • Contoh:

(CAR ′((A B) C D)) mengembalikan (A B)

(CAR ′A) error

(CDR ′((A B) C D)) mengembalikan (C D)

(CDR ′A) error

(CDR ′(A)) mengembalikam ()

(CONS ′() ′(A B)) mengembalikan (() A B)

(CONS ′(A B) ′(C D)) mengembalikan ((A B) C D)

(CONS ′A ′B) mengembalikan (A . B)  (a dotted pair)

  • LIST merupakan fungsi untuk membangun suatu daftar dari parameter angka berapapun

(LIST ′apple ′orange ′grape) mengembalikan (apple orange grape)

Membandingkan Bahasa Fungsional dan Imperative


  • Bahasa Imperatif:
    – Eksekusi efesien
    Semantic kompleks
    Syntax kompleks
    Concurreny didesain programmer
  • Bahasa Fungsional:
    Semantic sederhana
    Syntax sederhana
    – Eksekusi tak lebih efesien dari imperative
    – Program dapat dibuat otomatis menjadi concurrent

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 15)
  • Functional Programming Languages / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 11

Programming Language Concept Session 11


  • Di bahasa tanpa exception handling:
    – Ketika suata exception terjadi, control menjadi milik operating system, dimana suatu message ditampilkan dan program tersebut berakhir
  • Di bahasa dengan exception handling:
    – Program diperbolehkan menjebak beberapa exception, dengan itu menyediakan kemungkinan memperbaiki masalah tersebut dan melanjutkan
  • Exception merupakan kejadian tak biasa, keliru atau tidak, yang terdeteksi oleh hardware atau software dan yang mungkin memerlukan pemrosesan special
  • Pemrosesan special yang mungkin dibutuhkan ketika exception dideteksi dikenal dengan exception handling
  • Exception handling dilakukan oleh unit code atau segmen yang dikenal dengan exception handler
  • Exception raised ketika kejadian yang sehubungan dengannya terjadi
  • Di beberapa bahasa berbasi C mengenalnya dengan sebutan thrown, bukan raised
  • Alternatif exception handling:
    – Mengirim parameter pembantu atau menggunakan return value untuk menandakan status return dari suatu subprogram
    – Melempar label parameter ke semua subprogram (error return ke label yang dilempar)
    – Melempar exception handling subprogram ke semua subprogram
  • Keuntungan exception handling built-in:
    – Tanpa exception handling, deteksi code error membosankan untuk ditulis dan mengacaukan program
    – Exception handling mengajak programmer untuk memperkirakan banyak kemungkinan error
    Exception progagation memperbolehkan penggunanan level tinggi code exception handling
  • Alur control exception handling

Exception Handling di C++


  • Bentuk:

try {

— code that is expected to raise an exception

}

catch (formal parameter) {

handler code

}

catch (formal parameter) {

handler code

}

  • catch merupakan nama semua handler, merupakan overloaded name sehingga formal parameter harus unik
  • Formal parameter dari catch tidak harus memiliki variable
  • Formal parameter dari catch dapat digunakan untuk memindahkan infromasi ke handler
  • Formal parameter dari catch dapat berbentuk ellipsis (…), yang mana case yang di-handlenya merupakan exception yang belum di-handle
  • Semua exception di-raise secara explisit oleh pernyataan

throw [expression];

  • Bracket di code diatas merupakan metasymbol yang digunakan untuk menjelaskan bahwa expresi tersebut optional
  • Throw tanpa operand hanya dapat muncul di handler, ketika ia muncul, ia hanya me-raise kembali exception tersebut, yang mana kemudian dihandle di tempat lain
  • Tipe expresi tidak membuat ambigu handler yang dimaksudkan
  • Unhandler exception:
    Unhandled expcetion disebarkan ke pemanggil fungsi dimana ia di-raise
    – Penyebaran ini berlanjut ke fungsi utama
    – Jika tak ditemukan handler, handler default dipanggil
  • Setelah handler menyelesaikan eksekusinya, control mengalir ke pernyataan pertama dari handler terakhir di rentetan handler yang merupakan suatu elemen

Event Handling di Java


  • Event merupakan notifikasi bahwa sesuatu yang spesifik telah terjadi, seperti klik-an mouse di tombol graphical
  • Event handler merupakan segmen code yang dieksekusi untuk menanggapi suatu event
  • Komponen Java Swing GUI:
    Text box merupakan objek dari kelas JTextField
    Radio button merupakan objek dari kelas JRadioButton
    – Tampilan Applet merupakan frame, suatut struktur multilayered
    Content pane merupakan satu layer, dimana applet meletakkan output
    – Komponen GUI dapat diletakkan di suatu frame
    Layout manager object digunakan untuk mengontrol peletakan komponen
  • Java event model:
    – Interaksi user dengan komponen GUI membuat event yang dapat ditangkap oleh event handler, dikenal dengan event listener
    Event generator memberitahu listener event dengan mengirim suatu pesan
    Interface digunakan untuk membuat metode event handling sesuai dengan protocol standar
    – Kelas yang mengimplementasi listener harus mengimplementasi suatu interface untuk listener tersebut
    – Salah satu kelas event adalah ItemEvent, yang berhubungan dengan event mengklik checkbox, radio button, atau list item
    Interface ItemListener menentukan metode, itemStateChanged, yang mana merupakan handler untuk event ItemEvent
    Listener dibentuk dengan addItemListener

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 14)
  • Exception Handling & Event Handling / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 10

Programming Language Concept Session 10


  • Concurrency dapat terjadi di empat level:
    Machine instruction level (mengeksekusi dua atau lebih instruksi mesin bersamaan)
    High-level language statement level (mengeksekusi dua atau lebih pernyataan bahasa level tinggi bersamaan)
    Unit level (mengeksekusi dua atau lebih unit subprogram bersamaan)
    Program level (mengeksekusi dua atau lebih program bersamaan)
  • Mekanisme control concurrent meningkatkan felixibility programming
  • Algoritma concurrent dikatakan scalable jika kecepatan eksekusinya bertambah ketika lebih banyak processor tersedia
  • Physical concurrency merupakan concurrency, misal ada lebih dari satu processor, yang beberapa unit program dari program yang sama eksekusi bersamaan
  • Ketika programmer dan aplikasi software memisalkan bahwa ada banyak processor menyediakan actual concurrency, ketika faktanya eksekusi sebenarnya dari program berada di sisipan di satu processor dikenal dengan logical concurrency
  • Alasan menggunakan concurrency:
    – Kecepat eksekusi program di mesin dengan banyak processor
    – Bahkan ketika suatu mesin hanya memiliki satu processor, program yang ditulis untuk eksekusi concurrent dapat lebih cepat dari program sama yang ditulis untuk eksekusi beruntun (nonconcurrent)
    Concurrency menyediakan metode berbeda mengkonseptualisasi solusi program ke masalah
    – Untuk aplikasi program yang didistribusikan ke bermacam mesin, secara local ataupun melalui Internet

Subprogram-Level Concurrency


  • Task merupakan unit dari program, mirip dengan subprogram, yang dapat berada di eksekusi concurrent dengan unit lain di program yang sama
  • Task terkadang dikenal dengan process
  • Di beberapa bahasa seperti Java dan C# , metode tertentu bekerja sebagai task, dan dieksekusi di objek yang dikenal dengan thread
  • Heavyweight task mengeksekusi di tempat alamatnya sendiri
  • Lightweight task semua berjalan di tempat alamat yang sama, sehingga dapat lebih efesien dari heavyweight
  • Suatu task dikatakan disjoint ketika tidak berkomunikasi atau berdampak ke eksekusi dari task lain di program tersebut
  • Synchroninzation merupakan mekanisme yang mengkontrol urutan dimana task mengeksekusi
  • Ada dua macam synchronization:
    Cooperation synchronization, dibutuhkan ketika suatu task harus menunggu task lainnya untuk menyelesaikan aktivitasnya sebelum task tadi mulai atau melanjutkan eksekusinya
    Competition synchronization, dibutuhkan ketika ada dua task yang membutuhkan sumber sama yang tak dapat digunakan bersamaan
    – Contoh: jika task A perlu akses data lokasi x ketika task B sedang mengakses x, task A harus menunggu task B menyelesaikan pemrosesan dari x.

Cooperation: task mungkin harus menunggu pemrosesan di tempat yang diperlukan operasi task miliknya tersebut selesai

Competition: task mungkin harus menunggu selesainya pemrosesan lain dari task apapun yang sedang terjadi di data tertentu

  • Competition synchronization diperlukan ketika dua task dapat menghasilkan hasil yang berbeda yang bergantung pada urutannya, seperti:

Task A: TOTAL = TOTAL + 1

Task B: TOTAL = 2 * TOTAL

  • Sistem program run-time yang dikenal dengan scheduler mengatur pembagian processor diantara task
  • Scheduler menyediakan synchronization yang memerlukan mekanisme untuk menghambat waktu eksekusi task
  • Task dapat berada di berbagai keadaan berbeda:
    New: task dikatakan berada di kondisi new ketika telah dibuat namun belum memulai eksekusi
    Ready: task dikatakan siap untuk dijalankan namun sedang belum dijalankan
    Running: task yang sedang mengeksekusi
    Blocked: task yang telah berjalan, namun ekekusinya diganggu oleh event tertenu
    Dead: task yang tidak lagi hidup (eksekusinya sudah selesai atau secara eksplisit dimatikan oleh program)
  • Liveness merupakan suatu karakteristik yang mungkin atau tidak dimiliki oleh suatu unit program
    – Di code sekuensial, artinya unit tersebut akhirnya akan menyelesaikan eksekusinya
  • Jika semua task di lingkungan concurrent kehilangan livenessnya, maka dikenal dengan deadlock

Semaphore


  • Dirancang oleh Edsger Dijkstra pada tahun 1965
  • Semaphore merupakan struktur data yang berisi counter dan queue untuk menyimpan task descriptor
  • Task descriptor merupakan struktur data yang menyimpan semua informasi relevan tentang keadaan eksekusi dari task
  • Semaphore dapat digunakan untuk mengimplementasi guard di code yang mengakses struktur data bersama (shared)
  • Guard merupakan alat lingustik yang memperbolehkan code yang dijaga (guarded) dieksekusi hanya ketika kondisi tertentu bernilai true
  • Semaphore hanya memiliki dua operasi, wait dan release (dikenal P dan V oleh Dijkstra)
  • Semaphore dapat digunakan untuk menyediakan competition dan cooperation synchronization

Cooperation Synchronization dengan Semaphore


Untuk cooperation synchronization, buffer harus memiliki cara mencatat jumlah posisi yang kosong dan yang telah terisi di buffer utnuk menghindari underflow dan overflow. Misal emptyspots dapat digunakan menjadi variable counter untuk menjaga jumlah posisi kosong di shared buffer yang digunakan producer dan consumer, dan fullspot sebagai variable counter untuk menjaga jumlah posisi terisi di shared buffer. Queue emptyspot dapat menyimpan task producer yang menunggu tempat kosong di buffer, sedangkan queue fullspot dapat menyimpan task consumer yang menunggu nilai untuk diletakkkan di buffer.

Misal buffer tersebut didesain sebagai ADT yang semua datanya masuk ke buffer melalui subprogram DEPOSIT, dan semua data yang meninggalkan buffer melalui subprogram FETCH. Subprogram DEPOSIT hanya perlu memeriksa semaphore emptyspot untuk melihat apakah ada tempat kosong. Jika setidaknya ada satu, maka DEPOSIT dapat dieksekusi, yang memiliki side effect mengurangi counter emptyspot. Jika buffer penuh, pemanggil DEPOSIT harus menunggu di emptyspots queue hingga tempat kosong tersedia. Ketika DEPOSIT selesai, subprogram DEPOSIT menambahkan counter semaphore fullspot untuk menandakan kalau ada satu lagi lokasi terisi di buffer.

Subrpogram FETCH memiliki rentetan yang bertolak belakang dengan DEPOSIT. Ia memerika semaphore fullspot untuk meliha apakah buffer memiliki setidaknya satu item. Jika iya, item ditanggalkan dan semaphore emptyspot menambah counternya satu. Jika buffer kosong, pemanggil task diletakkan di queue fullspot untuk menunggu hingga item muncul. Ketika FETCH selesai, ia harus menambahkan counter emptyspots.

Operasi tipe semaphore sering tidak langsung – ia diselesaikan melalui subprogram wait dan release. Maka dari itu, operasi DEPOSIT yang hanya dijelaskan sebenarnya diselesaikan dengan panggilan ke wait dan release. Perlu diingat bahwa wait dan release harus bisa mengakses task-ready queue

Subprogram semaphore wait digunakan untuk menguji counter dari variable semaphore yang diberikan. Jika nilainya lebih dari nol, pemanggil dapat menjalakan operasinya. Dalam kasus ini, nilai counter dari variable semaphore dikurangi untuk menandai bahwa sekarang ada lebih dikit satu dari apapun yang dihitungnya. Jika nilai counter nol, pemanggil tersebut harus diletakkaan di waiting queue variable semaphore, dan processor harus diberikan ke ready task lainnya.

Subprogram semaphore release digunakan oleh task untuk membolehkan task lain untuk memiliki satu dari berapapun counter dari yang dihitung variable semaphore yang ditentukan. Jika queue dari variable semaphore yang ditentukan kosong, yang artinya tak ada task yang menunggu, release menambahkan counternya (untuk menandakan ada satu lagi dari apapun yang sedang dikontrol sekarang tersedia). Jika satu atau lebih task sedang menunggu, release memindahkan satu dari mereka dari queue semaphore ke ready queue.

  • Pseudocode operasi wait dan release

wait(aSemaphore)

if aSemaphore’s counter > 0 then

decrement aSemaphore’s counter

else

put the caller in aSemaphore’s queue

attempt to transfer control to some ready task

(if the task ready queue is empty, deadlock occurs)

end if

release(aSemaphore)

if aSemaphore’s queue is empty (no task is waiting) then

increment aSemaphore’s counter

else

put the calling task in the task-ready queue

transfer control to a task from aSemaphore’s queue

end

  • Pseuodocode task producer dan consumer:

semaphore fullspots, emptyspots;

fullspots.count = 0;

emptyspots.count = BUFLEN;

task producer;

loop

— produce VALUE —

wait(emptyspots); { wait for a space }

DEPOSIT(VALUE);

release(fullspots); { increase filled spaces }

end loop;

end producer;

task consumer;

loop

wait(fullspots); { make sure it is not empty }

FETCH(VALUE);

release(emptyspots); { increase empty spaces }

— consume VALUE —

end loop

end consumer;

Competition Synchronization dengan Semaphore


  • Semaphore ketiga, yang dinamakan access, digunakan untuk mengontrol akses
  • Counter dari access hanya memiliki nilai 0 dan 1
  • Semaphore semacam ini dikenal dengan binary semaphore
  • Contoh:

semaphore access, fullspots, emptyspots;

access.count = 1;

fullspots.count = 0;

emptyspots.count = BUFLEN;

task producer;

loop

— produce VALUE —

wait(emptyspots); { wait for a space }

wait(access); { wait for access }

DEPOSIT(VALUE);

release(access); { relinquish access }

release(fullspots); { increase filled spaces }

end loop;

end producer;

task consumer;

loop

wait(fullspots); { make sure it is not empty }

wait(access); { wait for access }

FETCH(VALUE);

release(access); { relinquish access }

release(emptyspots); { increase empty spaces }

— consume VALUE —

end loop

end consumer;

Monitor


  • Semua operasi sinkronisasi pada shared data dikumpulkan menjadi satu unit program, struktur tersebut dinamakan monitor
  • Competition Synchronization
    Shared data merupakan penghuni di monitor (bukan di unit client)
    – Implementasi monitor menggaransikan akses disinkronisasi dengan memperbolehkan hanya satu akses di suatu waktu
    – Panggilan ke procedure monitor secara implisit di-queue jika monitor tersebut sibuk sewaktu pemanggilan
  • Cooperation Synchronization
    – Kerja sama antar proses masih sebuah task programming
    – Programmer harus menggaransikan kalau shared buffer tak akan underflow atau overflow

Message Passing


  • Message passing merupakan model umum untuk concurrency
    – Dapat meniru semaphore dan monitor
    – Tidak hanya untuk competition synchronization
  • Konsep synchronous message passing: seperti atasan yang meminta sekretarisnya untuk menahan semua telepon masuk hingga aktivitas lainnya karena sedang melakukan obrolan penting. Setelah obrolan tersebut selesai, atas memberitahu sekretaris tersebut kalau ia sekarang sudah bisa berbicara dengan pemanggil yang telah ditunda tadi.
  • Task dapat didesain sehingga ia dapat menunda eksekusinya di titik tertentu, seperti seseorang yang sedang menunggu untuk panggilan penting. Di beberapa kasus, tak dapat melakukan apa-apa selain duduk diam dan menunggu. Namun, jika task A sedang menunggu suatu message saat task b mengirim message, message tersebut dapat ditransmit. Actual transmition message ini dikenal dengan rendezvous

  • Task yang memilik klausa accept, namun code yang lainnya tidak dikenal dengan server task (contoh gambar diatas)
  • Task tanpa klausa accept dikenal dengan actor task


Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 13)
  • Concurrency / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 9

Programming Language Concept Session 9


OOP di bahasa pemrograman:

  • Beberapa bahasa mendukung procedural dan data-oriented programming (Ada 95+ dan C++)
  • Beberapa mendukung functional program (CLOS).
  • Bahasa baru tidak mendukung paradigm lain namun menggunakan struktur imperative (Java dan C#)
  • Beberapa lainnya merupakan bahasa OOP murni (Smalltalk dan Ruby)

Suatu bahasa yang mendukung OOP haruslah memiliki:

  • Abstract Data Type (ADT)
  • Inheritence
  • Dynamic Binding (Polymorphism)

Inheritence


Dua masalah terkait ADT:

  • ADT sulit untuk digunakan kembali karena dalam beberapa kasus, diperlukan suatu modifikasi
  • Semua ADT independen dan berada di level yang sama

Inheritence muncul sebagai solusi untuk kedua masalah diatas. Inherintence disini dapat mewarisi (inherit) data dan fungsionalitas dari beberapa tipe yang sudah ada, dan juga dapat memperbolehkan memodifikasi beberapa entitas ataupun menambahkan entitas baru. Tak hanya itu, inheritance juga menyediakan suatu framework untuk definisi kehirearkian dari kelas-kelas yang berhubungan.

Istilah di OOP:

  • ADT di OOP biasa dikenal dengan classes
  • Instansi dari class tersebut disebut dengan objects
  • Suatu kelas yang didefinisikan melalui inheritence dari kelas lain disebut dengan derived class atau subclass
  • Suatu kelas yang menurunkan kelas baru disebut dengan parent class atau superclass
  • Subprogram yang mendefinisikan operasi pada objek-objek di suatu kelas dikenal dengan methods
  • Panggilan ke method dikenal dengan messages
  • Keseluruhan collection method dari suatu object dikenal dengan message protocol atau message interface dari object tersebut

Apasaja yang dapat dilakukan oleh kelas:

  • Suatu kelas dapat menyembunyikan entitas dari subclassnya
  • Suatu kelas dapat menyembunyikan entitas dari clientnya
  • Suatu kelas juga dapat menyembunyikan entitas untuk clientnya tanpa menyembunyikannnya dari subclassnya
  • Selain dapat mewarisi method secara total, suatu kelas juga dapat memodifikasi method yang diwariskan tadi. Method baru ini disebut meng-overrides kelas yang mewarisinya dan method dari parentnya di-

Tiga cara membedakan kelas dari parentnya:

  • Parent class dapat mendefinisikan beberapa variable atau methodnya untuk memiliki akses private, yang berarti mereka tak akan dapat diakses di subclass
  • Subclass tersebut dapat menambahkan variable dan atau method ke yang diwariskan dari parentnya
  • Subclass dapat memodifikasi satu atau lebih behavior (kelakuan) dari method yang diwariskan

Ada dua macam method di kelas:

  • Class method – yang menerima message ke kelas
  • Instance method – yang menerima message ke object

Ada dua macam variable di kelas:

  • Class variable – hanya memiliki satu copy dan termasuk kedalam class
  • Instance variable – tiap kelas punya instance variablenya sendiri

Dua macam inheritance:

  • Single inheritance – jika suatu kelas merupakan sebuah subclass dari suatu single parent class
  • Multiple inheritance – jika suatu kelas memiliki lebih dari satu parent class

Salah satu kelemahan dari inheritance adalah menciptakan ketergantungan antar kelas di hirearki inheritance. Hal ini akan mempersulit maintenance.

Dynamic Binding


Misal ada suatu base class, A, yang mendefinisikan suatu method draw yang menggambar beberapa figur berhubungan dengan base class tersebut. Class kedua, B, didefinisikan sebagai subclass dari A. Object dari class baru ini juga memerlukan method draw  yang mirip dengan punya A namun sedikit berbeda karena object subclassnya juga berbeda. Jadi, subclass tersebut override method draw yang diwariskan. Jika suatu client dari A dan B punya suatu variable yang merupakan referensi dari object class A, referensi tadi juga dapat ditunjukkan di object class B, menjadikannya sebuah referensi polymorphic.

Ketika suatu hierarki class memasukkan kelas yang meng-override method dan method tersebut dipanggil melalui variable polymorphic, maka binding (pengikatan) ke method tersebut akan menjadi dynamic. Dynamic binding ini akan membuat system software lebih mudah di perluas saat pengembangan ataupun maintenance.

Di beberapa kasus, desain dari hierarki inheritance menghasilkan satu atau lebih kelas memiliki kedudukan yang sangat jauh hingga instansiasi darinya tak masuk akal. Misal, ada program yang mendefinisikan suatu kelas  Building dan suatu collection dari subclass untuk menjelaskan tipe-tipe bangunan, contohnya, French_Gothic. Akan menjadi tak masuk akal jika kita memasukkan method draw di kelas tersebut. Namun karena semua anak kelasnya harus mengimplementasikan method tersebut, protocol (bukan badan) dari method dimasukkan ke dalam kelas Building. Method semacam itu disebut dengan abstract method. Suatu kelas yang setidaknya memiliki satu abstract method disebut dengan abstract class. Kelas tersebut biasanya tidak dapat di intansikan karena beberapa methodnya dideklrasi namun tidak didefinisikan (karena tak punya badan).

Desing Issue di OOP


Keeksklusifan object:

  • Semuanya merupakan object
    – Keuntungan – keseragaman, lebih elegan dan murni
    – Kelemahan – operasi menjadi lambat ketika berurusan dengan object sederhana
  • Menambahkan object ke suatu complete typing system
    – Keuntungan – operasi lebih cepat ketika berurusan dengan object sederhana
    – Kelemahan – menghasilkan type system yang membingungkan karena ada dua macam entitas)
  • Memasukan imperative-style typing system untuk primitive namun membuat yang lainnya object
    – Keuntungan – operasi lebih cepat pada object sederhana dan typing system relative kecil
    – Kelemahan – masih membingungkan karena adanya dua tipe system

Apakah subclass = subtype?

  • Apakah suatu parent class object merupakan-sebuah object dari subclass ?
    – Jika kelas turunan merupakan-sebuah parent class, maka object dari kelas turunan harus berprilaku sama dengan parent class objectnya
  • Kelas turunan merupakan suatu subtype jika ia memiliki hubungan merupakan-sebuah dengan parent classnya
    – Subclass hanya bisa menambahkan variable dan method dan meng-override method yang diwariskan dalam cara yang “compatible.”

Single dan Multiple Inheritence

  • Multiple Inheritance memperbolehkan suatu kelas baru untuk diwariskan dari dua kelas atau lebih.
  • Kelemahan dari multiple inheritance: Kompleksitas bertambah

Jika suatu kelas memiliki dua parent class yang tak berhubungan dan juga tidak mendefinisikan suatu nama yang didefinisikan yang lainnya, maka dapat dibilang tak ada masalah. Namun, misalkan suatu subclass bernama C diwariksan dari kelas A dan B, kelas A dan B keduanya mendefinisikan suatu method bernama display. Jika C perlu untuk mereferensikan kedua versi dari method display ini, bagaimana kah caranya? Masalah abiguitas ini semakin kompleks ketika dua parent class mendefinisikan nama method yang persis dan satu atau keduanya harus di override ke subclass.

  • Berpotensi tak efesien

Misal di C++, untuk mendukung multiple inheritance diperlukan satu akses array tambahan dan satu ekstra operasi tambahan untuk tiap pengikatan pemanggilan method secara dynamic.

  • Kelebihan dari multiple inheritance: terkadang cukup mempermudah dan berguna
  • Alternatif dari multiple inheritance adalah interface.

Allocation dan DeAllocation dari Object

  • Darimanakah object dilokasikan?
    – Jika ia berkelakuan seperti ADT, maka ia dapat dialokasikan darimana saja.
    – Artinya ia dapat dialokasikan dari run-time stack atau secara eksplisit dibuat di heap dengan suatu operator atau function , seperti new.
  • Jika ia merupakan heap dynamic, referensi dapat diseragamkan melalui suatu pointer atau variable referensi.

Desain ini menyederhanakan operasi assignment untuk object, membuatnya dapat dipakai di semua kasus hanya dengan mengubah pointer atau nilai referensi. Desain ini juga memperbolehkan referensi ke object untuk di de-referensi secara implisit, menyederhanakan akses syntax.

  • Jika object merupakan stack dynamic, maka ada masalah terkait subtype

Jika class B merupakan anak dari kelas A dan B merupakan subtype dari A, maka object dari tipe B dapat di assign ke suatu variable dari tipe A. Jika b1 merupakan sebuah variable dari tipe B dan a1 merupakan variable dari tipe A, dan mereka berdua stack dynamic, maka mereka merupakan variable nilai dan, jika B menambakan suatu data field ke apa yang diwariskan dari A, maka a1 tidak akan memiliki tempat yang cukup di stack untuk semua b1. Kelebihan ini akan mudah dijebol, yang menyebabkan programammer bingung tentang siapa yang menulis atau menggunakan code tersebut. Penjebolan ini dikenal dengan object slicing.

  • Apakah deallocation merupakan implisit, explisit, atau keduanya?
    – Jika deallocation implisit, beberapa method implisit dari penyimpanan reklamasi dibutuhkan
    – Jika deallocation explisit, maka akan memunculkan pertanyaan apakah pointer atau referensi teruntai dapat dibuat.

Dynamic dan Static Binding

  • Haruskan semua pengikatan message ke method dijadikan dynamic?
    – Jika tidak dynamic, maka akan menghilangkan keuntungan dari dynamic binding
    – Jika semuanya dynamic, maka akan tidak efisien
  • Alternatifnya adalah memperbolehkan user untuk menjelaskan apakah binding tertentu dijadikan static atau dynamic.
    – Static binding lebih cepat, maka jika dapat dilakukan secara static, kenapa memilih dynamic?

Nested Class

  • Jika suatu kelas baru diperlukan hanya oleh satu kelas, maka taka da alasan untuk mendefinisikannya sehingga dapat dilihat/digunakan oleh kelas lain
    – Di situasi ini, kelas baru dapat di nested didalam kelas yang menggunakannya
    – Di beberapa kasus, kelas baru tadi di-nested kedalam suatu subprogram, bukan secara langsung di kelas lain.

Inisialisasi dari Object

  • Apakah object harus diinisialisasi secara manual atau melalui semacam mekanisme implisit?

Ketika suatu object dari suatu subclass dibuat, apakah inisilalisasi yang bersangkutan dari anggota parent class yang diwariskan implisit atau programmer menanganinya secara eksplisit.

OOP in C++


  • Karakteristik umum:
    – Dievolusi dari C dan SIMULA 67
    Hybrid language, support procedural programming dan OOP
    – Termasuk salah satu bahasa OOP paling banyak digunakan
    Typing system campuran
    Constructor dan destructor
    – Elaborasi akses control ke entitas kelas
  • Inheritance
    – Kelas dapat berdiri-sendiri, tanpa sebuah superclass
    – Semua object harus diinisialisasi sebelum digunakan, sehinggia mengandung setidaknya satu constructor
    – Jika suatu kelas memiliki parent, anggota data yang diwariskan harus diinisialisasi ketika object subclass dibuat
  • Memiliki tiga akses control:

– Private

Dapat diakses hanya di class dan friend, melarang subclass menjadi subtype

– Public

Dapat diakses di subclass dan client

– Protected

Dapat diakses di kelas dan di subclass, namun tidak dengan client

  • Contoh inheritance di C++”

class base_class {

private:

int a;

float x;

protected:

int b;

float y;

public:

int c;

float z;

};

class subclass_1 : public base_class { … };

//     In this one, b and y are protected and

//     c and z are public

class subclass_2 : private base_class { … };

//    In this one, b, y, c, and z are private,

//    and no derived class has access to any

//    member of base_class

  • Penjelasan:

Di subclass_1, b dan y adalah protected, dan c dan z adalah public. Di subclass_2, b, y, c, dan  z adalah private. TIdak ada turunan kelas dari  subclass_2 bisa memiliki anggota dengan akses ke anggota apapun dari base_class. Anggota data a dan x di base_class tidak dapat diakses di subclass_1 maupun subclass_2.

  • Reexportation di C++

Di turunan private class, tidak ada anggota dari parent class yang secara implisit dapat diakses oleh instansi dari class yang diwariskan. Anggota yang harus dibuat visible (dapat diakses) harus di reexported di class yang diwariskan dengan cara mendeklarasikannya menggunakan operator scope resolution (::), seperti :

class subclass_3 : private base_class {

base_class :: c;

}

  • Multiple Inheritance in C++

Multiple inheritance memperbolehkan lebih dari satu class untuk dinamakan sebagai parent dari sebuah class baru. Misal, kita menginginkan sebuah class untuk menggambar yang memerlukan sifat dari class written untuk menggambar figure dan method dari kelas baru diperlukan untuk berjalan di thread yang berbeda. Maka kita dapat mendefinisikannya sebagai berikut:

class Thread { … }

class Drawing { … }

class DrawThread : public Thread, public Drawing { … }

  • Dynamic Binding in C++
    – Method dapat didefinisi menjadi virtual, yang artinya ia dapat dipanggil melalui variable polymorphic dan secara dynamic diikat ke message
    – Fungsi virtual murni sama sekali tak memiliki definisi
    – Suatu kelas yang setidaknya memiliki satu fungsi virtual murni disebut abstract class

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 12)
  • Object Oriented Programming / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 8

Programming Language Concept Session 8


  • Abstraksi merupakan suatu pandangan atau representasi dari suatu entitas yang didalamnya hanya mengandung atribut paling signifikan. Dua macam abstraksi fundamental di bahasa pemrograman kontemporer adalah abstraksi proses dan abstraksi data. Semua subprogram merupakan abstraksi proses karena ia menyediakan suatu jalan bagi suatu program untuk menjelaskan suatu proses, tanpa menyediakan detail bagaimana cara melakukan tugas tersebut.
  • Secara sintaksis, tipe data abstrak merupakan suatu penutup(enclosure) yang didalamnya hanya terdapat representasi data dari satu tipe data spesifik dan subprogram yang menyediakan operasi untuk tipe tersebut. Detail yang tidak berguna dari tipe tersebut akan disembunyikan dari unit yang berada di luar enclosure. Unit program yang menggunakan suatu tipe data abstak dapat mendeklarasi variable dari tipe tersebut, walau representasi sebenarnya disembunyikan dari mereka. Instansi dari suatu tipe data abstrak disebut objek (object).

User-Defined ADT


Berikut karakteristik dari User-Defined ADT:

  • Suatu definisi tipe yang memperbolehkan unit program untuk mendeklrasi variable dari tipe tersebut, namun menyembunyikan representasi objek dari tipe tersebut
  • Suatu kumpulan operasi untuk memanipulasi objek dari tipe tersebut

Suatu tipe data abstrak merupakan user defined data type yang memiliki kondisi berikut:

  • Representasi objek dari tipe tersebut disembunyikan dari unit progam yang menggunakan objek tadi, sehingga operasi yang mungkin terjadi hanyalah operasi yang disediakan di definisi tipe
  • Deklarasi dari tipe dan protocol dari operasi pada objek berada dalam satu unit sintaksis. Unit program lain diperbolehkan untuk membuat variable dari tipe yang didefinisikan.

Keuntungan information hiding:

  • Meningkatkan reliability
  • Mengurangi cakupan code dan banyak variable yang harus diperhatikan programmer saat menulis atau membaca bagian dari suatu program
  • Mengurangi peluang konflik nama karena scope dari variable lebih kecil

Walau define dari tipe data abstrak menjelaskan bahwa anggota data dari objek harus disembunyikan dari client, namun dalam beberapa kasus yang muncul, client membutuhkan akses anggota data tadi. Maka dari itu, solusi umum yang digunakan adalah menggunakan metode accessor, atau biasa dikenal dengan getter dan setter, yang memperbolehkan client secara tidak langsung mengakses data yang disembunyikan.

Berikut tiga alasan accessor lebih baik dari membuat data menjadi public:

  • Akses read-only dapat diberlakukan
  • Constraint (batasan) dapat dimasukkan dalam setter
  • Implementasi sebenarnya dari anggota data dapat diubah tanpa mempengaruhi client

ADT di C++


C++ menyediakan dua construct yang sangat identik satu sama lain, class dan struct. Class di C++ merupakan sebuah tipe. Unit program di C++ yang mendeklarasi suatu instansi dari suatu kelas dapat juga mengakses entitas public manapun di kelas tersebut, namun hanya melalui instansi dari kelas tadi.

Data yang di-define di kelas C++ dikenal dengan data member, sedangkan fungsi (method) yang di-define di keals disebut member function. Data member dan member function muncul dalam dua kategori, kelas dan instansi. Semua instansi dari suatu kelas berbagi satu set member function, namun tiap instansi memiliki data member kelasnya sendiri. Instansi kelas dapat berupa stack, stack dynamic, atau heap dynamic. Static atau stack dynamic direfenresikan langsung dengan nilai variable, sedangkan heap dynamic direferensikan lewat pointer.

C++ juga memperbolehkan fungsi constructor di definisi kelas, yang biasa digunakan untuk menginisialisasi data member dari objek yang baru saja dibuat. Constructor secara implisit dipanggil ketika sebuah objek dari tipe kelas tersebut dibuat. Selain constructor, kelas di C++ juga memiliki sebuah fungsi bernama destructor, yang secara implisit dipanggil ketika lifetime dari suatu instansi dari kelas berakhir. Nama dari destructor sama dengan nama kelasnya, didahului dengan sebuah tilde (~). Constructor dan destructor tidak memiliki return tipe, dan juga tidak menggunakan pernyataan return.

ADT di Java


ADT di Java hamper sama dengan C++, kecuali;

  • Semua objek dialokasi dari heap dan diakses lewat referensi variable
  • Semua tipe user-defined merupakan kelas
  • Entitas individual di kelas memiliki access control modifier (private atau public), bukan klausa
  • Java memiliki mekanisme scoping cadangan, package scope

ADT dengan Parameter


Salah satu bahasa yang mendukung ADT berparameter adalah C++. Kelas dapat menjadi generic dengan menulis fungsi constructor menjadi:

Stack(int size) {

stackPtr = new int [size];

maxLen = size – 1;

topSub = -1;

}

Deklarasi:

Stack stk(150);

Tipe elemen dari stack tersebut dapat dibuat menjadi generic dengan membuat suatu templated class. Lalu, tipe elemen tadi dapat menjadi sebuah template parameter. Berikut contohnya:

#include <iostream.h>

template <typename Type> // Type is the template parameter

class Stack {

private:

Type *stackPtr;

int maxLen;

int topSub;

public:

// A constructor for 100 element stacks

Stack() {

stackPtr = new Type [100];

maxLen = 99;

topSub = -1;

}

// A constructor for a given number of elements

Stack(int size) {

stackPtr = new Type [size];

maxLen = size – 1;

topSub = -1;

}

~Stack() {delete stackPtr;}; // A destructor

void push(Type number) {

if (topSub == maxLen)

cout << “Error in push—stack is full\n”;

else stackPtr[++ topSub] = number;

}

void pop() {

if (empty())

cout << “Error in pop—stack is empty\n”;

else topSub –;

}

Type top() {

if (empty())

cerr << “Error in top–stack is empty\n”;

else

return (stackPtr[topSub]);

}

int empty() {return (topSub == -1);}

}

Instansi dari templated kelas Stack dapat dibuat dengan deklarasi berikut:

Stack<int> myIntStack;

Encapsulation Construct


Ketika ukuran dari suatu program telah melebihi beberapa ribu baris, munculah dua tuntutan:

  • Pengorganisasian, selain hanya membaginya menjadi subprogram
  • Partial kompilasi (unit kompilasi yang lebih kecil dari program secara keseluruhan)

Solusi yang paling konkrit untuk kedua masalah diatas adalah dengan mengatur program menjadi collection code dan data yang berhubungan secara logis sehingga dapat di compile secara terpisah. Collection semacam itu disebut encapsulation.

Encapsulation di C


Di c, sebuah collection dari definisi data dan function yang berhubungan dapat diletakkan di suatu file, yang dapat di compile secara independen. Interface dari file semacam itu, berisi data, type, dan deklarasi fungsi, diletakkan di file yang berbeda yang dikenal dengan header file. Untuk memasukkan file header di aplikasi, maka digunakanlah spesifikasi preprosesor #include.

Encapsulation di C dapat menimbulkan beberapa ketidakamanan. Misal, seorang user dapat saja meng-cut dan paste definisi dari file header ke program client tanpa menggunakan spesifikasi preprosesor #include. Hal ini dapat saja bekerja, namun ada dua masalah yang akan muncul. Pertama, dokumentasi dari ketergantungan program client di library (dan file headernya) hilang. Kedua, author dapat mencoba untuk menggunakan implementasi file baru (tanpa sadar telah diubah) namun dengan file header yang lama, yang telah disalin user tersebut ke program clientnya. Misal, suatu variable x dapat didefinisikan bertipe int di file header lama, yang mana masih digunakan oleh client code, walau implementation code telah dikompilasi ulang dengan file header baru, yang mendefinisikan x menjadi float. Hal ini menyebabkan implementation code dikompilasi dengan x sebagai int tetapi client code dikompilasi dengan x sebagai float.

Encapsulation di C++


C++ menyediakan dua macam encapsulation yang berbeda, header dan file implementasi seperti di C, atau mengunakan kelas. Kelas digunakan sebagai interface (prototype) dan anggta definisi didefinisikan di file yang berbeda. Di C++, juga terdapat istilah “friends.” Fungsi friend memiliki akses ke entitas private dari kelas dimana mereka dideklarasi menjadi friends. Berikut contohnya:

class Matrix; //** A class declaration

class Vector {

friend Vector multiply(const Matrix&, const Vector&);

. . .

};

class Matrix { //** The class definition

friend Vector multiply(const Matrix&, const Vector&);

. . .

};

//** The function that uses both Matrix and Vector objects

Vector multiply(const Matrix& m1, const Vector& v1) {

. . .

}

Naming Encapsulation


C++ Namespace

C++ memiliki suatu spesifikasi, namespace, yang membantu program untuk mengelola masalah banyaknya nama global. Kita dapat meletakkan tiap library di namespacenya sendiri dan meng-qualify nama di program dengan nama dari namespace ketika nama tersebut dignakan diluar namespace. Contohnya, misalkan ada suatu ADT header file yang mengimplementasi stack. Jika terdapat keraguan bahwa file library lain mungkin mendefinisikan suatu nama yang telah digunakan  di ADT stack tersebut, file yang mendefinisikannya dapat diletakkan di namespacenya sendiri.

namespace myStackSpace {

// Stack declarations

}

Implementasi file untuk ADT stack tersebut dapat mereferensikan nama yang dideklarasi di header file dengan operator scope resolution (::), seperti di:

myStackSpace::topSub


Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 11)
  • Abstract Data Type/ Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 7

Programming Language Concept Session 7


Dasar Subprogram


  • Muncul karena penggunaan suatu kumpulan data berulang-ulang
  • Tiap subprogram memiliki satu tempat masuk
  • Program pemanggil ditangguhkan selama eksekusi dari subprogram yang dipanggil
  • Kontrol selalu kembali ke pemanggil ketika eksekusi subprogram yang dipanggil berakhir
  • Subprogram header, yang merupakan bagian pertama definisi, berfungsi dalam banyak hal:
    – Menjelaskan bahwa unit sintaktik selanjutnya merupakan definisi subprogram dari berbagai macam tertentu
    – Sebagai nama dari subprogram
    – Menjelaskan daftar parameter
    – Contoh di C:

    void adder (parameters)

  • Formal parameter merupakan parameter yang berada di subprogram header
  • Parameter yang berada di pemanggil subprogram disebut actual parameter
  • Subprogram yang mengembalikan nilai disebut function
  • Subrprogram yang tidak mengembalikan nilai disebut procedure
  • Overloaded subprogram merupakan subprogram yang memiliki nama sama dengan subprogram lain di lingkungan alamat yang sama
  • Generic subprogram merupakan subprogram yang komputasinya dapat diselesaikan di data dari tipe berbeda di panggilan yang berbeda juga
  • Closure merupakan nested subprogram dan lingkungan pengalamatannya

Local Referencing Environment


  • Variable local dapat berbentuk stack-dynamic
    – Keuntungan : mendukung recursion, penyimpanan local bisa dipakai subprogram lain
    – Kelemahan : alokasi/de-alokasi, pengalamatan tidak langsung, subprogram tidak history sensitive
  • Variable local dapat berbentuk static
    – Keuntungan dan kelemahannya bertolak belakang dengan stack-dynamic

Parameter Passing


  • Formal parameter yang dapat menerima data dari actual parameter yang tepat disebut in mode
  • Formal parameter yang dapat mengirim data ke actual parameter disebut out mode
  • Formal parameter yang dapat melakukan in dan out mode disebut inout mode
  • Model parameter passing:

  • Ketika suatu parameter passed by value (in mode), nilai dari actual parameter tersebut digunakan untuk menyatakan formal parameter yang sesuai
    – Biasanya diimplementasi dengan meng-copy
    – Dapat diimplementasikan dengan mengirim jalur akses namun tidak direkomendasi
    – Keuntungan : lebih cepat di linkage cost dan waktu akses
    – Kelemahan : memori tambahan diperlukan dan memerlukan harga yang tidak kecil (costly)
  • Ketika suatu parameter passed by result (out mode), tidak ada nilai yang dikirimkan ke subprogram, formal parameter yang sesuai bertindak sebagai local variable; nilainya dikirimkan ke actual parameter pemanggil ketika control dikembalikan ke pemanggil tersebut
    – Membutuhkan lokasi penyimpanan extra dan duplikat operasi
  • Gabungan dari pass by result dan pass by value adalah pass by value-result (inout mode)
    – Juga dikenal dengan pass by copy karena actual parameter dicopy ke formal parameter di tempat masuk subprogram dan kemudian dicopy kembali di akhir subprogram
    – Kelemahan : sama seperti pass by result dan pass by value
  • Tak seperti pass by result-value yang meng-copy nilai data kembali dan kedepan, pass by reference (inout mode) hanya mengirimkan suatu acess path, biasanya alamat, ke subprogram yang dipanggil.
    – Keuntungan : Efisien, waktu maupun tempat
    – Kelemahan : akses ke formal parameter lebih lambat, berpotensi terjadi side effect yang tak diinginkan, alias yang tak perlu
  • Ketika pass by name (inout mode), actual parameternya secara tekstual diganti untuk semua formal parameter yang tepat di semua kejadian di subprogram
    Formal parameter diikat ke suatu metode akses saat pemanggilan, namun pengikatan sebenarnya ke suatu nilai atau alamat terjadi diwaktu assignment atau reference
    – Kelemahan : terlalu kompleks sehingga mengurangi readability dan reliability, sulit diimplementasikan dan tidak efesien
  • Implementasi metode parameter-passing:
    – Kebanyakan bahasa, komunikasi parameter terjadi di run-time stack
    Pass by reference merupakan yang paling sederhana untuk diimplementasikan karena hanya alamat yang diletakkan di stack

Function header:  void sub(int a, int b, int c, int d)

Function call in main: sub(w, x, y, z)

(pass w by value, x by result, y by value-result, z by reference)

  • Yang perlu diperhatikan dalam parameter passing:
    – Efesiensi, data transfer one-way atau two way
    – Namun keduanya saling bertolak belakang, programming yang baik menganjurkan pembatasan akses ke variable yang artinya one-way lebih baik, namun pass by reference lebih efesien untuk melemparkan struktur size yang signifikan
  • Terkadang lebih mudah untuk melemparkan nama subprogram sebagai parameter
    Shallow binding : lingkungan pernyataan pemanggil yang menetapkan subprogram yang dilempar (paling natural untuk bahasa dynamic-scoped)
    Deep binding : lingkungan define dari subprogram yang dilemparkan (paling natural untuk bahasa static scoped)
    Ad hoc binding : lingkungan pernyataan pemanggil yang melemparkan subprogram
  • Biasanya ketika ada beberapa subprogram yang mungkin dipanggil dan tidak diketahui yang mana hingga eksekusi, maka di bahasa C dan C++ pemanggilannya menggunakan function pointer
    – Di C#, metode pointer diimplementasikan sebagai objek yang dikenal delegate
    – Contoh:

Declaration:

public delegate int Change(int x);

Method:

static int fun1(int x) { … }

Instantiate:
Change chgfun1 = new Change(fun1);

Dapat dipanggil dengan:

chgfun1(12);

  • Delegate yang dapat menyimpang lebih dari satu alamat disebut multicast delegate

Overloaded, Generic, dan User-Defined Overloaded Subprogram


  • Overloaded subprogram merupakan subprogram yang memiliki nama yang sama dengan subprogram lain di lingkungan pengalamatan yang sama juga
  • Di c++, Java, C#, dan Ada terdapat predefined overloaded subprogram
  • Di Ada, return type dari overloaded function dapat digunakan untuk menghilangkan pemanggilan ambigu
  • Ada, Java, C++, C# memperbolehkan user menulis banyak versi subprogram dengan nama yang sama
  • Generic atau polymorphic subprogram mengambil parameter berbeda tipe di berbagai aktivasi
  • Overloaded subprogram menyediakan ad hoc polymorphism
  • Subtype polymorphism berarti suatu variable dari tipe T dapat mengakses objek apapun dari tipe T atau tipe apapun yang diturunkan dari T
  • Operator dapat di-overloaded di Ada, C++, Python, dan Ruby
    – Contoh di Python:

def __add__ (self, second) :

  return Complex(self.real + second.real,

self.imag + second.imag)

Closure


  • Closure merupakan subprogram dan lingkungan pengalamatan dimana ia didefinisikan
  • Lingkungan pengalamatan dibutuhkan jika subprogram dapat dipanggil dari tempat manapun di program tersebut
  • Bahasa ber-static scope yang tidak memperbolehkan nested subprogram tidak memerlukan closure
  • Closure hanya dibutkan jika suatu subprogram dapat mengakses variable di nesting scope dan ia dapat dipanggil darimanapun
  • Untuk mendukung closure, implementasi mungkin dibutuhkan untuk menyediakan jangkauan tak terbatas ke beberapa variable karena suatu subprogram mungkin mengakses variable nonlocal yang biasanya tak lagi ada (no longer alive)

Coroutine


  • Coroutine merupakan subprogram yang memiliki banyak tempat masuk (entry) dan mengontrolnya sendiri, didukung secara langsung di Lua
  • Juga dikenal dengan symmetric control karena coroutine pemanggil dan yang dipanggil berbasis sama
  • Panggilan (call) coroutine disebut resume
  • Resume pertama dari coroutine merupakan ke permulaanya, namun pemanggilan selanjutnya masuk melalui tittik hanya setelah pernyataan yang sebelumnya dieksekusi di coroutine
  • Coroutine secara berulang-ulang berlanjut satu sama lain, berkemungkinan selamanya
  • Control eksekusi yang mungkin:

  • Control eksekusi dengan loop yang mungkin:


Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 9)
  • Subprograms / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 6

Programming Language Concept Session 6


  • Control structure merupakan suatu pernyataan mengontrol (control statement) dan pernyataan yang eksekusinya dikendalikan

Selection Statement


  • Selection statement menyediakan cara untuk memilih antara dua atau lebih jalan eksekusi
  • Dua kategori umum:
    Two-way selector
    – Multiple-way selector

Two-way selection statement


  • Bentuk umum

if control_expression

then clause

else clause

  • Control Expression
    – Jika reserved word then atau penanda sintaktik lain tidak digunakan untuk memperkenalkan klausa then, maka control expression diletakkan didalam kurung (parentheses)
    – Di C89, C99, Python, dan C++, control expression dapat berupa aritmatika
    – Di kebanyakan bahasa lain, control expression harus berupa Boolean
  • Bentuk klausa
    – Di banyak bahasa kontemporer, klausa then dan else dapat berupa satu pernyataan atau compound statement
    – Di Perl, semua klausa harus dibatasi dengan kurung kotak (brace), artinya harus berupa compound
    – Di Fortran 95, Ada, Python, dan Ruby, klausanya berupa rentetan pernyataan
  • Nesting Selector
    – Disebut nesting karena ada selector didalam selector
    – Contoh:if (sum == 0)if (count == 0)result = 0;else result = 1;- Contoh diatas dapat dikatan ambigu karena klausa else bergantung pada aturan semantic dari bahasa tersebut. Misal di Java, else diatas akan dipasangkan dengan if sebelumnya yang paling dekat
    – Untuk solusi nested selector yang ambigu, di bahasa C, C++, dan C# menggunakan compound statement, seperti:

if (sum == 0) {

if (count == 0)

result = 0;

}

else result = 1;

Multiple-Way Selection Statement


  • Multiple-selection memperbolehkan satu selection dengan pernyataan berapapun
  • Beberapa bahasa dapat menggunakan switch-case, contoh di C, C++, Java:

    switch (index) {

    case 1:

    case 3: odd += 1;

    sumodd += index;

    break;

    case 2:

    case 4: even += 1;

    sumeven += index;

    break;

    default: printf(“Error in switch, index = %d\n”, index);

    }

    Control expression hanya dapat bertipe integer

    – Segmen yang dapat dipilih dapat berupa rentetan pernyataan, block, atau compound statement

    – Segmen angka berapapun dapat dieksekusi di satu eksekusi construct

    – Klausa default digunakan untuk nilai yang tidak disajikan

  • Berbeda dengan C, di C#:
    – Tidak memperbolehkan eksekusi implisit lebih dari satu segmen
    – Tiap segmen harus diakhiri dengan unconditional branch (goto atau break)
    Control expression dan case constant dapat berupa string
  • Multiple selector dapat muncul sebagai ekstensi langsung dari two-way selector, menggunakan klausa else-if, contoh di Python:

if count < 10 :

bag1 = True

elif count < 100 :

bag2 = True

elif count < 1000 :

bag3 = True

Iterative Statement


  • Iterative statement merupakan pernyataan yang menyebabkan suatu pernyataan atau kumpulan pernyataan dieksekusi nol, satum atau lebih kali
  • Iterative statement juga dikenal sebagai loop
  • Ada dua macam iterative statement, counter-controlled loop dan logically controlled loop
  • Counting iterative statement (seperti for) memiliki suatu variable loop, dan suatu alat untuk menjelaskan nilai awal (initial) dan terminal, dan stepsize
  • Contoh counter controller loop di Ada:

Count : Float := 1.35;

for Count in 1..10 loop

Sum := Sum + Count;

end loop;

  • Counter controlled loop di bahasa berbasis C:
    – Bentuk umum:
    for ([expr_1] ; [expr_2] ; [expr_3]) statement
    – Nilai dari suatu ekspresi multiple-statement merupakan nilai dari pernyataan terakhir di ekspresi tersebut
    – Jika ekspresi kedua tidak ada, maka akan terjadi infinite loop
    – C++ berbeda dengan C dalam dua hal, control expression dapat berupa Boolean, ekspresi awal dapat memasukkan definisi variable
    Control expression di Java dan C# harus berupa Boolean
  • Logically controlled loop didasarkan dari ekspresi Boolean, bukan suatu penambahan (counter)
  • C dan C++ memiliki bentuk pretest (di cek dulu) dan posttest(jalankan baru dicek), sehingga control expressionnya dapat berupa aritmatika:

Pretest:

while (control_expression)

loop body

Postest:

do

loop body

while (control_expression);

  • Java mirip dengan C dan C++, namun control expressionnya harus berupa Boolean
  • Terkadang lebih mudah ketika programmer dapat memilih lokasi untuk loop control, mekanisme ini dinamakan user-located loop control (misal break), contoh:

while (sum < 1000) {

getnext(value);

if (value < 0) break;

sum += value;

}


Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 8)
  • Control Structure Statement / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 5

Programming Language Concept Session 5


  • Expression merupakan cara mendasar untuk menentukan komputasi di bahasa pemrograman
  • Untuk mengerti evaluasi expression, haruslah akrab dengan urutan operator dan evaluasi operand
  • Esensi dari imperative language adalah peran pernyataan assignment yang dominan

Arithmetic Expression


  • Arithmetic expression berisi operator, operand, parentheses, dan function call
  • Operator yang memiliki satu operand disebut unary
  • Operator dengan dua operand disebut binary
  • Operator yang memiliki tiga operand disebut ternary
  • Tingkat precedence
    – Kurung (parentheses)
    – Unary operator
    – **
    – *,/
    – +,-
  • Associativity rule menjelaskan urutan operator dengan level precedence yang sama
  • Precedence dan associativity dapat di overridden dengan parentheses
  • Pernyataan if-then-else dapat digunakan untuk melakukan conditional expression assignment, contoh:

if (count == 0)

average = 0;

else

average = sum / count;

atau dalam bahasa berbasis C bisa menggunakan

average = (count == 0) ? 0 : sum / count;

  • Urutan evaluasi operand:
    – Variable: mengambil nilai dari memori
    – Constant: terkadang diambil dari memori; terkadang constant tersebut di instruksi bahasa mesin
    – Parenthesized expression: evaluasi semua operand dan operator terlebih dahulu
    – Jika operand dan operator keduanya tak memiliki side effect (terjadi ketika function merubah salah satu parameternya atau suatu variable global), maka urutan evaluasi operand ini tak relevan

Fuctional Side Effect


  • Functional side effect merupakan kejadian ketika suatu fungsi mengganti parameter dua-arah atau non-local variable
  • Masalah terkait fuctional side effect:
    – Ketika suatu function direferensikan di suatu expression mengubah operand lain di expression tersebut, contoh:

int a = 5;

int fun1() {

a = 17;

return 3;

} /* end of fun1 */

void main() {

a = a + fun1();

} /* end of main */

  • Dua solusi yang mungkin:
    – Menulis definisi bahasa untuk melarang functional side effect

    1. Tidak ada parameter dua-arah di function
    2. Tidak ada alamat non-local di function
    3. Keuntungan: bekerja
    4. Kelemahan: ketidakfleksibelan parameter satu-arah dan kekurangan alamat non-local

    – Menulis definisi bahasa untuk meminta urutan evaluasi order diperbaiki

    1. Kelemahan: membatasi beberapa optimisasi compiler
    2. Java memerlukan operand dievaluasi dengan urutan kiri ke kanan

Overloaded Operator


  • Penggunaan sebuah operator untuk lebih dari satu maksud dikenal dengan operator overloading
  • Beberapanya umum, seperti operator penambahan (+)
  • Beberapa lainnya berpotensi menimbulkan masalah, seperti operator * di C dan C++
    – Menghilangkan pendeteksi compiler error
    – Kehilangan beberapa readability
  • Beberapa bahasa seperti C++, C#, dan F# memperbolehkan user-defined overloaded operator
    – Ketika digunakan dengan bijak, operator semacam itu dapat membantu readability (menghindari method call, expression muncul natural)
    – Dapat memunculkan masalah seperti, user dapat mendefinisikan operation yang tak masuk akal; readability bisa berkurang, bahkan ketika operator tersebut masuk akal

Type Conversion


  • Narrowing conversion merupakan conversion yang meng-konversi suatu objek ke tipe yang tak dapat memasukkan seluruh nilai dari tipe originalnya, misal float menjadi int
  • Widening conversion merupakan conversion yang objeknya dikonversi ke suatu tipe yang dapat memasukkan setidaknya perkiraan semua nilai dari tipe originalnya seperti int menjadi float
  • Mixed-mode expression merupakan expression yang operatornya dapat memiliki operand dari tipe yang berbeda
  • Coercion merupakan tipe conversion implisit
    – Kelemahan: mengurangi kemampuan pendeteksi error compiler
  • Di kebanyakan bahasa, semua numeric type dipaksa (coerced) di expression, menggunakan widening conversion
  • Explicit type conversion dikenal casting di bahasa berbasis C
    – C: (int)angle
    – F#: (float)sum

Error di Expression


  • Klausa
    – Batasan inheren dari aritmatika (seperti pembagian ke nol)
    – Batasan aritmatika komputer (seperti overflow)
  • Terkadang diacuhkan oleh system run-time

Relational Expression


  • Relational operator merupakan operator yang membandingkan nilainya dengan kedua operandnya
  • Nilai dari relation operator adalah Boolean, kecuali ketika Boolean tidak didukung dibahasa tersebut
  • JavaScript dan PHP memiliki dua operator relational tambahan, === dan !==, mirip dengan saudaranya, == dan !=, namun menghindari operandnya dipaksakan (coerced), contoh:

“7” == 7

Bernilai true, sedangkan

“7” === 7

Bernilai false

Boolean Expression


  • Boolean operator hanya mengambil Boolean operand dan menghasilkan nilai Boolean
  • C89 tidak memiliki tipe Boolean, sehingga ia menggunakan tipe integer dengan 0 sebagai false dan nonzero sebagai true
  • Tingkat precedence:

postfix ++, —

unary +, -, prefix ++, –, !

*, /, %

binary +, –

<, >, <=, >=

=, !=

&&

|| -> lowest

Short Circuit Evaluation


  • Short circuit evaluation merupakan evaluasi yang mana hasilnya dapat ditentukan tanpa mengevaluasi semua operand dan atau operator, misal:

(13 * a) * (b / 13 – 1)

Jika salah satu (13 * a atau b / 13 – 1) menghasilkan nilai nol, maka hasil dari ekspresi tersebut bisa diketahui merupakan nol

  • Short circuit evaluation di beberapa bahasa:
    – C, C++, dan Java : menggunakan short-circuit evaluation untuk operator Boolean biasa (&& dan ||), namun juga menyediakan operator Boolean bitwise yang tidak short circuit (& dan |)
    – Semua operator logika di Ruby, Perl, ML, F#, dan Python dievaluasi secara short-circuit
    – Ada : programmer dapat memilih
    – Short circuit evaluation menampilkan masalah side effect yang mungkin muncul di expression, seperti

(a > b) || (b++ / 3)

Assignment Statement


  • Syntax umum

<target_var> <assign_operator> <expression>

  • Operator assignment:
    – = Fortran, Basic, bahasa berbasis C
    – := Ada
  • = dapat berbahaya ketika di-overload untuk operator relational sebagai equality, sehingga bahasa berbasis C menggunakan == sebagai operator relational
  • Compound assignment operator merupakan metode cepat menjelaskan bentuk umum yang diperlukan assignment, misal:

sum = sum + value;

ekuivalen dengan

sum += value;

  • Unary assignment operator di bahasa berbasis C menggabungkan operasi increment dan decrement dengan assignment, contoh:

sum = ++count (count ditambah, lalu di-assign ke sum)

sum = count++ (count di-assign ke sum, lalu ditambahkan)

count++ (count ditambahkan)

count++ (count ditambahkan lalu di negasikan)

  • Di bahasa berbasis C, Perl, dan JavaScript, pernyataan assignment menghasilkan suatu hasil dan dapat digunakan sebagai operand, contoh:

while ((ch = getchar())!= EOF){…}

        ch = getchar()

  • Perl, Ruby, dan Lua memperbolehkan multiple-target multiple-source assignment, seperti:

($first, $second, $third) = (20, 30, 40);

  • Identifier di bahasa fungsional hanya nama nilai, karena itu nilainya tak pernah berubah, misal di bahasa ML:
    Name diikat ke nilai dengan val

    val fruit = apples + oranges;

    – Jika ada val lain untuk fruit, itu merupakan name baru dan berbeda

  • Pernyataan assignment juga dapat mixed-mode
    – Di Fortran, C, Perl, dan C++, semua numeric type value dapat di-assign ke numeric type variable apapun
    – Di java dan C#, hanya ketika coercionnya widening
    – Tak ada mixed-mode assignment di bahasa fungsional

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 7)
  • Expression and Assignment Statement / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *

Programming Language Concept Session 4

Programming Language Concept Session 4


  • Data type menjelaskan suatu collection nilai data dan suatu set predefined operation pada nilai tersebut
  • Descriptor merupakan collection atribut dari suatu variable
  • Suatu object mewakili suatu instansi dari tipe user-defined (abstract type)

Primitive Data Type


  • Primitive data type merupakan tipe data yang tak didefinisikan dalam hal tipe data lain
  • Hampir semua bahasa pemrograman menyediakan suatu set primitive data type
  • Beberapa primitive data type hanyalah cerminan dari hardware
  • Yang lainnya hanya memerlukan sedikit dukungan non-hardware untuk implementasinya
  • Primitive Data Type:
    – Integer
    – Floating Point
    – Complex
    – Decimal
    – Boolean
    – Character

Character String Type


  • Character string type merupakan tipe data yang berisi rentetan atau kumpulan karakter
  • Operasi pada character string type:
    Assignment dan copying
    – Pembandingan (Comparison)
    – Catenation
    – Substring reference
    – Pattern matching
  • Panjang string dapat dijadikan static dan ditetapkan ketika string dibuat, dikenal dengan static length string (COBOL, kelas string di Java)
  • Memperbolehkan string memiliki panjang yang berbeda dengan maksimum sampai yang dideklarasikan dikenal dengan dynamic length string (C, C++)
  • Memperbolehkan string memiliki panjang yang berbeda dan tidak memiliki batas maksimum, dikenal dengan dynamic length string (Javascript, Perl, dll)
  • Implementasi character string:
    Static length : compile-time descriptor
    Limitied dynamic length : mungkin memerlukan run-time descriptor untuk panjang (namun tidak di C dan C++)
    Dynamic length : memerlukan run-time descriptor; alokasi/de-alokasi merupakan masalah implementasi terbesar

User-Defined Ordinal Type


  • Ordinal type merupakan tipe yang kemungkinan rentang nilainya dapat dengan mudah dihubungkan dengan suatu set integer positif
  • Contoh primitive ordinal type di Java
    – Integer
    – Char
    – Boolean

Enumaration Type


  • Enumaration type merupakan tipe yang semua kemungkinan nilainya, yang dinamakan konstan, disediakan, atau dienumerasi, di definisi
  • Contoh di C#

enum days {Mon, Tue, Wed, Thu, Fri, Sat, Sun};

  • Membantu readability, karena tidak perlu meng-code suatu warna sebagai angka
  • Membantu reliability, compiler dapat memeriksa:
    – Operasi
    – Tidak ada variable enumeration yang dapat di-assign ke suatu nilai diluar rentang yang telah ditetapkan

Subrange Type


  • Subrange Type merupakan urutan rentetan kelanjutan berdampingan dari ordinal type
  • Membantu readability, memperjelas pada pembaca bahwa variable dari subrange hanya dapat menyimpan rentang nilai tertentu
  • Reliability, menugaskan (assigning) suatu nilai ke variable subrange yang berada diluar rentang yang telah ditentukan akan dideteksi sebagai error
  • Contoh di Ada:

type Days is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

subtype Weekdays is Days range Mon..Fri;

subtype Index is Integer range 1..100;

Day1 : Days;

Day2 : Weekdays;

. . .

Day2 := Day1;

Implementasi User-Defined Ordinal Type


  • Enumeration type diimplementasikan sebagai integer
  • Subrange type diimplementasikan seperti parent type dengan memasukkan code (oleh compiler) untuk membatasi assignment ke variable subrange

Array Type


  • Array merupakan agregat homogen elemen data yang mana tiap elemen individunya diidentifikasi dengan posisinya di agregat tersebut, dengan patokan elemen pertama
  • Indexing (atau subscripting) merupakan suatu pemetaan dari index ke elemen

array_name (index_value_list) -> an element

  • Beberapa bahasa seperti Fortran dan Ada menggunakan kurung (parentheses) sebagai syntax, sedangkan kebanyakan bahasa lainnya menggunakan kurung kotak (bracket)
  • Tipe index array:
    – FORTRAN, C : hanya integer
    – Ada : integer atau enumeration (termasuk Boolean dan char)
    – Java : hanya integer
  • Pengecekan rentang index:
    – C, C++, Perl, dan Fortran tidak menjelaskan pemeriksaan rentang index
    – Java, ML, C# menjelaskan pengecekan rentang index
    – Di Ada, defaultnya membutuhkan pemeriksaan, namun dapat dinon-aktifkan

Subscripting Binding


  • Static, rentang subscript terikat secara static dan alokasi penyimpanan juga static (sebelum run time), contoh C dan C++
  • Fixed stack-dynamic, rentang subscript terikat secara static, namun alokasi penyimpanan dilakukan saat elaborasi deklarasi selama eksekusi, contoh C#
  • Stack-dynamic, rentang subscript maupun alokasi penyimpanan diikat secara dynamic pada waktu elaborasi, contoh C dan C++
  • Fixed heap-dynamic, sama seperti fixed stack-dynamic yang rentang subscript dan pengikatan penyimpanannya ditentukan setelah penyimpanan dialokasikan, namun bedanya keduanya selesai ketika user program meminta mereka saat eksekusi, contoh C dan C++
  • Heap-dynamic, pengikatan rentang subscript dan alokasi penyimpanan secara dynamic dan dapat berubah-ubah selama lifetime array, contoh Perl, JavaScript, dll

Array Homogen dan Heterogen


  • Array heterogen merupakan array yang elemennya boleh berbeda tipe
  • Array yang elemennya hanya berisi satu tipe disebut array homogen
  • Array heterogen didukung oleh bahasa Perl, Python, JavaScript, dan Ruby

Slice


  • Slice merupakan beberapa substructure dari suatu array, tak lebih dari sebuah mekanisme pengalamatan
  • Slice hanya berguna di bahasa yang memiliki operasi array
  • Contoh di Python:

vector = [2, 4, 6, 8, 10, 12, 14, 16]

mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

vector (3:6) is a three-element array

mat[0][0:2] is the first and second element of the first row of mat

Implementasi Array


  • Fungsi akses array satu dimensi:

address(list[k]) = address (list[lower_bound]) + ((k-lower_bound) * element_size)

  • Fungsi akses array berdimensi banyak:

Location (a[I,j]) = address of a [row_lb,col_lb] + (((I – row_lb) * n) + (j – col_lb)) * element_size

  • Ada dua cara umum mengkases array berdimensi banyak:
    – Row major order, diurutkan berdasarkan baris dan kebanyakan bahasa menggunakan cara ini
    – Coloumn major order, diurutkan berdasarkan kolom, digunakan di Fortran
  • Compile-Time Descriptor:
    – Array satu dimensi:

    – Array berdimensi banyak:

Associative Array


  • Associative array merupakan kumpulan elemen data tidak berurutan yang di-index oleh nilai angka setara yang dikenal dengan key
  • Used-defined key harus disimpan
  • Merupakan built-in type di Perl, Python, Ruby, dan Lua (didukung dengan tabel)

Record Type


  • Record merupakan kemungkinan agregat heterogen elemen data yang elemen individualnya diidentifikasi dengan nama
  • Pengalamatan ke individual record field dapat dengan menamakan field dan penutup record yang dinginkan
    COBOL:

MIDDLE OF EMPLOYEE-NAME OF EMPLOYEE-RECORD

  • Cara lain dapat dengan menggunakan dot notation
    Ada:

Employee_Record.Employee_Name.Middle

  • Array digunakan ketika nilai data memiliki tipe yang sama atau diproses dengan cara yang sama, sedangkan record digunakan ketika nilai data heterogen dan diproses dengan cara berbeda
  • Implementasi record type:

Tuple Type


  • Tuple merupakan tipe data yang mirip dengan record, namun bedanya elemen di tuple tidak dinamakan
  • Tuple digunakan di Python, ML, dan F# untuk memperbolehkan function mengembalikan banyak nilai
  • Contoh di Python:

myTuple = (3, 5.8, ′apple′)

Alamat dengan subscript (mulai dari 1)

Catenation dengan + dan dihapus dengan del

List Type


  • Pertama kali didukung di LISP sebagai bahasa pemrograman fungsional pertama
  • List di LISP dibatasi dengan kurung dan tidak menggunakan koma, seperti

(A B C D)  atau (A (B C) D)

  • Untuk membedakan antara list dan data, maka digunakan apostrophe (‘), seperti:

′(A B C)

Union Type


  • Union merupakan tipe yang variablenya diperbolehkan untuk menyimpan tipe nilai berbeda di waktu yang berbeda selama eksekusi
  • Implementasi union:

type Node (Tag : Boolean) is

record

    case Tag is

when True => Count : Integer;

when False => Sum : Float;

end case;

end record;

Pointer Type


  • Pointer type variable merupakan variable yang nilainya berisi alamat memori dan nilai spesial, nil
  • Menyediakan kemampuan untuk akses alamat secara tak langsung
  • Menyediakan cara untuk mengatur memori secara dynamic
  • Ada dua operasi fundamental pointer, yaitu assignment dan deferencing
  • Assignment digunakan untuk menetapkan nilai variable pointer ke alamat yang diinginkan
  • Deferencing menghasilkan nilai yang disimpan di lokasi yang diwakilkan dengan nilai pointer
  • Deferencing dapat explisit atau implisit (Eksplisit di C++ menggunakan *)
  • Ada dua macam masalah dengan pointer:
    Dangling pointer, suatu pointer menunjuk ke variable heap-dynamic yang telah di de-alokasi
    Lost heap-dynamic variable, suatu variable heap-dynamic yang telah dialokasi yang tak dapat di akses lagi ke user program (biasa dikenal garbage)
  • Contoh di C dan C++:

float stuff[100];

float *p;

p = stuff;

*(p+5) is equivalent to stuff[5] and  p[5]

*(p+i) is equivalent to stuff[i] and  p[i]

Reference Type


  • Reference type mirip dengan pointer, namun reference menunjuk ke suatu objek atau suatu nilai di memori
  • Dijelaskan di definisi dengan memulai suatu nama menggunakan ampersand (&)
  • Contoh:

int result = 0;

int &ref_result = result;

. . .

ref_result = 100;

Type Checking


  • Type checking merupakan aktivitas untuk meyakinkan bahwa operand dari suatu operator memiliki tipe yang sesuai
  • Type error merupakan aplikasi dari suatu operator ke operand dari tipe yang tak sesuai
  • Jika semua tipe binding adalah static, maka hampir semua type checking dapat static
  • Jika type binding dynamic, maka type checking harus dynamic

Strong Typing


  • Suatu bahasa programan disebut strong typed jika type error selalu dideteksi
  • Kelebihan : dapat mendeteksi kesalahan penggunaan variable
  • Beberapa contoh bahasa:
    – C dan C++ tidak, karena pengecekan tipe parameter dapat dihindari
    – Ada, Java, C# hampir

Sumber:

  • Concept of Programming Languages 10th. Ed  / Robert W. Sebesta (Chapter 6)
  • Data Types / Binus Powerpoint Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *