Modul (module) adalah unit program Fortran yang mengelompokkan deklarasi variabel, konstanta, tipe, dan prosedur di bawah satu nama, lalu menyediakannya bagi unit program lain melalui pernyataan use. Modul menjadi wadah organisasi kode yang utama pada Fortran modern karena prosedur yang dideklarasikan di dalamnya otomatis memperoleh antarmuka eksplisit bagi seluruh penggunanya. Topik ini membahas struktur modul, pernyataan use beserta klausa only dan penggantian nama, kontrol akses public dan private, serta perilaku variabel modul yang nilainya bertahan sepanjang eksekusi program. Contoh disusun dalam dua berkas, yaitu modul geometri.f90 dan program utama utama.f90.
Modul sebagai unit organisasi#
Definisi modul dimulai dengan pernyataan module dan nama modulnya, dilanjutkan bagian spesifikasi yang memuat deklarasi, kemudian prosedur setelah pernyataan contains, dan diakhiri end module. Modul bukan program, sehingga tidak memiliki titik eksekusi dan tidak dapat dijalankan sendiri. Modul hanya menyediakan deklarasi dan prosedurnya kepada program, subrutin, atau modul lain yang memintanya melalui use. Modul berikut mengelompokkan dua rumus geometri lingkaran beserta penghitung pemanggilannya.
module geometri
implicit none
private
public :: luas_lingkaran, keliling_lingkaran, jumlah_pemanggilan
real, parameter, private :: pi = 3.14159265358979
integer :: jumlah_pemanggilan = 0
contains
real function luas_lingkaran(jari_jari)
implicit none
real, intent(in) :: jari_jari
jumlah_pemanggilan = jumlah_pemanggilan + 1
luas_lingkaran = pi * jari_jari * jari_jari
end function luas_lingkaran
real function keliling_lingkaran(jari_jari)
implicit none
real, intent(in) :: jari_jari
jumlah_pemanggilan = jumlah_pemanggilan + 1
keliling_lingkaran = 2.0 * pi * jari_jari
end function keliling_lingkaran
end module geometriKedua fungsi pada modul geometri dideklarasikan dengan kontrak intent, sedangkan variabel jumlah_pemanggilan diperbarui setiap kali salah satu fungsi dipanggil. Kedua fungsi menggunakan pi yang dideklarasikan sekali di bagian spesifikasi, sehingga nilai konstanta itu tidak perlu diulang di setiap prosedur. Penataan seperti ini menjadikan modul tempat yang alami untuk konstanta fisika, tipe data, dan prosedur yang saling berkaitan.
Pernyataan use dan klausa only#
Program utama berikut menggunakan modul geometri melalui pernyataan use dan dipisahkan ke dalam berkas sendiri. Pernyataan use ditempatkan sebelum implicit none, mengikuti tata letak baku bagian spesifikasi program Fortran. Perhatikan cara program ini memanggil fungsi modul dan membaca variabel modulnya tanpa deklarasi tambahan apa pun.
program utama
use geometri
implicit none
real :: r
r = 7.0
print '(a, f6.2)', 'Luas =', luas_lingkaran(r)
print '(a, f6.2)', 'Keliling =', keliling_lingkaran(r)
print '(a, f6.2)', 'Luas lagi =', luas_lingkaran(1.0)
print '(a, i2)', 'Jumlah pemanggilan prosedur =', jumlah_pemanggilan
end program utamaPernyataan use geometri di bagian paling atas program membuat seluruh entitas publik modul dapat disebut langsung dengan namanya, misalnya luas_lingkaran dan jumlah_pemanggilan. Tanpa pernyataan itu, nama-nama tersebut tidak dikenal oleh program. Klausa only membatasi entitas yang diimpor sehingga sumber setiap nama di dalam program tetap jelas, sedangkan klausa penggantian nama memberi julukan lokal bagi entitas yang namanya panjang atau bertabrakan dengan nama lain. Klausa only juga melindungi program dari perubahan modul di masa mendatang, karena entitas baru yang kelak ditambahkan ke modul tidak ikut terimpor sehingga tidak mungkin menabrak nama lokal. Pernyataan use atas modul yang sama boleh ditulis lebih dari sekali dalam satu lingkup, dan seluruh daftar entitasnya digabungkan oleh compiler.
! tidak-dijalankan
use geometri, only: luas_lingkaran
use geometri, only: hitung_luas => luas_lingkaran# mengompilasi modul lebih dahulu, kemudian program utamanya
gfortran geometri.f90 utama.f90 -o geometri-app
# menjalankan program
./geometri-appLuas =153.94
Keliling = 43.98
Luas lagi = 3.14
Jumlah pemanggilan prosedur = 3Antarmuka eksplisit otomatis dari modul#
Setiap prosedur yang terletak di dalam modul menyediakan antarmuka eksplisit kepada semua unit yang menyatakan use terhadap modul itu, tanpa deklarasi antarmuka tambahan. Antarmuka eksplisit ini memungkinkan compiler memeriksa jumlah argumen, tipe argumen, dan bentuk array pada setiap pemanggilan, sebagaimana yang terjadi pada prosedur internal. Kesalahan jumlah argumen, misalnya memanggil luas_lingkaran dengan dua argumen, ditolak compiler pada saat kompilasi karena antarmukanya lengkap.
Fitur bahasa lain juga bergantung pada antarmuka eksplisit ini, yaitu argumen dummy berbentuk diasumsikan seperti daftar(:) dan kontrak intent yang diperiksa pada titik pemanggilan. Sebaliknya, prosedur eksternal yang dikompilasi terpisah hanya menyediakan antarmuka implisit, sehingga compiler memperlakukan argumennya tanpa informasi tipe dan bentuk yang lengkap. Aturan praktisnya sederhana, yaitu kumpulkan prosedur yang saling berkaitan di dalam modul dan hindari prosedur eksternal pada kode baru.
Kontrol public dan private#
Secara bawaan, seluruh entitas modul bersifat public, artinya dapat diakses oleh setiap unit yang menyatakan use. Pernyataan private tanpa daftar membalikkan bawaan tersebut, sehingga hanya entitas yang disebut pada pernyataan public yang tersedia dari luar. Pola ini diterapkan pada modul geometri, yang hanya mengekspos dua fungsi dan satu penghitung, sedangkan konstanta pi dideklarasikan private secara eksplisit karena hanya dipakai untuk kepentingan internal modul. Alternatifnya adalah membiarkan bawaan public dan menandai entitas tertentu dengan private, dan kedua gaya itu sah asalkan konsisten dalam satu modul.
Berkas berikut mencoba membaca pi dari luar modul. Kompilasinya gagal dengan pesan yang tidak langsung menunjukkan penyebabnya.
program salah_private
use geometri
implicit none
print '(a, f6.2)', 'Pi =', pi
end program salah_private# mencoba mengakses entitas private dari luar modul
gfortran geometri.f90 salah-private.f90 -o salah-privatesalah-private.f90:5:31:
5 | print '(a, f6.2)', 'Pi =', pi
| 1
Error: Symbol ‘pi’ at (1) has no IMPLICIT typeKompilasi gagal karena entitas private tidak terlihat dari luar modul, sehingga compiler memperlakukan pi seakan-akan tidak pernah dideklarasikan dan melaporkan bahwa simbol itu tidak memiliki tipe implisit. Pesan yang tampak seperti kesalahan tipe ini sebenarnya berasal dari kontrol akses modul. Cara memperbaikinya menyesuaikan maksud, yaitu menambahkan pi ke daftar public bila konstanta itu memang untuk dipakai dari luar, atau menghapus pemanggilan tersebut bila konstanta itu memang internal.
Variabel modul dan nilainya yang bertahan#
Variabel yang dideklarasikan di bagian spesifikasi modul memiliki atribut save secara implisit, sehingga nilainya bertahan sepanjang eksekusi program dan tidak hilang antarpemanggilan prosedur. Nilai awal yang ditulis pada deklarasinya, seperti 0 pada jumlah_pemanggilan, diterapkan sebelum eksekusi program dimulai, sehingga pemanggilan pertama sudah menemukan nilainya. Variabel jumlah_pemanggilan pada modul geometri menggambarkan perilaku itu, karena nilainya bertambah pada tiga pemanggilan prosedur dan dibaca kembali di akhir program dengan hasil 3 sesuai keluaran. Variabel semacam ini berfungsi sebagai keadaan bersama (shared state) bagi seluruh pengguna modul, dan nilainya juga dapat diubah langsung oleh pemanggil bila bersifat public.
Ringkasan#
- Modul mengelompokkan deklarasi dan prosedur di bawah satu nama, dan unit lain menggunakannya melalui pernyataan
usedengan klausaonlyuntuk membatasi serta penggantian nama bila diperlukan. - Prosedur modul otomatis menyediakan antarmuka eksplisit, sehingga jumlah, tipe, dan bentuk argumen diperiksa compiler pada setiap pemanggilan.
- Pernyataan
privatemembalikkan visibilitas bawaan modul, sedangkan variabel modul bernilai tetap sepanjang eksekusi program karena atributsaveimplisitnya.
Referensi#
- Learn — Fortran Programming Language — Halaman belajar resmi komunitas Fortran yang memuat tutorial quickstart dan praktik terbaik.
- The GNU Fortran Compiler — GNU Project — Manual compiler gfortran yang memuat opsi kompilasi dan karakteristik bahasa yang didukung.