Fortran/Hello world
簡単なFortranプログラム
編集以下は簡単なFortranのプログラムです。
- コンパイル・実行例
program hello print *, "Hello World!" end program
- 実行結果
Hello World!
Fortranは大文字と小文字を区別しないので、最初のプログラムは次のようにこともできます。
Program Hello
Print *, "Hello World!"
End Program
このプログラムでは、大文字小文字を区別されるのは、print文の引用符で囲まれた部分("Hello World!")だけです。
コンパイル・実行環境
編集上のコラムで紹介した「オンラインのコンパイル・実行環境」には、次のような特性があります。
- 長所
- ネットワーク環境とウェブブラウザーさえあればコンパイル・実行できる。
- コードの共有を URL を介してできる。
- 短所
- エディターなどの、使い慣れた開発ツールが使えない。
- 標準入力を使うプログラムの実行に向かない。
- 言語処理系の選択の幅が少ない(ない)
短所か問題になる場合は、自らコンパイル実行環境を構築することで解決する必要があります。
環境構築
編集gfortran
編集g95, flang などいくつかのオープン・ソース・ソフトウェアの Fortran 言語処理系がありますが、ここでは GNUプロジェクトのGCC(GNU Compiler Collection)のFortranフロントエンド gfortran を紹介します。
OnlineGDB でも、gfortran-11.3.0 が使われています。
- gfortran -v
Program Hello call system("gfortran -v") End Program
- 実行結果
Using built-in specs. COLLECT_GCC=gfortran COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/11/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 11.3.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-11/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-11 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-11-xKiWfi/gcc-11-11.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-11-xKiWfi/gcc-11-11.3.0/debian/tmp-gcn/usr --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-serialization=2 Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
GNU/Linux
編集ディストリビューションにより、パッケージマネージャとパッケージ体系に違いがありますが、
Debian
編集root@penguin:~# uname -a Linux penguin 6.1.60-08594-g03a802b9a072 #1 SMP PREEMPT_DYNAMIC Fri Jan 12 18:20:08 PST 2024 x86_64 GNU/Linux root@penguin:~# apt-get install gfortran-14 Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: gfortran-14-x86-64-linux-gnu libgfortran-14-dev libgfortran5 Suggested packages: gfortran-14-multilib gfortran-14-doc libcoarrays-dev The following NEW packages will be installed: gfortran-14 gfortran-14-x86-64-linux-gnu libgfortran-14-dev libgfortran5 0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. Need to get 93.1 MB of archives. After this operation, 366 MB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 https://deb.debian.org/debian trixie/main amd64 libgfortran5 amd64 14-20240201-3 [836 kB] Get:2 https://deb.debian.org/debian trixie/main amd64 libgfortran-14-dev amd64 14-20240201-3 [880 kB] Get:3 https://deb.debian.org/debian trixie/main amd64 gfortran-14-x86-64-linux-gnu amd64 14-20240201-3 [91.3 MB] Get:4 https://deb.debian.org/debian trixie/main amd64 gfortran-14 amd64 14-20240201-3 [2,688 B] Fetched 93.1 MB in 15s (6,007 kB/s) Selecting previously unselected package libgfortran5:amd64. (Reading database ... 78087 files and directories currently installed.) Preparing to unpack .../libgfortran5_14-20240201-3_amd64.deb ... Unpacking libgfortran5:amd64 (14-20240201-3) ... Selecting previously unselected package libgfortran-14-dev:amd64. Preparing to unpack .../libgfortran-14-dev_14-20240201-3_amd64.deb ... Unpacking libgfortran-14-dev:amd64 (14-20240201-3) ... Selecting previously unselected package gfortran-14-x86-64-linux-gnu. Preparing to unpack .../gfortran-14-x86-64-linux-gnu_14-20240201-3_amd64.deb ... Unpacking gfortran-14-x86-64-linux-gnu (14-20240201-3) ... Selecting previously unselected package gfortran-14. Preparing to unpack .../gfortran-14_14-20240201-3_amd64.deb ... Unpacking gfortran-14 (14-20240201-3) ... Setting up libgfortran5:amd64 (14-20240201-3) ... Setting up libgfortran-14-dev:amd64 (14-20240201-3) ... Setting up gfortran-14-x86-64-linux-gnu (14-20240201-3) ... Setting up gfortran-14 (14-20240201-3) ... Processing triggers for libc-bin (2.37-15~deb13u1) ... root@penguin:~# gfortran-14 -v Using built-in specs. COLLECT_GCC=gfortran-14 COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/14/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 14-20240201-3' --with-bugurl=file:///usr/share/doc/gcc-14/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2,rust --prefix=/usr --with-gcc-major-version-only --program-suffix=-14 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/reproducible-path/gcc-14-14-20240201/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/reproducible-path/gcc-14-14-20240201/debian/tmp-gcn/usr --enable-offload-defaulted --without-cuda-driver --enable-checking=yes,extra,rtl --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.0.1 20240131 (experimental) [master r14-8680-g2f14c0dbb78] (Debian 14-20240201-3)
Fedora Linux
編集$ sudo dnf install gfortran
Windows
編集いく通りかの方法がありますが、MSYS2環境にMinGW64の一部として、gfortran をインストールする方法を紹介します。
MSYS2/MinGW64のパッケージマネージャは、Arch Linux 由来の pacman(1) です。
- MINGW64
user@host MINGW64 ~ $ pacman -Syuu mingw32 is up to date mingw64 is up to date ucrt64 is up to date clang64 is up to date msys is up to date user@host MINGW64 ~ $ pacman -S base-devel mingw-w64-x86_64-toolchain
- プロンプトに MINGW64 があることを確認してください
- まず、パッケージシステムを最新にします(いくつか質問があるかもしれません)。
- base-devel と mingw-w64-x86_64-toolchain をインストールします。
- base-devel
- 基本的な開発用ユーティリティを集めたメタパッケージ
- asciidoc autoconf autoconf2.13 autogen automake-wrapper automake1.10 automake1.11 automake1.12 automake1.13 automake1.14 automake1.15 automake1.16 automake1.6 automake1.7 automake1.8 automake1.9 bison btyacc diffstat diffutils dos2unix file flex gawk gdb gettext gettext-devel gperf grep groff help2man texinfo texinfo-tex intltool libtool libunrar libunrar-devel unrar m4 make man-db pacman patch patchutils perl pkgconf pkgfile quilt reflex scons sed swig ttyrec wget xmlto
- mingw-w64-x86_64-toolchain
- MSYS2/MinGW64用のセルフ開発用ユーティリティを集めたメタパッケージ
- mingw-w64-x86_64-binutils mingw-w64-x86_64-crt-git mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-ada mingw-w64-x86_64-gcc-fortran mingw-w64-x86_64-gcc-libgfortran mingw-w64-x86_64-gcc-libs mingw-w64-x86_64-gcc-objc mingw-w64-x86_64-libgccjit mingw-w64-x86_64-gdb mingw-w64-x86_64-gdb-multiarch mingw-w64-x86_64-headers-git mingw-w64-x86_64-libmangle-git mingw-w64-x86_64-libwinpthread-git mingw-w64-x86_64-winpthreads-git mingw-w64-x86_64-make mingw-w64-x86_64-pkgconf mingw-w64-x86_64-tools-git mingw-w64-x86_64-winstorecompat-git
- MinGW
- GNUツールチェーンのWindows向け移植版
- 公式サイトのドメインが失効
- MinGW-w64
- MinGW のフォーク。
- 64bit/32bit両対応。
- ucrtにも対応強化中。
- clang64にも対応強化中。
- MSYS
- MinGW 上のPOSIX環境。
- POSIX環境は、Cygwin のフォーク。
- MSYS2
- MinGW-w64 上のPOSIX環境。
- POSIX環境は、Cygwin のフォーク。
今回はMSYS2をインストールして、 pacman を使ってツールチェーンを用意しました。
それぞれのソフトウェア群の開発用状況は日々変わりますので、現在(2021年8月)の状況と最新の状況は異なるかもしれません。
使い方・注意点
編集コンパイラーのバージョンの確認
編集環境が構築できたら、コンパイラーのバージョンを確認します。
- コンパイラーのバージョンの確認
$ gfortran -v
- 実行結果
user@hostname MINGW64 ~ Using built-in specs. COLLECT_GCC=C:\msys64\mingw64\bin\gfortran.exe COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../gcc-10.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev5, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --with-boot-ldflags='-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc' 'LDFLAGS_FOR_TARGET=-pipe -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high' --enable-linker-plugin-flags='LDFLAGS=-static-libstdc++\ -static-libgcc\ -pipe\ -Wl,--dynamicbase,--high-entropy-va,--nxcompat,--default-image-base-high\ -Wl,--stack,12582912' Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 10.3.0 (Rev5, Built by MSYS2 project) user@hostname MINGW64 ~ $
上の例は、Windows 11 上の MSYS2 / MinGW64 上の、gfortran-10.3.0です。環境によって gfortran のコマンド名に prefix や suffix か付く場合があります。
例えば、FreeBSDでは複数のバージョンのGCCパッケージが共存できるようバージョンごとにsuffixが付き gfortran12 の様なコマンド名になります。
コンパイルテスト
編集テキストエディタなどで hello.f90 を用意し、
- hello.f90
Program Hello Print *, "Hello World!" End Program
コマンドラインから、
gfortran hello.f90 -o hello
とすると、ソースコード hello.f90 から 実行形式 hello をコンパイルします(WinowsやOpenVMSでは、 .EXE の様な拡張子が暗黙に追加されるかもしれません)
gfortran ではデフォルトでFORTRAN 77規格を使用します(FORTRAN 77標準で使用されている固定形式のフォーマットが要求される)。
このため、自由形式のフォーマットを有効にするには、ソースファイルの拡張子を .f90
(またはそれ以降の規格)のにして、コンパイラが希望する規格を自動的に推測できるようにしなければなりません。ほかにも、コマンドラインから -ffree-form
オプションをコンパイラに渡すことでソースファイルの拡張子が .f
でも自由形式のフォーマットを有効にすることができます。
(フリーフォーム記法の)Fortranの文法上はインデント(字下げ)は不要です。つまり
program hello print *,"Hello World!" end program
のように記述しても実行可能です。しかし、インデントをしない書き方は、可読性が下がるので、あまり推奨できません。