Fortran adalah bahasa pemrograman yang dirancang untuk komputasi numerik, yakni perhitungan berskala besar atas data bilangan, dan bahasa ini masih dikembangkan hingga sekarang. Topik ini membahas asal-usul bahasa tersebut, tiga ciri teknis yang membedakannya dari bahasa serbaguna (general-purpose), serta kedudukannya pada komputasi berkinerja tinggi. Satu program kecil disertakan dan dijalankan sungguhan, sehingga klaim tentang perilaku bahasa pada topik ini dapat diuji ulang. Setelah topik ini selesai dibaca, lingkup bahasa yang dipelajari pada seluruh jalur ini juga menjadi jelas.
Bahasa yang lahir dari kebutuhan sains#
Fortran pertama kali diperkenalkan pada tahun 1957 oleh tim yang dipimpin John Backus di IBM. Namanya berasal dari FORmula TRANslation, yakni penerjemahan rumus matematika, dan tujuan awalnya adalah memungkinkan ilmuwan menulis persamaan dalam bentuk yang mendekati notasi matematisnya, bukan sebagai deretan instruksi mesin. Fortran termasuk bahasa pemrograman generasi awal yang digunakan secara luas, dan penggunanya terkonsentrasi pada bidang sains serta teknik.
Perkembangan bahasa ini dijaga oleh proses standardisasi, bukan oleh satu vendor tunggal. Badan standar internasionalnya adalah WG5 yang memutuskan arah dan penerbitan standar Fortran, sedangkan komite J3 di Amerika Serikat menjadi perumus teknis utama standar tersebut. Standar ditetapkan melalui ISO dengan nomor ISO/IEC 1539, dan revisi terbarunya diterbitkan pada tahun 2023. Dengan demikian, bahasa ini masih berkembang dan bukan peninggalan yang berhenti dikembangkan. Perjalanan revisinya dirangkum pada topik tentang standar di modul ini.
Array sebagai kesatuan kerja#
Ciri yang paling menentukan Fortran adalah kedudukan array, yakni susunan nilai berdimensi seperti vektor dan matriks, sebagai unit kerja utama. Operasi aritmetika dapat ditulis atas nama array utuh tanpa perulangan eksplisit, misalnya c = a + b untuk dua array berisi lima elemen. Kompiler yang menerjemahkan pernyataan itu menentukan urutan iterasinya dan bebas melakukan vektorisasi, yaitu menjalankan satu instruksi atas banyak elemen sekaligus, sehingga kode tetap ringkas tanpa mengorbankan performa. Gaya ini membuat kode program lebih dekat dengan bentuk matematisnya karena persamaan vektor dapat ditulis hampir baris demi baris.
Program berikut menunjukkan pernyataan array utuh beserta fungsi reduksi sum, yakni fungsi yang menjumlahkan seluruh elemen arraynya, dalam satu berkas utuh. Program dikompilasi dengan gfortran, lalu dijalankan, dan blok berjudul Keluaran di bawah kode memuat keluaran asli dari eksekusi tersebut.
program operasi_array
implicit none
real :: a(5) = [1.0, 2.0, 3.0, 4.0, 5.0]
real :: b(5) = [10.0, 20.0, 30.0, 40.0, 50.0]
real :: c(5)
c = a + b
print *, "c = ", c
print *, "jumlah elemen c = ", sum(c)
end program operasi_array# mengompilasi program dari direktori topik
gfortran operasi-array.f90 -o operasi-array
# menjalankan program hasil kompilasi
./operasi-array c = 11.0000000 22.0000000 33.0000000 44.0000000 55.0000000
jumlah elemen c = 165.000000Setiap elemen c memuat jumlah elemen a dan b pada posisi yang sama, dan kelima nilai itu dihitung tanpa satu pun perulangan yang ditulis manual. Pola yang sama berlaku untuk operasi yang lebih kompleks, misalnya sin(a) menghitung sinus untuk semua elemen a sekaligus. Diagram berikut memvisualisasikan pernyataan penugasan c = a + b yang baru dijalankan.
Kontrak yang diperiksa kompiler#
Fortran adalah bahasa kompilasi dengan deklarasi yang ketat, dan rangkaian aturan itu bekerja seperti kontrak antara kode dan kompiler. Pada kode modern, pernyataan implicit none menonaktifkan deklarasi otomatis dan mewajibkan setiap variabel dideklarasikan terlebih dahulu, sehingga salah ketik pada nama variabel terdeteksi pada waktu kompilasi. Antarmuka prosedur turut diperiksa, yaitu jumlah, urutan, dan tipe argumen dicocokkan kompiler terhadap deklarasi prosedurnya. Kesalahan pada kontrak tersebut muncul sebagai pesan error saat kompilasi, sehingga tidak berlanjut menjadi perilaku tak terduga saat program berjalan.
Arah aliran data pada setiap argumen prosedur dinyatakan dengan atribut intent. Fragmen berikut memperlihatkan pola deklarasi yang lazim ditemukan pada kode modern.
! tidak-dijalankan
subroutine rata_rata(x, n, hasil)
integer, intent(in) :: n
real, intent(in) :: x(n)
real, intent(out) :: hasil
hasil = sum(x) / real(n)
end subroutine rata_rataDeklarasi intent(in) menandai x dan n sebagai masukan yang tidak boleh diubah di dalam prosedur, sedangkan intent(out) menandai hasil sebagai keluaran prosedur. Kompiler menegakkan kontrak itu, misalnya penugasan terhadap n di dalam prosedur ditolak pada waktu kompilasi. Pemeriksaan serupa dikenal sebagai pemeriksaan tipe statis (static type checking) pada bahasa lain, dan pada Fortran aturan semacam itu sudah melekat sejak lama.
Paralelisme di dalam bahasa#
Komputasi modern berjalan pada prosesor dengan banyak inti, dan Fortran menyediakan sarana paralelisme di dalam bahasanya sendiri. Konstruksi do concurrent menyatakan perulangan yang iterasinya tidak saling bergantung, sehingga eksekusinya dapat berjalan secara berurutan maupun paralel, sedangkan model coarray menyediakan paralelisme antar proses melalui sintaks tanda kurung siku pada deklarasi array. Kompiler mengetahui makna kedua konstruksi tersebut, sehingga pemeriksaan dan pengoptimalan dilakukan pada level yang sama dengan kode serial.
Selain sarana bawaan, banyak kode Fortran menggunakan direktif OpenMP, yaitu anotasi yang ditulis sebagai komentar dan diolah kompiler yang mendukungnya untuk membentuk region paralel. gfortran mendukung OpenMP melalui opsi kompilasi tersendiri. Karena direktifnya berbentuk komentar biasa, kode yang memuatnya tetap dapat dikompilasi oleh kompiler yang tidak mengenal OpenMP. Kombinasi array utuh dan konstruksi paralel inilah yang menjaga relevansi bahasa ini pada perangkat keras yang jumlah intinya terus bertambah.
Kedudukan pada komputasi berkinerja tinggi#
Komputasi berkinerja tinggi (high-performance computing, HPC) adalah praktik menjalankan simulasi berskala besar pada superkomputer, misalnya prediksi cuaca, dinamika fluida komputasional (computational fluid dynamics, CFD), dan perhitungan kimia kuantum. Banyak program pada ranah tersebut ditulis dalam Fortran dan dipelihara selama beberapa dekade. Pilihan itu bukan sekadar warisan, karena basis kode yang kebenaran numeriknya sudah teruji menjadi aset yang biaya penulisan ulangnya sangat tinggi.
Contoh yang dapat dirujuk secara terbuka antara lain model cuaca WRF yang dikembangkan bersama oleh lembaga penelitian atmosfer di Amerika Serikat, serta pustaka numerik BLAS dan LAPACK yang ditulis dalam Fortran dan menjadi fondasi banyak perangkat lunak ilmiah. Ranah-ranah tersebut, dari prediksi cuaca hingga kimia kuantum, berbagi pola yang sama, yaitu operasi array besar yang dieksekusi berulang kali, dan pola inilah kekuatan utama bahasa ini. Dari sudut pandang tersebut, Fortran bukan bahasa museum, melainkan bahasa produksi pada salah satu bidang komputasi yang paling menuntut performa.
Ringkasan#
- Fortran adalah bahasa kompilasi untuk komputasi numerik yang standar terbarunya diterbitkan pada 2023 dan dijaga oleh WG5 bersama J3.
- Operasi array utuh, antarmuka yang diperiksa kompiler, dan sarana paralel seperti
do concurrentserta coarray merupakan tiga ciri teknis utamanya. - Bahasa ini tetap digunakan pada komputasi berkinerja tinggi karena basis kode numeriknya teruji selama dekade dan dipelihara secara berkelanjutan.
Referensi#
- Learn: tutorial resmi Fortran — fortran-lang — Kumpulan tutorial resmi komunitas Fortran yang menjadi rujukan fitur bahasa pada jalur ini.
- The GNU Fortran Compiler — GNU Project — Manual gfortran, kompiler yang digunakan untuk menjalankan seluruh contoh kode pada jalur ini.