Scope Variabel

Scope dari suatu variable dimaksudkan sebagai rentang (range) dari statements dimana variable tersebut dikenali (visible). Di dalam suatu bahasa pemrograman, scope rules menentukan bagaimana suatu nama dikaitkan kepada suatu variable, atau menentukan bagaimana suatu nama dikaitkan kepada suatu expression pada bahasa functional languages. Beberapa terminologi yang berkaitan dengan scope diberikan sebagai berikut:
  • Suatu variable dikatakan visible bagi suatu statement jika variable tersebut dapat digunakan (referenced) oleh statement tersebut.
  • Suatu variable dikategorikan sebagai local variable bagi suatu subprogram jika variable tersebut dideklarasikan di dalam subprogram tersebut.
  • Suatu variable dikategorikan sebagai non-local variable bagi suatu subprogram jika variable tersebut tidak dideklarasikan di dalam subprogram tersebut namun visible di dalam subprogram dimaksud,
  • Global variable dimaksudkan sebagai salah satu kategori dari non-local variable.
Bahasa pemrograman umumnya menerapkan konsep scoping yang berbeda, yaitu static scoping atau dynamic scoping.
Pada static scoping, lingkup (scope) dari suatu variable ditentukan secara statis sebelum program dieksekusi. Dengan demikian kita maupun compiler dapat dengan mudah mengetahui tipe data setiap variable dengan cara melihat/membaca source code (program text) nya. Static scoping dapat dihasilkan melalui bahasa pemrograman yang menyediakan fitur nested subprogram (yang menghasilkan nested static scope), maupun bahasa pemrograman yang tidak menyediakan fitur nested subprogram. Nested scope dapat juga dihasilkan melalui nested class definition maupun melalui fitur block.

Dalam proses penentuan acuan (reference) terhadap suatu variable, reader bahasa pemrograman perlu menemukan statement dimana variable tersebut dideklarasikan (secara explicit ataupun implicit). Dalam bahasa yang menerapkan static-scoping dengan nested-subprogram (seperti Ada, Javascript, Common LISP, Scheme, Fortran 2003+, F#, dan Phyton), proses tersebut adalah sebagai berikut:
  • Misalkan di dalam subprogram sub1 (subprogram sub1 & sub2 lihat contoh potongan kode di bawah) terdapat statement yang mengacu (reference) pada variable x.
  • Proses pencarian (searching) terhadap deklarasi variable x dimulai dari subprogram sub1 .
  • Jika deklarasi tersebut tidak ditemukan di dalam sub1, maka pencarian dilanjutkan ke subprogram dimana sub1 di deklarasikan, yaitu static parent dari sub1.
  • Jika belum juga ditemukan, maka pencarian berlanjut ke subprogram berikutnya yang lebih besar, yang mengandung deklarasi static parent dari sub1, yang disebut static ancestor dari sub1. Pencarian deklarasi varaible x berhenti pada subprogram terbesar dari static ancestor. Jika tetap tidak ditemukan maka disimpulkan terdapat undeclared variable error.
Berikut adalah contoh static scoping pada Javascipt, dimana fungsi sub1 dan sub2 adalah nested di dalam fungsi big:
function big() {
function sub1() { 
var x = 7;  
sub2(); 
}
function sub2() { 
var y = x; 
}
var x = 3; 
sub1();
}

Dengan static scoping, acuan (reference) bagi variable x di dalam sub2 adalah variable x yang dideklarasikan di dalam big karena tidak ditemukan deklarasi variable x di dalam sub2, namun ditemukan pada static parent dari sub2. Deklarasi variable x pada sub1 tidak diperhatikan karena bukan salah satu static ancestor dari sub2.

Deklarasi suatu variable dapat tersembunyi (hidden) pada beberapa bahasa pemrograman dengan atau tanpa fitur nested subprogram. Dalam contoh Javascript di atas, variable lokal x di dalam sub1 digunakan oleh setiap acuan pada variable x yang ada di dalam sub1, dan karenanya variable x yang dideklarasikan pada big bersifat hidden bagi sub1.

Dalam bahasa pemrograman Ada, variable x yang dideklarasikan pada ancestor seperti variable x yang dideklarasikan pada big di atas, dapat diacu dengan cara mengikutsertakan nama ancestor tersebut, misalnya big.x untuk mengacu pada variable x yang dideklarasikan pada fungsi big.

Cara lain untuk menghasilkan static scoping adalah menggunakan fitur block. Dengan fitur ini, static scope terbentuk ketika program sedang berjalan (eksekusi) seperti yang konsepnya telah diperkenalkan oleh ALGOL 60. Variable jenis ini termasuk stack dynamic, dimana storage untuk variabe tersebut teralokasi saat memasuki block dan terdealokasi saat keluar dari block. Berikut ini adalah contoh penerapan block structure dalam bahasa C (berlaku di C and C++, tapi tidak berlaku pada Java and C#) :
void sub() {
int count; 
while (...) {
int count; 
count++; 
...
} 
}

No comments:

Post a Comment