Unit program dan implicit none

Bentuk unit program, aturan implicit none pada setiap lingkup, dan program pertama yang dikompilasi.

Daftar isi

Topik ini membahas bentuk paling dasar dari sebuah program Fortran modern, mulai dari unit program, peran pernyataan implicit none, hingga proses kompilasi pertama dari terminal. Compiler yang digunakan adalah gfortran, yaitu program yang menerjemahkan kode sumber menjadi berkas executable yang siap dijalankan sistem operasi. Setelah topik ini diselesaikan, sebuah program lengkap dapat ditulis, dikompilasi dengan gfortran, dan dijalankan dari terminal. Pesan error yang muncul ketika sebuah variabel tidak dideklarasikan juga dibahas, karena contoh tersebut menunjukkan pekerjaan utama compiler.

Unit program dan bentuknya#

Kode sumber Fortran tersusun atas satu atau lebih program unit, yaitu bagian mandiri yang dikompilasi sebagai satu kesatuan. Unit paling sederhana adalah program utama (main program), tempat eksekusi dimulai ketika hasil kompilasi dijalankan. Bentuknya dibuka dengan pernyataan program diikuti nama yang dipilih, dan ditutup dengan end program yang boleh mengulang nama tersebut. Isi unit terbagi dua bagian, yaitu bagian deklarasi yang menetapkan variabel dan konstanta pada bagian atas unit, lalu bagian pernyataan yang dieksekusi di bawah bagian deklarasi tersebut.

Satu pernyataan (statement) ditulis pada satu baris, dan berkas sumber modern bersifat free form, artinya posisi kolom tidak dibatasi seperti pada era Fortran 77. Satu berkas sumber boleh memuat lebih dari satu unit program, dan compiler memeriksa setiap unit sampai tuntas sebelum menghasilkan berkas executable. Ekstensi .f90 menandai sumber free form, sedangkan ekstensi .f menandai bentuk kolom tetap yang lama. Huruf besar dan huruf kecil diperlakukan identik oleh compiler, sehingga PROGRAM dan program dibaca sama, tetapi huruf kecil digunakan secara konsisten di seluruh jalur ini. Baris yang berawalan tanda seru ! adalah komentar dan tidak dieksekusi, sedangkan indentasi dua spasi digunakan agar blok mudah dibaca.

Implicit none dan implicit typing#

Apabila pernyataan implicit none tidak ditulis, Fortran menetapkan tipe setiap variabel secara diam-diam dari huruf awal namanya, perilaku yang disebut implicit typing. Nama yang diawali huruf i sampai n otomatis bertipe integer, sedangkan nama yang diawali huruf lain otomatis bertipe real. Perilaku ini adalah warisan desain lama yang dirancang untuk memperpendek penulisan program. Aturan huruf awal memang membuat deklarasi dapat dilewati, tetapi tipe yang muncul diam-diam sering tidak sesuai dengan maksud penulisnya.

fortran
! tidak-dijalankan
! tanpa implicit none, dua nama berikut menerima tipe secara diam-diam
i = 10          ! otomatis integer karena diawali huruf i
hasil = i / 4   ! otomatis real karena diawali huruf h

Kelalaian yang paling sering terjadi adalah salah ketik nama variabel. Tanpa implicit none, jmlah yang salah ketik dari jumlah dianggap variabel baru, sehingga program tetap berjalan dengan nilai yang tidak didefinisikan. Apabila implicit none ditulis di bagian deklarasi, setiap nama harus dideklarasikan secara eksplisit, dan salah ketik seperti itu berubah menjadi pesan error saat kompilasi. Aturan emas jalur ini sederhana, yaitu implicit none ditulis pada setiap lingkup (scope), baik unit program, modul, maupun prosedur, karena implicit typing berlaku per lingkup dan tidak diwarisi dari lingkup luar.

Program pertama: halo.f90#

Program pertama cukup berisi satu pernyataan keluaran di dalam unit program utama. Berkas berikut disimpan dengan nama halo.f90 pada folder kerja.

fortran halo.f90
program halo
  implicit none

  print *, "Halo, dunia!"
end program halo

Baris pertama membuka unit program bernama halo, dan baris terakhir menutupnya dengan nama yang sama. Pernyataan print * menulis nilai ke terminal dengan format list-directed, yaitu format bawaan yang menyusun sendiri lebar kolom dan pemisah antarnilai. Tanda * pada print * memilih format bawaan tersebut, sedangkan daftar setelah koma berisi nilai yang dituliskan. Nilai character ditulis di antara tanda kutip ganda.

Kompilasi dan eksekusi dilakukan dengan dua perintah berikut dari folder yang sama dengan berkasnya.

bash
# kompilasi program halo menjadi berkas executable bernama halo
gfortran halo.f90 -o halo
# jalankan program hasil kompilasi
./halo
text Keluaran
 Halo, dunia!

Spasi di awal baris keluaran bukan kebetulan, melainkan bawaan format list-directed yang menyisakan kolom pertama untuk tanda kontrol pencetak seperti pada printer baris lama. Perintah gfortran halo.f90 -o halo mengompilasi berkas sumber dan menamai hasilnya halo melalui opsi -o. Tanpa opsi tersebut, hasil kompilasi diberi nama a.out secara default.

Kompilasi dan error yang ditangkap compiler#

Compiler memeriksa kesesuaian setiap nama variabel dengan deklarasinya sebelum menghasilkan berkas executable. Pemeriksaan ini bekerja karena implicit none membuat semua nama wajib dideklarasikan. Untuk melihat manfaatnya, berkas berikut sengaja memuat salah ketik.

fortran salah.f90
program salah
  implicit none

  integer :: jumlah

  jumlah = 5
  print *, "Jumlah:", jmlah
end program salah

Percobaan kompilasi berikut gagal, sehingga tidak ada berkas executable yang dihasilkan. Compiler menampilkan pesan error pada terminal.

bash
# mencoba mengompilasi berkas yang berisi nama belum dideklarasikan
gfortran salah.f90 -o salah
text Keluaran
salah.f90:7:27:

    7 |   print *, "Jumlah:", jmlah
      |                           1
Error: Symbol ‘jmlah’ at (1) has no IMPLICIT type; did you mean ‘jumlah’?

Pesan tersebut memuat tiga petunjuk penting. Angka salah.f90:7:27 menunjuk baris 7 kolom 27 pada berkas sumber, tepat pada posisi nama jmlah. Kalimat has no IMPLICIT type menyatakan penyebabnya, yaitu nama tersebut tidak memiliki deklarasi dan implicit typing sedang dimatikan. Compiler bahkan memberi saran perbaikan karena jmlah mirip dengan jumlah yang sudah dideklarasikan.

Pemeriksaan ini menegakkan kontrak deklarasi, yaitu kesepakatan bahwa setiap nama yang dipakai program harus dideklarasikan terlebih dahulu, dan compiler memverifikasi kontrak tersebut sebelum program dijalankan. Kesalahan ketik karenanya tertangkap pada waktu kompilasi, bukan ketika program sudah menghasilkan angka yang salah. Semakin besar program, semakin besar pula nilai pemeriksaan ini.

Ringkasan#

  • Unit program utama dibuka dengan program nama dan ditutup dengan end program nama, dengan satu pernyataan per baris pada sumber free form .f90.
  • implicit none ditulis pada setiap lingkup agar setiap variabel wajib dideklarasikan, sehingga salah ketik nama tertangkap saat kompilasi.
  • gfortran halo.f90 -o halo mengompilasi kode sumber menjadi executable bernama halo, dan ./halo menjalankannya.
  • Pesan error gfortran menyebut posisi baris dan kolom sumber, penyebabnya, dan sering kali saran perbaikannya.

Referensi#