Fortran
Jednostki programowe i układ plików
Szukaj…
Programy Fortran
Kompletny program Fortran składa się z wielu różnych jednostek programu. Jednostki programu to:
- główny program
- podprogram funkcji lub podprogramu
- moduł lub submoduł
- blokować program danych
Program główny i niektóre podprogramy procedur (funkcji lub podprogramów) mogą być dostarczane w języku innym niż Fortran. Na przykład program główny C może wywoływać funkcję zdefiniowaną przez podprogram funkcji Fortran lub program główny Fortran może wywoływać procedurę zdefiniowaną przez C.
Te jednostki programu Fortran mogą być oddzielnymi plikami lub pojedynczymi plikami.
Na przykład możemy zobaczyć dwa pliki:
prog.f90
program main
use mod
end program main
mod.f90
module mod
end module mod
Kompilator (poprawnie wywołany) będzie mógł powiązać program główny z modułem.
Pojedynczy plik może zawierać wiele jednostek programu
wszystko. f90
module mod
end module mod
program prog
use mod
end program prog
function f()
end function f()
W tym przypadku należy jednak zauważyć, że funkcja f
jest nadal funkcją zewnętrzną, jeśli chodzi o główny program i moduł. Moduł będzie jednak dostępny dla programu głównego.
Reguły zakresu pisania dotyczą każdej jednostki programu, a nie pliku, w którym są zawarte. Na przykład, jeśli chcemy, aby każda jednostka zakresu nie miała żadnego domyślnego wpisywania, powyższy plik należy zapisać jako
module mod
implicit none
end module mod
program prog
use mod
implicit none
end program prog
function f()
implicit none
<type> f
end function f
Moduły i submoduły
Moduły są udokumentowane w innym miejscu .
Kompilatory często generują tak zwane pliki modułów : zwykle plik zawierający
module my_module
end module
spowoduje my_module.mod
przez kompilator pliku o nazwie my_module.mod
. W takich przypadkach, aby moduł był dostępny dla jednostki programowej, plik modułu musi być widoczny przed przetworzeniem tej drugiej jednostki programowej.
Procedury zewnętrzne
Procedura zewnętrzna to taka, która jest zdefiniowana poza inną jednostką programu lub za pomocą środków innych niż Fortran.
Funkcja zawarta w pliku takim jak
integer function f()
implicit none
end function f
jest funkcją zewnętrzną.
W przypadku procedur zewnętrznych ich istnienie można zadeklarować za pomocą bloku interfejsu (w celu uzyskania jawnego interfejsu)
program prog
implicit none
interface
integer function f()
end interface
end program prog
lub poprzez oświadczenie deklarujące, aby zapewnić domyślny interfejs
program prog
implicit none
integer, external :: f
end program prog
lub nawet
program prog
implicit none
integer f
external f
end program prog
external
atrybut nie jest konieczny:
program prog
implicit none
integer i
integer f
i = f() ! f is now an external function
end program prog
Blokuj jednostki programu danych
Jednostki programu danych bloku to jednostki programu, które podają wartości początkowe dla obiektów we wspólnych blokach. Zostały one celowo tutaj nieudokumentowane i zostaną uwzględnione w dokumentacji historycznych elementów Fortran.
Podprogramy wewnętrzne
Jednostka programu, która nie jest wewnętrznym podprogramem, może zawierać inne jednostki programu, zwane wewnętrznymi podprogramami .
program prog
implicit none
contains
function f()
end function f
subroutine g()
end subroutine g
end program
Taki wewnętrzny podprogram ma wiele funkcji:
- istnieje powiązanie hosta między podmiotami w podprogramie i programie zewnętrznym
- niejawne reguły pisania są dziedziczone (
implicit none
obowiązuje wf
powyżej) - podprogramy wewnętrzne mają jawny interfejs dostępny na hoście
Podprogramy modułów i podprogramy zewnętrzne mogą mieć podprogramy wewnętrzne, takie jak
module mod
implicit none
contains
function f()
contains
subroutine s()
end subroutine s
end function f
end module mod
Pliki kodu źródłowego
Plik kodu źródłowego to (ogólnie) zwykły plik tekstowy, który jest przetwarzany przez kompilator. Plik kodu źródłowego może zawierać maksymalnie jeden program główny oraz dowolną liczbę modułów i podprogramów zewnętrznych. Na przykład plik kodu źródłowego może zawierać następujące elementy
module mod1
end module mod1
module mod2
end module mod2
function func1() ! An external function
end function func1
subroutine sub1() ! An external subroutine
end subroutine sub1
program prog ! The main program starts here...
end program prog ! ... and ends here
function func2() ! An external function
end function func2
Powinniśmy tutaj przypomnieć, że chociaż podprogramy zewnętrzne są podane w tym samym pliku co moduły i program główny, podprogramy zewnętrzne nie są wyraźnie znane żadnym innym komponentom.
Alternatywnie, poszczególne składniki mogą być rozłożone na wiele plików, a nawet kompilowane w różnych momentach. Należy przeczytać dokumentację kompilatora dotyczącą łączenia wielu plików w jeden program.
Pojedynczy plik kodu źródłowego może zawierać kod źródłowy o stałej lub swobodnej formie: nie można ich mieszać, chociaż wiele plików łączonych w czasie kompilacji może mieć różne style.
Aby wskazać kompilatorowi formularz źródłowy, istnieją na ogół dwie opcje:
- wybór sufiksu nazwy pliku
- użycie flag kompilatora
Flagę czasu kompilacji wskazującą źródło o stałej lub swobodnej formie można znaleźć w dokumentacji kompilatora.
Znaczące przyrostki nazw plików znajdują się również w dokumentacji kompilatora, ale ogólną zasadą jest, że plik o nazwie file.f90
zawiera źródło w file.f
formie, podczas gdy plik file.f
zawiera źródło o stałej formie.
Użycie sufiksu .f90
do wskazania dowolnego źródła (które zostało wprowadzone w standardzie Fortran 90) często kusi programistę do użycia sufiksu do wskazania standardu językowego, z którym zgodny jest kod źródłowy. Na przykład możemy zobaczyć pliki z przyrostkami .f03
lub .f08
. Zasadniczo należy tego unikać: większość źródeł Fortran 2003 jest również zgodna z Fortran 77, Fortran 90/5 i Fortran 2008. Ponadto, wiele komilatorów nie uwzględnia automatycznie takich sufiksów.
Kompilatory często oferują także wbudowany preprocesor kodu (zazwyczaj oparty na cpp). Ponownie, flaga czasu kompilacji może być użyta do wskazania, że preprocesor powinien zostać uruchomiony przed kompilacją, ale sufiks pliku kodu źródłowego może również wskazywać na takie wymagania dotyczące przetwarzania wstępnego.
Dla przypadków wrażliwych systemów plików plik file.F
jest często traktowana jako plik źródłowy stałym forma zostać wstępnie przetworzone i file.F90
się plik źródłowy free-form zostać wstępnie przetworzone. Tak jak poprzednio, należy zapoznać się z dokumentacją kompilatora pod kątem takich flag i sufiksów plików.