TYPE
CHECKING
Kompiler
harus memeriksa apakah source program mengikuti konvensi sintaksis atau
semantik dari source languange. Pemeriksaan ini disebut Static Checking
untuk meyakinkan bahwa kesalahan programming akan dideteksi dan dilaporkan.
Contoh
static checking adalah :
1.
Type checks
2.
Flow-of-control checks
3.
Uniqueness checks
4.
Name-related checks
HAL-HAL
PENTING
·
Beberapa kompiler PASCAL
mengga-bungkan static-checking dan interme-diate code generation dengan
parsing
·
Untuk bahasa yang konstruksinya
kompleks, seperti Ada, type-checking
biasanya dilakukan terpisah, antara parsing dan intermediate code generation
·
Bahasa ADA secara eksplisit
meng-ijinkan programmer untuk overload
operator dimana sangat banyak bahasa lainnya yang overload operator aritmatika
dengan type numerik yang berbeda (integer dan real)
·
Constraint
overload operator dicek dalam one-pass parser tidak meng-ijinkan terlalu banyak
jenis untuk forward referensi simbol
·
Pada
Bahasa C dan Fortran dengan kemudahan yang dimilikinya, bahwa type checking
tidak mungkin dalam one-pass parser
Posisi type checker dalam Kompiler :
Type Checker memeriksa apakah tipe
dari suatu konstruksi cocok dengan konteksnya. Misalnya, built-in operator
arithmetic mod dalam Pascal memer-lukan operand integer, sehingga type
checker harus memeriksa bahwa ope-rand dari mod mempunyai type integer.
TYPE
SYSTEM
TYPE EKSPRESI
Type Expression merupakan type dasar yang menggunakan
operator disebut type constructor.
Definisi Type Expression :
1. Basic type : boolean, char, integer, real dan Basic type khusus
type_error (beri signal selama type checking)
2. Type Name
3.
Type
Constructor, yaitu :
· Array
· Product
· Record
·
Pointer
·
Function
4.
Type
Variable
TYPE STATIC
DAN DYNAMIC
Static Checking : Checking yang dilaku-kan kompiler saat program dijalan-kan dan
dihentikan secara dinamis
Dynamic Checking : Checking yang di-lakukan oleh target program
SPESIFIKASI
TYPE CHECKER SEDERHANA
Contoh
type checker sederhana dengan grammar untuk source language
G: P ® D ; E
D ® D ; D | id : T
T ® char | integer | array | [num] of T | T
E ® literal | num | id | E mod E | E[E] | E
Contoh fragmen program yang dapat dihasilkan berdasarkan
grammar diatas
Key :
integer;
Key mod 1999
Spesifikasi type checking yang dilaku-kan pada bahasa
meliputi :
·
Expressions,
statements, functions
·
Ekivalensi
struktur, nama type ekspresi
·
Cycle
dalam representasi type
TYPE CONVERSION
Secara
eksplisit bahwa representasi, instruksi mesin dan operasi dari integer dan real
berbeda oleh karena itu compiler harus mengkonversi salah satu dari type
operand tersebut untuk menjamin bahwa kedua operand bertipe sama.
Type
checking dalam kompiler dapat dipakai untuk menyisipkan operasi konversi
kedalam intermediate repre-sentation dari source program.
Contoh :
Suatu ekspresi adalah
x + i,
dimana : x bertipe real dan
i
bertipe integer.
Postfix notation untuk x + i adalah :
x i inttoreal real+
dimana operator inttoreal meng-konversikan i dari
integer ke real, kemudian real+ melakukan operasi penjumlahan.
OVERLOADING FUNCTION DAN OPERATOR
Overloaded Symbol :
Simbol yang mempunyai arti lain dan tergantung
daripada konteksnya.
·
Dalam matematika, misal : A+B
yang mana operator penjumlahan (+) adalah overloaded, sebab berbeda arti dengan
A dan B
·
Dalam ADA, tanda kurung ( ) adalah overloaded.
SET KEMUNGKINAN TYPE
Contoh :
Dalam ADA,
standar interpretasi opera-tor * adalah function dari sepasang integer.
Kadang-kadang sub-expression
mempunyai beberapa kemungkinan tipe. Dalam ADA, konteks harus memberi
informasi yang cukup untuk mempersempit pilihan menjadi tipe tunggal.
Operator * dapat di-overload
dengan menambah deklarasi sebagai berikut :
function
“*” (i,j:integer) return complex;
function
“*” (x,y:complex) return complex;
Setelah
deklarasi diatas kemungkinan tipe untuk * adalah :
integer x
integer ® integer
integer x
integer ® complex
complex x complex ® complex
Misalkan bilangan 2, 3, 5 tipenya mungkin hanya integer,
subekspresi dari 3*5 dapat berupa integer atau kompleks, tergantung kepada
konteksnya.
Jadi untuk ekspresi
2*(3*5), maka 3*5 harus bertipe integer karena * meng-ambil sepasang integer atau sepasang
bilangan kompleks sebagai argumen.
Sebaliknya, 3*5 harus bertipe kompleks jika ekspresi
lengkapnya adalah (3*5)*Z dan Z dideklarasikan sebagai kompleks.
Catatan : disamping set kemungkinan type ekspresi juga
penyempitan kemungkinan set kemungkinan type.
POLYMORPHIC FUNCTION
Suatu prosedur biasanya membolehkan statement dalam
body-nya dieksekusi dengan argumen bertipe tetap.
Suatu polymorphic
procedure dapat dipanggil (statement dalam body-nya dapat dieksekusi)
dengan argumen yang berbeda tipenya.
Istilah “polymorphic” juga dapat dite-rapkan untuk
sepenggal code yang dapat dieksekusi dengan argument yang berbeda tipenya.
Contoh :
C
reference manual menyatakan ten-tang pointer operator & :
“Jika tipe operand adalah x, maka hasilnya akan bertipe pointer to x”.
Karena beberapa tipe data bisa menggantikan x, maka
operator & dalam C bersifat polymorphic.
Didalam
bahasa Ada, “generic” function bersifat polymorphic. Namun
polimorfis dalam ADA terbatas. Karena istilah “generic” juga digunakan untuk
overloaded function dan coercion dari argument suatu function.
KENAPA FUNGSI
POLIMORPIS?
Polymorphic Function sangat menarik karena memberi
fasilitas untuk meng-implementasikan algoritma yang me-manipulasi struktur
data, tanpa mem-perhatikan tipe elemen dalam struktur data tersebut.
Contoh :
Dalam Pascal, program untuk menen-tukan panjang dari list
berelemen integer adalah sebagai berikut :
type link = ^cell;
cell = record
info : integer;
next : link;
end;
function length(lptr : link) :
integer;
var len : integer;
begin
len
:= 0;
while lptr <> nil do
begin
len := len + 1;
lptr := lptr.next;
end;
length := len;
end;
Dalam
bahasa ML :
fun length(lptr) =
if null(lptr) then 0
else length(tl(lptr)) + 1;
maka
:
length([“sun”,”mon”,”tue”]);
length([10,9,8]);
adalah
3
Tidak ada komentar:
Posting Komentar