Pemrograman · Bahasa pemrograman
Tutorial Fortran untuk pemula
Jawaban singkat
Fortran adalah bahasa terkompilasi bertipe statis yang dibuat untuk komputasi numerik dan ilmiah. Fortran modern (Fortran 90 dan standar sesudahnya) punya source free-form, modul, array dinamis, dan operasi seluruh array yang kuat, dan compiler mengubahnya menjadi kode mesin yang sangat cepat. Pasang compiler gfortran yang gratis, simpan kode dalam file .f90, dan build dengan gfortran hello.f90 -o hello.
Apa itu Fortran dan siapa yang memakainya
Fortran ("formula translation") dikembangkan di IBM oleh tim yang dipimpin John Backus pada 1950-an dan merupakan salah satu bahasa pemrograman tertua yang masih aktif dipakai. Fortran distandarkan oleh ISO; revisi besarnya meliputi Fortran 90, 95, 2003, 2008, 2018, dan 2023. Gaya fixed-form lama (FORTRAN 77 huruf kapital, kode dimulai di kolom 7) masih dikompilasi, tetapi kode baru memakai sintaks free-form yang ditampilkan di sini.
Fortran dipakai di tempat yang memerlukan perhitungan numerik berat: model cuaca dan iklim, computational fluid dynamics, simulasi fisika dan kimia, dan banyak program yang berjalan di superkomputer. Versi referensi library aljabar linear BLAS dan LAPACK, yang dipakai di balik tool seperti NumPy dan MATLAB, ditulis dalam Fortran.
Memasang compiler dan menjalankan Hello, world
gfortran, bagian dari GCC, gratis dan tersedia di Linux (paket gfortran), macOS (Homebrew gcc), dan Windows (MSYS2 atau WSL). ifx dari Intel dan LLVM Flang adalah compiler lainnya. Fortran Package Manager (fpm) dapat membuat dan membangun proyek.
program hello
implicit none
print *, "Hello, world!"
end program hellogfortran hello.f90 -o hello
./hello
# Hello, world!print * memakai list-directed output, yang memilihkan spasi untuk Anda (perhatikan spasi di depan). Fortran tidak peka huruf besar/kecil: PRINT, Print, dan print sama saja.
Variabel dan tipe dasar
Semua deklarasi berada di bagian atas sebuah program unit, sebelum statement yang dieksekusi. Selalu tulis implicit none: tanpanya, nama yang tidak dideklarasikan dan diawali huruf I sampai N diam-diam menjadi integer dan yang lain menjadi real.
| Tipe | Contoh deklarasi | Catatan |
|---|---|---|
| integer | integer :: count = 3 | Biasanya 32-bit; integer(int64) untuk 64-bit |
| real | real :: x | Biasanya presisi tunggal |
| real(real64) | real(real64) :: y | Presisi ganda, pilihan umum untuk sains |
| complex | complex :: z = (1.0, 2.0) | Bilangan kompleks bawaan |
| logical | logical :: done = .false. | .true. / .false., operator .and., .or., .not. |
| character | character(len=20) :: name | String berpanjang tetap, diisi spasi |
program types
use, intrinsic :: iso_fortran_env, only: int64, real64
implicit none
integer :: count = 3
integer(int64) :: big = 9000000000_int64
real(real64) :: third
logical :: done = .false.
character(len=:), allocatable :: name
third = 1.0_real64 / 3.0_real64
name = "Ana"
print *, count, big, third, done, name
end program typesAkhiran _real64 menetapkan kind (presisi) sebuah literal. Tanpanya, 1.0 adalah konstanta presisi tunggal, yang kehilangan digit saat di-assign ke variabel presisi ganda.
Alur kontrol
program control
implicit none
integer :: i, total, score
total = 0
do i = 1, 10
if (mod(i, 2) == 0) cycle ! skip even numbers
total = total + i
end do
print *, "sum of odd numbers:", total ! 25
score = 85
if (score >= 90) then
print *, "A"
else if (score >= 80) then
print *, "B"
else
print *, "C"
end if
select case (score)
case (90:)
print *, "excellent"
case (80:89)
print *, "good"
case default
print *, "keep going"
end select
end program controldo i = 1, 10 menyertakan kedua ujung, dan nilai ketiga yang opsional menetapkan langkah (do i = 10, 1, -1). cycle melompat ke iterasi berikutnya dan exit keluar dari perulangan. do while (condition) dan do biasa dengan exit juga tersedia. Komentar diawali dengan !.
Fungsi, subroutine, dan modul
Fortran punya dua jenis prosedur: function mengembalikan nilai dan dipakai dalam ekspresi; subroutine dipanggil dengan call dan mengembalikan hasil lewat argumennya. Taruh prosedur dalam modul agar compiler dapat memeriksa setiap pemanggilan.
module geometry
implicit none
contains
function circle_area(r) result(a)
real, intent(in) :: r
real :: a
a = 3.14159 * r**2
end function circle_area
subroutine swap(a, b)
integer, intent(inout) :: a, b
integer :: tmp
tmp = a
a = b
b = tmp
end subroutine swap
end module geometry
program demo
use geometry
implicit none
integer :: x, y
x = 1
y = 2
print *, circle_area(2.0) ! about 12.566
call swap(x, y)
print *, x, y ! 2 1
end program demoArgumen diteruskan secara reference, sehingga prosedur dapat mengubah variabel milik pemanggil. intent(in), intent(out), dan intent(inout) mendokumentasikan dan menegakkan apa yang boleh dilakukan setiap argumen. ** adalah operator pangkat.
Array: fitur khas Fortran
Array adalah inti Fortran. Indeks dimulai dari 1 secara default (batas bawah apa pun diizinkan), aritmetika bekerja pada seluruh array tanpa perulangan, slice memakai a(start:end), dan banyak fungsi intrinsic beroperasi langsung pada array.
program arrays
implicit none
integer :: i
real :: a(5), b(5)
real, allocatable :: c(:)
integer :: m(2, 3)
a = [(real(i), i = 1, 5)] ! 1.0 2.0 3.0 4.0 5.0
b = 2.0 * a + 1.0 ! whole-array arithmetic
print *, b(2:4) ! 5.0 7.0 9.0
print *, sum(a), maxval(b) ! 15.0 11.0
allocate(c(10))
c = 0.0
print *, size(c) ! 10
deallocate(c)
m = reshape([1, 2, 3, 4, 5, 6], [2, 3])
print *, m(2, 1) ! 2 (column-major order)
end program arraysArray multidimensi disimpan dalam urutan column-major: indeks pertama berubah paling cepat di memori, kebalikan dari C. Demi kecepatan, buat perulangan terdalam berjalan pada indeks pertama. Fungsi intrinsic berguna lainnya adalah matmul, dot_product, transpose, minval, dan count. Fortran modern juga menawarkan perulangan do concurrent dan coarray untuk program paralel.
Penanganan error
Fortran tidak punya exception. Statement yang bisa gagal menerima argumen status: iostat untuk input dan output, stat untuk allocate. Periksa nilainya dan bereaksilah; jika dihilangkan, error menghentikan program. error stop mengakhiri program dengan error.
program parse
implicit none
character(len=20) :: text
integer :: n, ios
text = "abc"
read(text, *, iostat=ios) n
if (ios /= 0) then
print *, "not a number: ", trim(text)
else
print *, "n =", n
end if
end program parseMembaca dari variabel character, seperti di atas, disebut internal read dan merupakan cara lazim mengonversi string menjadi angka.
Program lengkap kecil: rata-rata dan simpangan baku
module stats
implicit none
integer, parameter :: dp = kind(1.0d0)
contains
pure function mean(x) result(m)
real(dp), intent(in) :: x(:)
real(dp) :: m
m = sum(x) / size(x)
end function mean
pure function std_dev(x) result(s)
real(dp), intent(in) :: x(:)
real(dp) :: s
s = sqrt(sum((x - mean(x))**2) / (size(x) - 1))
end function std_dev
end module stats
program main
use stats
implicit none
real(dp) :: values(5)
values = [2.0_dp, 4.0_dp, 4.0_dp, 5.0_dp, 7.0_dp]
print '(a, f6.3)', "mean = ", mean(values)
print '(a, f6.3)', "std dev = ", std_dev(values)
end program main
! mean = 4.400
! std dev = 1.817Deklarasi x(:) adalah assumed-shape array, sehingga fungsi menerima array dengan panjang berapa pun. pure menjanjikan bahwa fungsi tidak punya efek samping. Format '(a, f6.3)' mencetak string diikuti bilangan real selebar 6 karakter dengan 3 desimal.
Langkah selanjutnya
- fortran-lang.org: bagian Learn dengan tutorial quickstart dan praktik terbaik.
- Manual GNU Fortran (gfortran) untuk opsi compiler dan prosedur intrinsic.
- Coba Fortran Package Manager (fpm) untuk membuat proyek dan memakai library seperti Fortran standard library (stdlib).
- Kompilasi dengan peringatan dan pemeriksaan runtime selama belajar, misalnya
gfortran -Wall -fcheck=all.
FAQ
Apakah Fortran masih dipakai sekarang?
Ya. Fortran masih banyak dipakai dalam komputasi ilmiah dan komputasi performa tinggi, terutama untuk simulasi iklim, cuaca, fisika, dan rekayasa, dan standar bahasanya masih terus diperbarui.
Apa perbedaan file .f dan .f90?
Menurut konvensi, file .f dan .for memakai tata letak fixed-form lama dari FORTRAN 77, di mana kolom berpengaruh, sedangkan file .f90 memakai source free-form. Ekstensi .f90 dipakai untuk kode free-form dari standar modern mana pun, bukan hanya Fortran 90.
Mengapa Fortran cepat?
Bahasa ini dirancang untuk pekerjaan numerik: array sudah bawaan, aturan aliasing memungkinkan compiler mengoptimalkan secara agresif, dan puluhan tahun pekerjaan compiler diarahkan padanya. C atau C++ yang ditulis dengan baik dapat mencapai kecepatan serupa.
Apakah array Fortran dimulai dari 0 atau 1?
Dimulai dari 1 secara default, tetapi Anda dapat memilih batas bawah apa pun, misalnya real :: a(0:9) mendeklarasikan sepuluh elemen dengan indeks 0 sampai 9.