cv.cm

Pemrograman · Bahasa pemrograman

Tutorial Fortran untuk pemula

6 menit baca

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 hello
gfortran 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.

TipeContoh deklarasiCatatan
integerinteger :: count = 3Biasanya 32-bit; integer(int64) untuk 64-bit
realreal :: xBiasanya presisi tunggal
real(real64)real(real64) :: yPresisi ganda, pilihan umum untuk sains
complexcomplex :: z = (1.0, 2.0)Bilangan kompleks bawaan
logicallogical :: done = .false..true. / .false., operator .and., .or., .not.
charactercharacter(len=20) :: nameString 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 types

Akhiran _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 control

do 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 demo

Argumen 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 arrays

Array 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 parse

Membaca 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.817

Deklarasi 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.

Semua tutorial pemrograman