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