Fortran/程式結構
較舊版本的Fortran對程式的格式有嚴格的指導方針。Fortran 90取消了此限制,並接受自由格式程式碼以及歷史固定格式程式碼。
在Fortran 90之前,原始碼遵循一個定義明確的固定格式。註釋以第一列中的“C”表示,第2-5列保留用於可選的數字語句標號,第6列中的非空格字元表示當前行是前一行的延續,第7至72列可用於程式語句。第73至80列被忽略,通常包含行序列號。不允許有空行。這種嚴格的格式是Fortran在批處理計算和穿孔卡片輸入時代開發的結果。如果程式“套牌”掉落,則使用序列號;如果將穿孔卡片放置在卡片閱讀器中並按第73-80列排序,則可以恢復程式順序。編譯器供應商為此格式提供了擴充套件,但它很少可移植(例如,將製表符解釋為6個空格)。
請注意,雖然列位置很重要,但空格字元並不重要。以下程式說明了在固定格式Fortran中使用空格字元的合法用法
C2345678901234567890
PROGRAM Z
GOTO11
11 CONTINUE
GO TO 780
780 CONTINUE
G OTO3 60
360 CONTINUE
STOP
END
雖然此程式碼在技術上是合法的,但強烈建議使用空格字元來分隔關鍵字、標籤和資料以保持可讀性。
Fortran是在ASCII字元集標準化之前開發的,傳統上Fortran程式碼都是用大寫字母編寫的。變數名限制為六個字元,但這通常由編譯器供應商擴充套件。
從Fortran 90開始,原始碼不需要固定列格式。在這種情況下,命令可以自由地從任何列開始。72列的限制也已解除。這為縮排提供了更多空間。
program test
implicit none
integer four
four = 4
write (*,*) four
end program
Fortran不區分大小寫。Fortran通常用於僅支援大寫字母的系統。事實上,語言本身被稱為FORTRAN(全部大寫)。雖然完全沒有必要,但習慣上仍使用全部大寫字母鍵入Fortran命令。這有助於區分在單色顯示器和印表機上顯示的原始碼中的關鍵字。如今,語法高亮顯示可以替代此功能。但是,它可能有助於直觀地區分舊版Fortran程式碼和現代原始碼。
在Fortran 90或更高版本中,空格字元和空行通常無關緊要。某些語句需要空格字元,例如,program、function和subroutine在語句關鍵字和程式單元識別符號之間需要空格字元。
但是,與C、C++和Java等許多其他語言不同,行分隔符“;”是可選的,因此每行程式碼都可以保持在自己的行上。但是,不建議使用命令分隔符“;”。
Fortran程式由程式單元組成。單個原始碼檔案可以包含多個程式單元,但通常將每個程式單元放在其自己的單獨原始碼檔案中。它們最基本的形式由一系列Fortran語句組成,並以end語句結束。
每個可執行程式都必須有一個主程式單元。例如,以下是一個完整的可編譯和可執行程式。
write (*,*) "Hello, world"
end
但是,使用program語句來指示它是主程式單元會更加清晰。
program main
write (*,*) "Hello, world!"
end program main
主程式分為幾個部分。第一部分應包含模組use語句。接下來是控制是否隱式型別化未宣告變數的implicit / implicit none語句。接下來是宣告部分,其中宣告變數、型別、介面和過程。然後是主程式的可執行語句。最後一部分是內部子程式,由contains語句啟動。
program main
! Use statements section
use module_name
! Implicit none statement section
implicit none
! Declarations section
integer :: a
real :: b
! Executable section
write (*,*) "Blah, blah, blah..."
end program main
程式單元也可以是子程式:它們可以是過程(函式和子例程)、塊資料、模組或子模組。
以下程式碼顯示了一個主程式和一個函式。increment函式位於主程式外部,因此需要在主程式的第4行進行宣告。
program main
implicit none
integer :: a
integer, external :: increment
a = increment(34)
write (*,*) a
end program main
function increment(input) result (output)
implicit none
integer :: output
integer :: input
output = input + 1
end function increment
但是,函式的介面仍然是隱式的。要顯式地宣告外部過程,可以使用一個介面來宣告所有外部過程的輸入和輸出。在這種情況下,主程式如下所示。
program main
implicit none
integer :: a
interface
integer function increment(input)
integer :: input
end function
end interface
a = increment(34)
write (*,*) a
end program main
內部子程式不需要顯式介面或宣告,因為它們是父程式單元的一部分。如果子程式包含在程式單元的contains部分中,則該子程式為內部子程式。
program main
implicit none
integer :: a
a = increment(34)
write (*,*) a
contains
function increment(input) result (output)
integer :: output
integer :: input
output = input + 1
end function increment
end program main