PERFORM dalam Semua Bentuk

PERFORM inline dan out-of-line dengan THRU, UNTIL, VARYING, dan TIMES untuk pengulangan terkontrol.

Daftar isi

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.

cobol perform-outofline.cbl
       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.
text Keluaran
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 03

Simpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu jalankan ./perform-outofline.

bash
# kompilasi program PERFORM out-of-line
cobc -x perform-outofline.cbl

Keluaran 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.

cobol perform-inline.cbl
       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.
text Keluaran
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-03

Kompilasi programnya dengan perintah berikut, lalu jalankan ./perform-inline.

bash
# kompilasi program PERFORM inline
cobc -x perform-inline.cbl

Tiga 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#