Format tetap (fixed format) membagi setiap baris kode COBOL menjadi kolom-kolom berfungsi tetap sebagai warisan era kartu berpori, sedangkan format bebas (free format) memperlakukan kode seperti bahasa modern tanpa batas kolom. Topik ini memetakan kolom-kolom format tetap, membuktikan secara nyata apa yang terjadi ketika sebuah baris melewati batas kolom 72, lalu menampilkan berkas format bebas beserta cara menyatakan format pada baris perintah cobc.
Peta kolom format tetap#
Format tetap lahir ketika kode program direkam ke kartu berpori (punched card) berkapasitas 80 kolom. Satu kartu memuat satu baris program, dan pembaca kartu membacanya kolom demi kolom secara mekanis. Disiplin posisi itu kemudian diwariskan ke berkas teks modern agar kode lama tetap dapat disunting tanpa mengubah maknanya. GnuCOBOL 3.2 menjadikan format tetap sebagai format bawaan cobc, sehingga berkas apa pun yang dikompilasi tanpa bendera tambahan mengikuti peta kolom ini.
| Kolom | Nama | Isi |
|---|---|---|
| 1-6 | nomor urut | penomoran baris, umumnya dikosongkan pada kode modern |
| 7 | kolom indikator | * atau / untuk komentar, - untuk lanjutan literal, D untuk baris debug |
| 8-11 | Area A | judul divisi, section, paragraf, serta entri level 01 dan 77 |
| 12-72 | Area B | pernyataan, kalimat, dan kelanjutan entri |
| 73-80 | kolom identifikasi | diabaikan kompilator, dulu dipakai sebagai penanda kartu |
Dua area inilah yang menentukan bentuk kode sehari-hari. Judul divisi seperti PROCEDURE DIVISION. ditulis mulai kolom 8 pada Area A karena berfungsi membuka struktur, sedangkan pernyataan seperti DISPLAY ditulis mulai kolom 12 pada Area B karena berisi kode yang dieksekusi. Selama setiap baris berakhir sebelum kolom 72, tidak ada error posisi yang muncul.
Baris yang melewati kolom 72#
cobc memotong secara senyap setiap bagian baris format tetap yang melewati kolom 72, sebab aturan format tetap memang menyatakan kolom setelahnya bukan bagian kode. Pemotongan itu baru menimbulkan masalah ketika bagian yang terpotong justru penting, misalnya tanda kutip penutup sebuah literal. Berkas terlalu-panjang.cbl berikut sengaja dibuat demikian, dan baris keempatnya berisi 123 karakter.
IDENTIFICATION DIVISION.
PROGRAM-ID. TERLALU-PANJANG.
PROCEDURE DIVISION.
DISPLAY "Kalimat contoh sengaja dibuat sangat panjang sehingga tanda kutip penutupnya jatuh melewati kolom 72.".
STOP RUN.Kompilasikan berkas itu untuk melihat akibat pemotongan tersebut.
# kompilasi berkas yang barisnya melewati kolom 72
cobc -x terlalu-panjang.cblterlalu-panjang.cbl:5: error: continuation character expected
3 | PROCEDURE DIVISION.
4 | DISPLAY "Kalimat contoh sengaja dibuat sangat panjang sehingga..
5 > STOP RUN.
6 | <EOF>
terlalu-panjang.cbl:4: error: invalid literal: 'Kalimat contoh sengaja dibuat sang ...'
2 | PROGRAM-ID. TERLALU-PANJANG.
3 | PROCEDURE DIVISION.
4 > DISPLAY "Kalimat contoh sengaja dibuat sangat panjang sehingga..
5 | STOP RUN.
6 | <EOF>
terlalu-panjang.cbl:4: note: missing terminating " character
terlalu-panjang.cbl:4: warning: optional period used [-Wdialect]Blok keluaran di atas adalah hasil asli dari perintah kompilasi sebelumnya. cobc memotong baris 4 tepat pada kolom 72, sehingga tanda kutip penutup dan titik penutup kalimat tidak ikut terkompilasi. Kompilator kemudian mendapati literal yang belum ditutup ketika sampai di baris 5, lalu mencatat continuation character expected di baris 5 dan invalid literal di baris 4, disertai catatan missing terminating " character. Dua baris yang ditunjuk sekaligus membingungkan apabila penyebab sebenarnya, yaitu batas kolom, tidak disadari.
Berkas tetap yang benar#
Versi benar menempatkan seluruh pernyataan jauh dari batas kolom 72 sekaligus memperlihatkan konvensi kolom yang lengkap. Berkas format-tetap.cbl berikut memakai nomor urut pada kolom 1-6, indikator bintang untuk komentar pada kolom 7, dan pernyataan yang tertata di Area B.
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. FORMAT-TETAP.
000300* Bintang di kolom 7 menjadikan baris ini komentar.
000400 PROCEDURE DIVISION.
000500 DISPLAY "Kode tetap berdisiplin pada peta kolom.".
000600 STOP RUN.Kode tetap berdisiplin pada peta kolom.Nomor urut 000100 dan seterusnya adalah konvensi kartu yang tidak memengaruhi makna, sehingga kode modern umumnya mengosongkannya. Baris ketiga menunjukkan indikator komentar, sedangkan indikator tanda hubung pada kolom 7 dipakai untuk menyambung literal ke baris berikutnya. Penyambungan itu perlu ketelitian ekstra karena spasi sisa baris pertama sampai kolom 72 ikut menjadi bagian literal, sehingga literal panjang lebih baik dipecah menjadi beberapa operan DISPLAY daripada disambung. Kompilasikan berkas ini dari direktorinya.
# kompilasi berkas format tetap yang benar
cobc -x format-tetap.cblSetelah kompilasi berhasil, jalankan ./format-tetap, dan satu baris keluaran di atas akan tampil kembali.
Format bebas#
Format bebas menghapus seluruh peta kolom, sehingga indentasi sepenuhnya bebas, baris boleh sepanjang apa pun, dan komentar ditulis dengan *> pada posisi mana pun di baris. Ada dua cara menyatakan format bebas. Pertama, berkas menyatakan formatnya sendiri melalui direktif >>SOURCE FORMAT FREE pada baris pertama, sehingga tetap sah dikompilasi tanpa bendera apa pun. Kedua, format dinyatakan melalui bendera -free pada baris perintah, yang berlaku pada seluruh berkas yang dikompilasi dalam perintah itu. Berkas berikut memakai direktif agar mandiri, sedangkan kompilasinya memakai bendera agar format dinyatakan eksplisit.
>>SOURCE FORMAT FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. FORMAT-BEBAS.
PROCEDURE DIVISION.
DISPLAY "Format bebas: indentasi empat spasi sudah cukup.".
DISPLAY "Baris ini sengaja dibiarkan panjang karena format bebas tidak memotong kode pada batas kolom 72.".
STOP RUN.Format bebas: indentasi empat spasi sudah cukup.
Baris ini sengaja dibiarkan panjang karena format bebas tidak memotong kode pada batas kolom 72.Baris kedua DISPLAY di berkas itu berisi 111 karakter dan tetap sah karena format bebas tidak memotong apa pun. Struktur programnya identik dengan versi tetap, hanya tanpa nomor urut dan tanpa penjajaran kolom. Kompilasikan dengan bendera -free.
# kompilasi berkas format bebas dengan bendera eksplisit
cobc -x -free format-bebas.cblJalankan ./format-bebas, dan kedua baris keluaran di atas akan tampil.
Memilih format#
Kode warisan pada perbankan dan pemerintahan hampir seluruhnya format tetap, sehingga suntingan pada kode semacam itu paling aman dilakukan tanpa mengubah formatnya. Kode baru pada GnuCOBOL bebas memilih salah satunya, dan format bebas menghilangkan satu kelas error yang bersumber dari batas kolom. Konvensi yang baik adalah memilih satu format secara konsisten untuk satu berkas, karena berkas yang tercampur menghasilkan error posisi yang sulit dilacak. Apabila satu proyek memuat kedua format, pastikan setiap berkas format bebas menyatakan dirinya melalui direktif agar tidak salah dibaca ketika dikompilasi tanpa bendera. Pilihan format tidak memengaruhi makna program yang sudah terkompilasi, karena kedua format hanyalah aturan penulisan sumber, bukan bagian dari bahasa yang dieksekusi.
Kesalahan umum#
- Penyunting menyisipkan karakter tab yang menggeser posisi kolom, sehingga judul divisi berpindah dari Area A dan kompilasi gagal dengan error posisi. Atur penyunting agar berkas
.cblmemakai spasi, bukan tab. - Kode disalin dari halaman web dengan spasi depan yang terpotong, sehingga pernyataan
DISPLAYberpindah ke Area A yang tidak menerima pernyataan. Geser seluruh baris kembali ke Area B sebelum mengompilasi. - Berkas format bebas tanpa direktif dikompilasi tanpa bendera
-free, sehingga cobc membacanya sebagai format tetap dan menemukan error kolom yang sebenarnya tidak ada. Tambahkan>>SOURCE FORMAT FREEpada baris pertama atau sertakan-freepada perintah kompilasi.
Ringkasan#
- Format tetap membagi baris menjadi nomor urut 1-6, kolom indikator 7, Area A 8-11, Area B 12-72, dan kolom identifikasi 73-80.
- cobc 3.2 memakai format tetap sebagai bawaan dan memotong baris secara senyap pada kolom 72, sehingga baris panjang menghasilkan error yang menunjuk baris lain.
- Direktif
>>SOURCE FORMAT FREEmenjadikan berkas format bebas mandiri, sedangkan bendera-freemenyatakan format dari baris perintah. - Kode warisan dipertahankan dalam format tetap, kode baru bebas memilih, dan satu berkas sebaiknya konsisten pada satu format.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL yang mendokumentasikan perilaku cobc dan format sumber yang didukungnya.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi peta kolom format tetap dan format bebas pada kompilator mainframe.