Topik ini membahas verb PERFORM dalam seluruh bentuk utamanya, yaitu bentuk out-of-line yang memanggil paragraf bernama, rentang THRU, penghitungan TIMES, syarat UNTIL beserta posisi ujinya, pengulangan VARYING, dan bentuk inline dengan END-PERFORM. Penguasaan bentuk-bentuk ini memberikan kendali pengulangan yang eksplisit atas jumlah iterasi, syarat penghentiannya, dan variabel pengendalinya. Setiap bentuk didemonstrasikan dengan program yang dikompilasi dan dijalankan pada GnuCOBOL 3.2.
Bentuk out-of-line dan rentang THRU#
PERFORM out-of-line mengeksekusi satu paragraf bernama hingga selesai, lalu
alur program kembali ke pernyataan yang terletak tepat sesudah PERFORM.
Bentuk dasarnya adalah PERFORM nama-paragraf. Penambahan kata THRU
memperluas cakupannya menjadi rentang, yaitu paragraf awal sampai paragraf
akhir yang dieksekusi berurutan, termasuk seluruh paragraf yang berada di
antaranya. Rentang ini berguna ketika satu langkah kerja memang terdiri atas
beberapa paragraf, misalnya mencetak isi laporan lalu membersihkan areanya.
Pernyataan PERFORM menjadi alat utama penataan struktur COBOL. Badan pekerjaan ditulis sebagai paragraf bernama, lalu paragraf itu dipanggil dari paragraf pengendali setiap kali diperlukan, dan alur selalu kembali ke pemanggilnya setelah paragraf yang dipanggil selesai. Pola ini menggantikan lompatan GO TO yang membuat jalur eksekusi sulit dilacak, karena setiap pemanggilan memiliki titik kembali yang jelas. Urutan paragraf di dalam Divisi PROCEDURE merupakan urutan definisi, bukan urutan eksekusi, dan alur eksekusinya ditentukan oleh pemanggilan antarparagraf.
Program berikut memuat seluruh bentuk out-of-line tersebut dalam satu program utuh.
IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-OTL.
*--------------------------------------------------------------
* Bentuk out-of-line PERFORM: paragraf tunggal, rentang THRU,
* TIMES, UNTIL, dan VARYING.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 HITUNG PIC 9(2) VALUE 0.
01 NOMOR PIC 9(2).
PROCEDURE DIVISION.
UTAMA.
PERFORM CETAK-PESAN
PERFORM CETAK-PESAN THRU BERSIHKAN
PERFORM CETAK-PESAN 2 TIMES
PERFORM TAMBAH-HITUNG UNTIL HITUNG >= 5
DISPLAY "Nilai HITUNG akhir: " HITUNG
PERFORM CETAK-NOMOR
VARYING NOMOR FROM 1 BY 1 UNTIL NOMOR > 3
STOP RUN.
CETAK-PESAN.
DISPLAY "Pesan dari paragraf CETAK-PESAN".
BERSIHKAN.
DISPLAY "Paragraf BERSIHKAN ikut dieksekusi".
TAMBAH-HITUNG.
ADD 1 TO HITUNG.
CETAK-NOMOR.
DISPLAY "Iterasi nomor " NOMOR.Pesan dari paragraf CETAK-PESAN
Pesan dari paragraf CETAK-PESAN
Paragraf BERSIHKAN ikut dieksekusi
Pesan dari paragraf CETAK-PESAN
Pesan dari paragraf CETAK-PESAN
Nilai HITUNG akhir: 05
Iterasi nomor 01
Iterasi nomor 02
Iterasi nomor 03Simpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu
jalankan ./perform-outofline.
# kompilasi program PERFORM out-of-line
cobc -x perform-outofline.cblKeluaran mengikuti urutan pernyataan pada program. PERFORM CETAK-PESAN
yang pertama mencetak satu baris. Bentuk PERFORM CETAK-PESAN THRU BERSIHKAN mengeksekusi rentang tersebut sehingga baris pesan disusul baris
Paragraf BERSIHKAN ikut dieksekusi sebagai bagian akhir rentang, sedangkan
PERFORM CETAK-PESAN 2 TIMES mencetak dua baris lagi dari paragraf yang
sama. Baris Nilai HITUNG akhir: 05 menunjukkan bahwa perulangan UNTIL
pada PERFORM TAMBAH-HITUNG UNTIL HITUNG >= 5 mengulang paragrafnya tepat
lima kali, dan tiga baris terakhir menunjukkan VARYING yang menaikkan
NOMOR dari 1 sampai 3.
TIMES, UNTIL, dan VARYING#
Ketiga bentuk ini menentukan kapan pengulangan berhenti dengan cara yang
berbeda. Bentuk TIMES mengulang badan sejumlah yang tertulis, misalnya
PERFORM CETAK-PESAN 2 TIMES, dan jumlahnya boleh berupa variabel. Bentuk
UNTIL menguji syarat sebelum setiap iterasi, sehingga badan berhenti
dieksekusi begitu syaratnya benar. Bentuk VARYING menambahkan variabel
pengendali yang diatur pada FROM, dinaikkan pada BY, dan diuji terhadap
syarat UNTIL sebelum setiap iterasi.
Pola uji VARYING sering disalahpahami. Urutannya adalah
mengisi variabel dengan nilai FROM, menguji syarat UNTIL, mengeksekusi
badan apabila syarat belum benar, menaikkan variabel sebesar BY, lalu
menguji kembali. Karena pengujian mendahului badan, rentang
FROM 1 BY 1 UNTIL NOMOR > 3 mengeksekusi badan untuk NOMOR bernilai 1, 2,
dan 3 seperti pada keluaran program. Pemilihan bentuk mengikuti kebutuhan, yaitu
TIMES bila jumlah iterasi diketahui, UNTIL bila syarat berhentinya yang
jelas, dan VARYING bila nomor iterasi digunakan di dalam badan. Nilai BY
boleh negatif, sehingga rentang FROM 6 BY -1 UNTIL NOMOR < 2 menurunkan
penghitung dari 6, 5, dan seterusnya sampai syaratnya benar.
Bentuk inline END-PERFORM#
PERFORM inline menempatkan badan pengulangan di antara PERFORM dan END-PERFORM tanpa paragraf terpisah, sehingga langkah yang hanya dijalankan sekali tidak mencemari daftar paragraf program. Semua variasi pengendalian yang tersedia pada bentuk out-of-line juga berlaku di sini, termasuk UNTIL dan VARYING. Kata WITH TEST AFTER memindahkan pengujian syarat ke sesudah badan, sehingga badan selalu dieksekusi sekali meskipun syaratnya sudah benar sejak awal.
Program berikut menunjukkan pengulangan inline dengan UNTIL, perilaku TEST BEFORE bawaan, WITH TEST AFTER, dan VARYING.
IDENTIFICATION DIVISION.
PROGRAM-ID. PERFORM-INL.
*--------------------------------------------------------------
* PERFORM inline END-PERFORM dengan UNTIL, WITH TEST AFTER,
* dan VARYING.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STOK PIC 9(3) VALUE 0.
01 NOMOR PIC 9(2).
PROCEDURE DIVISION.
UTAMA.
MOVE 90 TO STOK
PERFORM UNTIL STOK = 0
SUBTRACT 30 FROM STOK
DISPLAY "Stok berkurang menjadi " STOK
END-PERFORM
MOVE 5 TO STOK
PERFORM UNTIL STOK > 0
DISPLAY "Baris ini tidak pernah tampil"
END-PERFORM
DISPLAY "TEST BEFORE melewati badan, stok tetap " STOK
MOVE 10 TO STOK
PERFORM WITH TEST AFTER UNTIL STOK = 10
DISPLAY "Badan berjalan walau syarat sudah benar"
END-PERFORM
PERFORM VARYING NOMOR FROM 1 BY 1 UNTIL NOMOR > 3
DISPLAY "Baris ke-" NOMOR
END-PERFORM
STOP RUN.Stok berkurang menjadi 060
Stok berkurang menjadi 030
Stok berkurang menjadi 000
TEST BEFORE melewati badan, stok tetap 005
Badan berjalan walau syarat sudah benar
Baris ke-01
Baris ke-02
Baris ke-03Kompilasi programnya dengan perintah berikut, lalu jalankan
./perform-inline.
# kompilasi program PERFORM inline
cobc -x perform-inline.cblTiga baris pertama keluaran berasal dari pengulangan UNTIL yang mengurangi
stok awal 90 sebesar 30 sebanyak tiga kali hingga mencapai nol. Baris keluaran
TEST BEFORE melewati badan, stok tetap 005 membuktikan bahwa pengujian
mendahului badan, karena stok 5 sudah memenuhi syarat STOK > 0 sehingga
badan yang berisi satu DISPLAY tidak pernah dijalankan. Baris kelima membuktikan
WITH TEST AFTER, karena syarat STOK = 10 sudah benar sejak awal tetapi
badannya tetap dieksekusi sekali. Tiga baris terakhir menunjukkan VARYING
inline yang bekerja sama persis dengan bentuk out-of-line.
Kesalahan umum#
- Melupakan STOP RUN pada paragraf utama. Tanpa penghenti, eksekusi berlanjut ke badan paragraf-paragraf yang seharusnya hanya dipanggil PERFORM dan keluaran program menjadi kacau. Akhiri paragraf pengendali dengan STOP RUN.
- Menyisipkan paragraf baru di tengah rentang THRU. Rentang dieksekusi berdasarkan urutan teks, sehingga paragraf yang disisipkan antara awal dan akhir rentang ikut terpanggil tanpa peringatan apa pun. Periksa seluruh THRU setiap kali urutan paragraf diubah.
- Mengira UNTIL selalu mengeksekusi badan sekali. Posisi uji bawaan adalah TEST BEFORE, sehingga badan bisa terlewati nol kali apabila syaratnya sudah benar sejak awal. Gunakan WITH TEST AFTER hanya bila satu eksekusi minimum memang diinginkan.
Ringkasan#
- PERFORM out-of-line memanggil paragraf bernama dan kembali ke pernyataan sesudahnya, sedangkan THRU memperluas panggilan menjadi rentang paragraf yang berurutan.
- TIMES mengulang sejumlah tetap, UNTIL menguji syarat sebelum setiap iterasi, dan VARYING mengelola variabel pengendali dengan FROM, BY, dan UNTIL.
- Bentuk inline dengan END-PERFORM menuliskan badan pengulangan di tempat, dan WITH TEST AFTER menjamin badan dieksekusi sekali dengan menggeser uji ke sesudah badan.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang digunakan untuk mengompilasi dan menjalankan seluruh contoh pada topik ini.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat semua bentuk PERFORM beserta klausa THRU, TIMES, UNTIL, dan VARYING.