Deklarasi

Konstanta bernama, deklarasi variabel, dan kewajiban inisialisasi yang menegakkan pengetikan kuat sejak awal.

Daftar isi

Deklarasi adalah bagian program tempat konstanta dan variabel diperkenalkan kepada kompilator beserta tipenya. Topik ini membahas konstanta bernama, deklarasi variabel, dan kewajiban inisialisasi dalam satu rangkaian, dengan program penghitung tegangan sebagai contoh utama. Setelah membacanya, bagian deklarasi sebuah prosedur Ada dapat disusun dengan menyebut tipe setiap entitas secara eksplisit, sehingga pengetikan kuat sudah bekerja sejak baris pertama program.

Konstanta bernama#

Konstanta bernama adalah entitas yang nilainya ditetapkan pada deklarasinya dan tidak dapat diubah selama program berjalan. Deklarasinya memuat kata constant, tipe yang bersifat opsional, dan ekspresi nilai yang wajib ada. Apabila tipe dituliskan secara eksplisit, entitas tersebut adalah konstanta bertipe dan nilainya diperiksa terhadap tipe itu. Apabila tipe ditiadakan, konstanta menjadi named number, yaitu angka bernama bertipe universal untuk bilangan bulat sehingga dapat digunakan di mana pun nilai integer diterima.

Program berikut menggunakan konstanta bertipe sebagai batas pengukuran dan variabel Tegangan yang diinisialisasi dengan hasil pembacaan sensor. Nilai 198 berada di bawah Batas_Bawah, sehingga cabang elsif dijalankan dan deviasinya dihitung sebesar 12.

ada penghitung_tegangan.adb
with Ada.Text_IO;

procedure Penghitung_Tegangan is
   Batas_Atas  : constant Integer := 240;
   Batas_Bawah : constant Integer := 210;
   Tegangan    : Integer          := 198;
   Deviasi     : Integer;
begin
   if Tegangan > Batas_Atas then
      Deviasi := Tegangan - Batas_Atas;
   elsif Tegangan < Batas_Bawah then
      Deviasi := Batas_Bawah - Tegangan;
   else
      Deviasi := 0;
   end if;
   Ada.Text_IO.Put_Line ("Deviasi = " & Integer'Image (Deviasi));
end Penghitung_Tegangan;
bash
# kompilasi program
gnatmake -q penghitung_tegangan.adb
# jalankan program
./penghitung_tegangan
text Keluaran
Deviasi =  12

Perintah gnatmake dengan opsi -q tidak mencetak apa pun apabila kompilasi berhasil, sehingga satu-satunya baris keluaran berasal dari program itu sendiri. Atribut Image menyisipkan satu spasi di depan bilangan nonnegatif, sehingga keluaran memuat dua spasi antara tanda sama dengan dan angka 12. Perilaku ini berlaku untuk atribut Image pada seluruh tipe bilangan bulat dan perlu diperhitungkan saat format keluaran disusun. Nama konstanta pada program di atas membuat rumus deviasi terbaca sebagai perbandingan batas, bukan sebagai perbandingan angka tanpa nama.

Deklarasi variabel#

Variabel dideklarasikan pada bagian deklarasi prosedur, yaitu antara kata is dan kata begin. Setiap deklarasi menyebutkan nama, tipe secara eksplisit, dan nilai awal secara opsional. Nilai awal boleh berupa ekspresi apa pun yang tipenya cocok, termasuk ekspresi yang melibatkan konstanta yang sudah dideklarasikan di atasnya. Urutan deklarasi dihormati, sehingga sebuah nilai awal hanya boleh merujuk entitas yang dideklarasikan sebelum deklarasi tersebut.

Beberapa nama boleh dideklarasikan dalam satu baris dengan tipe dan nilai awal yang sama, contohnya X, Y : Integer := 0;. Bentuk ini menginisialisasi seluruh nama yang disebutkan dengan satu ekspresi. Praktik yang lebih disarankan adalah satu deklarasi per baris dengan komentar tujuannya, sehingga setiap variabel memiliki ruang untuk penjelasannya. Dengan disiplin itu, bagian deklarasi berfungsi sekaligus sebagai dokumentasi keadaan awal program.

Pada program penghitung tegangan, deklarasi Deviasi : Integer; menunjukkan variabel yang sengaja dibiarkan tanpa nilai awal karena nilainya baru ada setelah percabangan dieksekusi. Bentuk seperti ini sah sepanjang variabelnya ditugasi sebelum dibaca, dan bagian berikutnya membahas risikonya.

Kewajiban inisialisasi#

Konstanta wajib diinisialisasi pada deklarasinya, dan deklarasi konstanta tanpa nilai langsung ditolak sebagai error waktu kompilasi. Variabel tidak wajib diinisialisasi, tetapi membaca variabel yang belum pernah ditugasi termasuk bounded error. Bounded error adalah kesalahan yang dampaknya dibatasi oleh bahasa pada sejumlah kemungkinan perilaku tertentu, bukan sepenuhnya tak tentu. GNAT membantu menegakkan disiplin ini pada waktu kompilasi: dengan switch -gnatwa, pembacaan variabel yang belum pernah ditugasi menghasilkan peringatan yang menyebut baris deklarasinya. Program berikut sengaja membaca variabel X yang belum ditugasi.

ada uji_inisialisasi.adb
with Ada.Text_IO;

procedure Uji_Inisialisasi is
   X : Integer;
begin
   Ada.Text_IO.Put_Line (Integer'Image (X));
end Uji_Inisialisasi;
bash
# kompilasi dengan seluruh peringatan diaktifkan
gnatmake -q -gnatwa uji_inisialisasi.adb
text Keluaran
uji_inisialisasi.adb:4:04: warning: variable "X" is read but never assigned [-gnatwv]

Pesan peringatan menyebut baris deklarasi X beserta alasannya, yaitu variabel itu dibaca tanpa pernah ditugasi. Program semacam ini tetap dapat dikompilasi karena peringatan bukan error, tetapi programnya tidak layak dijalankan karena nilai X belum terdefinisi. Praktik yang dianjurkan adalah mengisi nilai awal pada setiap deklarasi variabel, sebagaimana Tegangan : Integer := 198; pada contoh penghitung tegangan. Dengan kebiasaan itu, keadaan awal seluruh data program terbaca langsung dari bagian deklarasinya.

Kesalahan umum#

Kesalahan pada bagian deklarasi biasanya terdeteksi cepat karena sebagian besar ditolak kompilator, sedangkan sisanya menimbulkan perilaku yang sulit dilacak. Tiga kasus berikut sering muncul.

  • Mengubah nilai konstanta setelah deklarasinya. Kompilator menolak penugasan ke konstanta sebagai error, karena nilainya ditetapkan sekali pada deklarasi. Gunakan variabel apabila nilai tersebut memang berubah selama program berjalan.
  • Membaca variabel yang belum ditugasi. Kesalahan ini lolos kompilasi tanpa switch -gnatwa, dan hasil pembacaannya tidak dapat diprediksi. Isi nilai awalnya atau pastikan penugasan terjadi sebelum pembacaan pertama.
  • Menulis deklarasi di tengah badan prosedur. Deklarasi hanya sah pada bagian deklarasi prosedur atau di dalam blok declare yang membungkusnya secara eksplisit. Pindahkan deklarasi ke bagian deklarasi agar program dapat dikompilasi.

Ketiganya dicegah dengan kebiasaan yang sama, yaitu menuntaskan tipe dan nilai awal setiap entitas sebelum badan prosedur ditulis.

Ringkasan#

  • Konstanta bernama wajib diinisialisasi pada deklarasinya dan tidak dapat diubah, baik sebagai konstanta bertipe maupun sebagai angka bernama.
  • Variabel dideklarasikan dengan tipe eksplisit di bagian deklarasi, dan nilai awalnya hanya boleh merujuk entitas yang dideklarasikan sebelumnya.
  • Membaca variabel yang belum ditugasi termasuk bounded error, dan switch -gnatwa pada GNAT menandainya sebagai peringatan waktu kompilasi.

Referensi#