Konsep Nilai, Domain, dan Type
Suatu
nilai (value) adalah hal apapun yang mungkin dapat dievaluasi, disimpan
dalam suatu struktur data, dikirimkan sebagai suatu argumentasi atau
dikembalikan lagi sebagai hasil.
Suatu
perhitungan adalah suatu urutan operasi yang diberlakukan untuk
menghasilkan suatu nilai. Dengan demikian nilai-nilai dan operasi adalah
dasar perhitungan.
Dalam matematika, kumpulan dari argumen-argumen dan hasil-hasil dari fungsi dikenal dengan domain dan co-domain.
Domain akan ditandai sebagai kumpulan dari nilai-nilai yang dikirimkan
sebagai argumen-argumen atau dikembalikan sebagai hasil.
Nilai-nilai
kebenaran, karakter, integer, real, file, pointers, record, set,
prosedur dan abstrak fungsi, lingkungan, perintah dan definisi tidak
lain bagian dari bahasa pemrograman.
Suatu domain adalah satu kumpulan elemen-elemen dan digabungkan dengan sekumpulan operasi.
Kategori Domain
Dua kategori domain, yaitu :
a. Primitive Domain
Sifatnya atomic
b. Compound Domain
Kumpulan dari nilai-nilai yang dibangun dari domain-domain pembangun satu atau domain pembangun yang lain.
Teori Elemen-Elemen Domain
Ada
beberapa compound domain yang digunakan dalam computer sign, yaitu:
array, tupple, record, union, set, list, tree, file, relation,
definition dan mapping.
Compound domain dibangun oleh suatu domain pembangun. Suatu domain pembangun adalah :
a. Product domain
b. Sum domain
c.Function domain
d. Power domain
e. Recursive domain
Product Domain
Domain-domain
yang dibangun oleh pembangun product domain disebut tuples dalam ML,
record dalam Cobol, Pascal dan ADA, struktur dalam C dan C++. Bentuk
product domain adalah dasar dari database relational dan pemrograman
logic.
Pada kasus biner, product domain pembangun, x, membangun domain A x B dari domain A dan B.
Jika a adalah elemen dari A dan b adalah suatu elemen dari B maka (a,b) adalah suatu elemen dari A x B.
A X B = {(a,b)| a in A, b in B}
Product Domain : D0 x … x Dn
Assembly operation: (a0,…,an) in D0 x…x Dn where ai in Di and
D0 x…x Dn = {(a0,…an) | ai in Di}
Disassembly operation: (a0,…,an) | i = ai for 0 <= i <= n
Domain produk disebut “Cartesian” atau “Cross” produk. Dalam Pascal disebut record, sedangkan dalam C disebut suatu struktur.
Sum Domain
Domain-domain
yang dibangun oleh pembangun sum domain disebut varian record dalam
Pascal dan ADA, Unions dalam Algol-68, Constructor dalam ML.
Dalam kasus biner, sum domain pembangun,+, membangun domain A + B dari domain A dan B.
Jika a adalah elemen dari A dan b adalah elemen dari B maka (A,a) dan (B,b) adalah unsur-unsur A + B
A + B = {(A,a) | a in A} union {(B,b) | b in B}
Dimana A dan B disebut tags dan digunakan untuk membedakan pendukung elemen A dan pendukung elemen B.
Sum
domain disebut juga disjoint union atau co-product domain. Didalam
Pascal disebut record varian dan dalam C disebut suatu struktur.
Sum domain : D0 +…+ Dn
Assembly operations: (Di, di) in D0 +…+ Dn and D0 +…+ Dn = unioni = 0 n {(Di,d) | d in Di}
Disassembly operations: Di(Di,di) = di
Function Domain
Domain-domain
yang dibangun oleh pembangun function domain disebut fungsi di dalam
Haskell, prosedur di dalam Modula-3 dan proses dalam SR.
Pembangun function domain membentuk domain A Ã B dari domain A dan B. domain A Ã B terdiri dari semua fungsi A ke B. A disebut domain dan B disebut co-domain.
(lamda x.e) adalah suatu elemen di A Ã B
dimana e adalah suatu ungkapan yang berisi kejadian dari suatu
identifier x, dimana a adalah nilai A merubah kejadian x di dalam e,
nilai e[a:x] menghasilkan B.
Function Domain : A Ã B
Assembly operation: (lamda x.E) in A Ã B where for all a in A, E[x:a] is a unique value in B
Disassembly operation: (g a) in B, for g in A Ã b and a in A
Power Domain
Teori
set yang menyediakan suatu notasi untuk uraian perhitungan. setL adalah
suatu bahasa pemrograman yang didasarkan pada kumpulan (set) dan
digunakan untuk menyediakan compiler ADA. Pascal menyediakan operasi set
union dan intersection.
Kumpulan dari semua subset dari set adalah power set digambarkan sebagai berikut:
PS = { s | s is a subset of S}
Subtypes dan subranges adalah contoh dari pembangun power set.
Beberapa
bahasa menyediakan mekanisme untuk dekomposisi suatu jenis ke dalam
subtypes. Enumerasi adalah elemen dari subtype yang lainnya adalah
subranges.
Power
domain membangun suatu domain dari elemen-elemen set. Untuk domain A,
pembangun power domain P() menciptakan domain P(A), suatu kumpulan yang
anggotanya adalah subset dari A.
Power Domain : PD
Assembly operations: ø in PD, {a} in PD for a in D, and Si union Sj in PD for Si, Sj in PD
Recursively Defined Domain
Recursively defined domain adalah domain yang didefinisikan dari bentuk
D : … D …
Definisi
disebut Recursively sebab nama domain “recurs” pada sisi kanan dari
definisi. Recursively defined domain tergantung pada abstrak karena nama
domain adalah suatu bagian penting dari definisi domain.
Lebih
dari satu set boleh mencukupi suatu recursively defined. Bagaimanapun,
mungkin saja ditunjukkan bahwa suatu recursively defined selalu
mempunyai solusi terkecil. Solusi terkecil adalah suatu subset solusi
yang lain.
Limit Construction
D0 = null
Di+1 = e[D:Di] for i = 0,…
D = limi à infty Di
Type System
Presentase
besar kesalahan di dalam program adalah dalam kaitan dengan operasi ke
object jenis yang bertentangan. Type system telah dikembangkan untuk
membantu programmer dalam pendeteksian kesalahan.
Suatu
type system adalah satu set aturan untuk mendefinisikan jenis dan
menghubungkan suatu type dengan ekspresi dalam bahasa. Suatu type system
menolak suatu ekspresi jika tidak menghubungkan suatu type dengan
ekspresi. Type checking boleh berjalan pada waktu kompilasi atau waktu
berjalan atau kedua-duanya.
Jika kesalahan diharapkan untuk dideteksi pada waktu kompilasi maka suatu static type checking system diperlukan. Satu pendekatan ke static type checking memerlukan programmer untuk menetapkan type masing-masing obyek di dalam program.
Ini
mengizinkan compiler untuk melaksanakan type checking sebelum
pelaksanaan program dan ini adalah pendekatan yang diambil oleh bahasa
seperti Pascal, ADA, C++ dan Java.
Jika pendeteksian kesalahan diharapkan untuk ditunda sampai waktu pelaksanaan, maka dinamic type checking diperlukan.
Di
dalam dinamic type checking, masing-masing nilai data berlabel dengan
type informasi sehingga lingkungan waktu berjalan dapat memeriksa
kecocokan type dan mungkin melaksanakan konversi type jika diperlukan. Bahasa program Lisp, Scheme dan Small-Talk adalah contoh dari bahasa dynamic type.
Type Checking
Suatu bahasa disebut :
· Untyped jika tidak ada type abstrak yang berlaku
· Strong type jika menyelenggarakan type abstrak (operasi mungkin diterapkan hanya untuk type object yang sesuai)
· Type static jika type ekspresi masing-masing dapat ditentukan dari teks program
· Type dynamic jika penentuan type beberapa ekspresi tergantung pada perilaku waktu berjalan program.
Keuntungan
dari bahasa Untyped adalah fleksibilitas mereka. Programmer mempunyai
kendali penuh atas bagaimana suatu nilai data digunakan tetapi harus
mengasumsikan tanggung jawab penuh untuk mendeteksi aplikasi operasi ke
type object yang tidak cocok/bertentangan.
Strong
type membantu untuk memastikan portabilitas dan keamanan kode dan
sering memerlukan programmer dengan tegas menggambarkan type
masing-masing object di dalam suatu program. Ini penting juga dalam kumpulan untuk pemilihan operasi yang sesuai dan untuk optimisasi.
Static
Type secara luas dikenal sebagai kebutuhan untuk produksi software yang
dapat dipercaya dan aman. Type static dipilih ketika efisiensi di dalam
waktu pelaksanaan adalah penting dan kompilator pendukung digunakan
untuk mendukung rancang bangun software berjalan.
Dynamic
type checking menyiratkan bahwa type dicek pada waktu pelaksanaan dan
bahwa tiap-tiap nilai berlabel untuk mengidentifikasi typenya dalam
rangka membuat type checking mungkin. Hukuman untuk dynamic type
checking adalah biaya waktu dan ruang tambahan.
Type Equivalence (Kesamaan Jenis)
Dua type tak dikenal (satuan object) adalah sama jika mereka berisi elemen-elemen yang sama. Yang
sama tidak bisa dikatakan type nama mereka yang dulu, maka tidak
diperlukan untuk memisah type union. Kapan type dinamai, ada dua
pendekatan utama untuk menentukan apakah dua type sama.
Name Equivalence (Kesamaan Nama)
Di
dalam name equivalence dua type adalah sama jika mereka mempunyai nama
yang sama. Type diberi nama berbeda diperlakukan berbeda dan tidak bisa
secara kebetulan dicampur hanya karena struktur mereka secara kebetulan
adalah sama. Name equivalence perlu definisi type untuk global.
Structural Equivalence (Kesamaan Struktural)
Di
dalam structural equivalence, nama type diabaikan dan elemen-elemen
type dibandingkan untuk persamaan. Adalah mungkin bahwa dua type logic
yang berbeda boleh menjadi kebetulan yang sama dan dapat dicampur.
Definisi
type tidak diperlukan untuk menjadi global. Structural equivalence
adalah penting di dalam distribusi pemrograman, dimana program terpisah
harus mengkomunikasikan type data.
Definisi N.1:
Dua type T, T’ adalah name equivalence iff T dan T’ adalah nama yang sama.
Dua type T, T’ adalah structural equivalence iff T dan T’ memiliki satuan nilai yang sama.
Tiga aturan berikut yang digunakan untuk menentukan jika dua type adalah structural equivalence :
a. Suatu nama type sama secara struktur dengan dirinya sendiri
b. Dua
type yang sama secara struktur jika mereka dibentuk dengan menerapkan
type pembangun yang sama (secara berulang) ke type structural
equivalence.
c. Setelah suatu deklarasi type, type n = T, nama type n secara structural setara dengan T.
Type Inference (Jenis Kesimpulan)
Type inference adalah masalah yang umum dalam menjelmakan untyped atau sintaksis type parsial ke dalam terminologi yang baik.
Deklarasi
tetap Pascal adalah suatu contoh type inference, typa nama adalah
kesimpulan dari type yang tetap. Dalam Pascal untuk pengulangan type
index pengulangan dapat ditarik kesimpulan dari type recursively defined
dan dengan begitu indeks pengulangan harus suatu variabel lokal dari
pengulangan.
Bahasa
pemrograman Miranda dan Haskell adalah type static dan menyediakan
strong type inference system sehingga seorang programmer tidak perlu
mendeklarasikan type apapun. Bahasa juga mengizinkan para programmer untuk menyediakan spesifikasi type eksplisit.
Suatu type checking harus mampu :
a. Menentukan jika suatu program adalah type yang baik dan
b. Jika program adalah type yang baik, tentukan type ekspresi manapun di dalam program
Type Declaration (Jenis Deklarasi)
Bahkan
bahasa yang menyediakan suatu type inference system mengizinkan para
programmer untuk membuat deklarasi type eksplisit. Sekalipun compiler
dapat dengan tepat menyimpulkan type, pembaca manusia mungkin harus
meneliti beberapa halaman kode untuk menentukan type suatu fungsi.
Kesalahan
kecil oleh programmer dapat menyebabkan compiler mengeluarkan
pemberitahuan kesalahan atau untuk menyimpulkan suatu type yang berbeda
dibanding yang diharapkan. Karena pertimbangan ini adalah praktek
pemrograman yang baik dengan tegas menyatakan type atas semua kecuali
kasus yang paling nyata.
Polymorphism (Polimorfisme)
Suatu
type system adalah monomorphic jika masing-masing konstanta, variabel,
parameter, dan hasil fungsi mempunyai suatu type unik. Type checking
suatu system monomorphic adalah type secara langsung. Tetapi system type monomorphic semata-mata tidak memuaskan untuk penulisan software yang bisa dipakai kembali.
System
yang sepenuhnya monomorphic jarang. Kebanyakan bahasa pemrograman
berisi beberapa operator atau prosedur yang mengizinkan argumentasi
lebih dari satu type.
Definisi N.2 :
Monomorphism : tiap-tiap konstanta, variabel, parameter, fungsi dan operator mempunyai suatu type unik.
Pemuatan lebih mengacu
pada penggunaan dari sintaksis pengenal tunggal untuk mengacu pada
beberapa operasi berbeda yang dibedakan oleh type dan jumlah argumentasi
pada operasi.
Polymorphism :
suatu operator, fungsi atau prosedur yang mempunyai suatu keluarga type
yang terkait dan berorientasi secara seragam atas argumentasinya dengan
mengabaikan type.
Suatu operasi polymorphic adalah yang dapat berlaku untuk type yang berbeda tetapi berhubungan dengan argumentasi.
Suatu type system adalah polymorphic jika abstrak beroperasi secara seragam pada argumentasi suatu keluarga type terkait.
Polymorphism type ini kadang-kadang disebut parametric polymorphism.
Type Completeness (Jenis Kelengkapan)
Prinsip type ini, tidak ada operasi yang dapat berlaku semaunya, terbatas yang berhubungan dengan nilai type.