FortranFortran入門


備註

Fortran是一種在科學界廣泛使用的語言,因為它適用於數值計算。特別有吸引力的是其直觀的數組符號,這使得快速矢量化計算的編寫變得容易。

儘管它已經成熟,但Fortran仍在積極開發中,有許多實現,包括GNU,Intel,PGI和Cray。

版本

注意發布
FORTRAN 66 ASA首次標準化(現為ANSI) 1966年3月7日
FORTRAN 77 固定形式,歷史性 1978年4月15日
Fortran 90 自由形式,ISO標準,陣列操作 1991年6月15日
Fortran 95 純粹的元素程序 1997年6月15日
Fortran 2003 面向對象編程 2004年4月4日
Fortran 2008 聯合數組 2010-09-10

不區分大小寫

Fortran字符集中的大寫和小寫字母相同。換句話說,Fortran 不區分大小寫 。這種行為與區分大小寫的語言形成對比,例如C ++和許多其他語言。

因此,變量aA 是相同的變量。原則上,人們可以編寫如下程序

pROgrAm MYproGRaM
..
enD mYPrOgrAM
 

對於優秀的程序員來說,避免這種醜陋的選擇。

你好,世界

任何Fortran程序都必須包括end 作為最後一個語句。因此,最簡單的Fortran程序如下所示:

end
 

以下是“hello,world”程序的一些示例:

print *, "Hello, world" 
end
 

write 語句:

write(*,*) "Hello, world"
end
 

為清楚起見,現在通常使用program 語句來啟動程序並為其命名。然後, end 語句可以引用此名稱以明確它所引用的內容,並讓編譯器檢查代碼的正確性。此外,所有Fortran程序都應包含一個implicit none 語句。因此,最小的Fortran程序實際應該如下所示:

program hello
  implicit none
  write(*,*) 'Hello world!'
end program hello
 

從這一點開始,下一個合乎邏輯的步驟是如何查看hello world程序的結果。本節介紹如何在類似Linux的環境中實現這一點。我們假設您有一些shell命令的基本概念,主要是您知道如何到達shell終端。我們還假設您已經設置了fortran 環境 。使用首選的文本編輯器(記事本,記事本++,vi,vim,emacs,gedit,kate等),將上面的hello程序(複製和粘貼) hello.f90 在主目錄中名為hello.f90 的文件中。 hello.f90 是你的源文件。然後轉到命令行並導航到保存源文件的目錄(主目錄?),然後鍵入以下命令:

>gfortran -o hello hello.f90
 

您剛剛創建了hello world可執行程序。在技​​術方面,您剛編譯了您的程序。要運行它,請鍵入以下命令:

>./hello
 

您應該在shell終端上看到以下行。

> Hello world!
 

恭喜,您剛剛編寫,編譯並運行了“Hello World”程序。

安裝或設置

Fortran是一種可以使用許多供應商提供的編譯器編譯的語言。不同的編譯器可用於不同的硬件平台和操作系統。有些編譯器是免費軟件,有些可以免費使用,有些需要購買許可證。

最常見的免費Fortran編譯器是GNU Fortran或gfortran。源代碼可以從GNU獲得,作為GCC(GNU編譯器集合)的一部分。許多操作系統的二進製文件可在https://gcc.gnu.org/wiki/GFortranBinaries上找到 。 Linux發行版通常在其包管理器中包含gfortran。

可以使用其他編譯器:

在HPC-Systems上,系統提供商通常提供專門的編譯器,例如IBMCray編譯器。

所有這些編譯器都支持Fortran 95標準。 ACM Fortran論壇提供了各種編譯器對Fortran 2003狀態Fortran 2008狀態的概述,並在Fortran Wiki中提供。

二次方程

今天Fortran主要用於數值計算。這個非常簡單的例子說明了求解二次方程的基本程序結構:

program quadratic
  !a comment

  !should be present in every separate program unit
  implicit none

  real :: a, b, c
  real :: discriminant
  real :: x1, x2

  print *, "Enter the quadratic equation coefficients a, b and c:"
  read *, a, b, c

  discriminant = b**2 - 4*a*c

  if ( discriminant>0 ) then

    x1 = ( -b + sqrt(discriminant)) / (2 * a)
    x2 = ( -b - sqrt(discriminant)) / (2 * a)
    print *, "Real roots:"
    print *, x1, x2

    ! Comparison of floating point numbers for equality is often not recommended. 
    ! Here, it serves the purpose of illustrating the "else if" construct. 
  else if ( discriminant==0 ) then

    x1 = - b / (2 * a)
    print *, "Real root:"
    print *, x1
  else

    print *, "No real roots."
  end if
end program quadratic