Fortranの良いところと悪いところ

#前書き

yukicoderの問題を解き始めて２週間経ちました

やっていて思ったのが、Fortranはいにしえの言語なんだなぁということ

yukicoderは他者の解答を閲覧できるのですが、Fortranで検索をかけて出てくるのは一人という状態でした

正直、今でも現役でFortran触っているよ！という人はほとんどいないと思います

それこそ私の専攻する分野とか、一部の制御系くらいのものだと思います

だからどーした、という話ではありますが

で、本題と行きましょうかネ

基本的に誰かに読まれることを目的に書いておらず、メモ書き・日記帳としてQiitaを利用してきましたが、

プログラミングの勉強を本格的に初めて半年ほど経った記念に少しはためになる話でもしようかと思います

対象は私のようなプログラミング初心者としております

##ここがすごいヨ、Fortran

Fortranは非常に学習のしやすいプログラム言語だと思います

どういう所が学習しやすいかといえば、非常に書きやすいところが挙げられます

正確に言うのならば、書きやすいというより見やすい言語となっています

変数の型の指定は最初に行うのでより分かりやすく、修正も楽です

~~裏返すと直感的に書くのには向いていない~~　

私がメインで書いているFortran90で大きく書き方が変わったのも理由の一つだと思います

フォートランという言語には大きく分けて二つの種類、FORTRANとFortranがあります

主にFORTRANはFORTRAN77以前を指し、FortranはFortran90以降を指します

この二つの大きな差異というのが、自由形式と固定形式という書き方の違いです

固定形式がこんな感じになります

```1.f
* ----- Mondai 1.4 -----
      k = 1
      n = 2
      m = 3
      write(*,*) k,m,n
      read (*,*) k,m,n
      write(*,*) k,m,n
      k = m + n
      write(*,*) k,m,n
      end
```
一行に書けるバイト数は決まっているうえに、その中に頭部分の空の部分も含めます

と、書けば非常に複雑に聞こえるのですが、

よほどのことがない限り制限をオーバーすることはないです

今でもこの形式の方が見やすいので書きたくなる衝動にかられます

ただこの形式の難点はdo構文、ループの構文が非常に厄介です

```2.f
* --------------------------- Reidai4.1 ---------
      open(10,file='1.dat')
      read(10,*)n
      sumH = 0
      do 100 i=1,n
         read(10,*) H
         sumH = sumH + H
 100  continue
      close(10)
      ave = sumH/n
      write(*,*)sumH,ave
      end
```
これはまだ一つだけなので良いのですが、

入れ子にする場合も横の100みたいなのが必要なので、余計に見づらくなります

などなど面倒なことが多いのですが、自由形式に変えてしまえば何も気にする必要がありません

せいぜい知識としてあれば十分だと思います

このFortranの非常に面白いところが関数やサブルーチンの部分です

それこそ普通に数式を書く感覚で書けます

例えば、シンプソンの台形公式だと

```3.f90
program Simpson
implicit double precision (a-h,o-z)
integer,parameter    :: p=0.1
integer,parameter    :: ns=4
integer,dimension(ns):: Ndata =(/4,10,30,100/)
integer,parameter    :: qs=3
real,dimension(qs)   :: Qdata =(/0.5,1.1,3.0/)

f(x) = (x**1.5)-x+2.25

write(*,*) "Sana = (2/5)x^2.5 - (1/2)x^2 + 2.25x"
x0=p
do m=1,qs
   x1=Qdata(m)
   Sana = (8*(x1-x0)**(3.0/2.0)-10*(x1-x0)+45)*(x1-x0)/20
   write(*,*)'q=',x1,'Sana=',Sana
   write(*,*)'n   ', 'Snum   ', '   (Sn-Sa)/Sa'
   do ni=1,ns
      n = Ndata(ni)
      h = (x1-x0)/n
      Sbdl=0
      do i=1,n-1
          Sbdl = Sbdl + f(x0+i*h)
      end do
      Snum = (h/2)*(f(x0) + 2*Sbdl + f(x1))
      write(*,*) n, Snum, (Snum-Sana)/Sana
   end do
end do
end program Simpson 
```
普通にf(x)と書いていますが、別に問題ないです

これを文関数というのですが、他にも男女の平均身長に関するプログラムだと

```4.f90
! 主プログラム
program  Mean_Hight
real,allocatable :: Hm(:),Hw(:) !HmとHwは実数型の何とか行何とか列の行列
real Mean

read(*,*) m,n
allocate (Hm(m),Hw(n)) !配列の指定 m行1列の行列Hmとn行1列の行列Hwを定義
read(*,*) Hm !順次Hm行列に格納されていく
read(*,*) Hw

H_m=Mean(m,Hm) !文関数定義文
write(*,*) ' Mean_m =', H_m
H_w=Mean(n,Hw)
write(*,*) ' Mean_w =', H_w

do i=1,m
   Dif_m=H_m - Hm(i)
   write(*,*) 'Dif_m =', Dif_m
end do

do i=1,n
   Dif_w=H_w - Hw(i)
   write(*,*) 'Dif_w =', Dif_w
end do
end program Mean_Hight

! 関数副プログラム
function Mean(n,H) !実引数と仮引数は統一してもいいので、今回のように中途半端にしても問題はない。結局、文字が変わっただけで数値は何の変化もしていない。ただ別々にするのが基本。
   real  Mean !副プログラムと主プログラムは別物なので毎回同じ指定を繰り返す必要がある
   dimension H(n) !実引数Hmが行列なので、仮引数Hも統一する
   sumH=0
   do i=1,n
      sumH=sumH+H(i)
   end do
   Mean=sumH/n
   return
end function Mean
```
こんな感じで書いたりもできます

3.f90は普通に関数ですが、4.f90は副関数となっています

この違いというのはFortranにおいて副プログラムが他言語におけるclassだと考えればいいと思います

と言うと、Fortranにあるclassはどうするの？となると思いますが、

Fortran90に関して言えばclassというのが無いです

というのも、オブジェクト指向がこのFortran90に関しては実装されて無いです

Fortran2003から導入されました

Fortran90は関数型ということになるのでしょうね

やべぇ規模のプログラムを作るわけでもないのなら、副プログラムで十分だと思います

はじめての学習という面で行けばオブジェクト云々より、副プログラムで考えた方が良いかと思います

副云々で限界を感じたらオブジェクト指向へ、が一番ベターなのかな、と思っています

（　＾ω＾）・・・オブジェクト指向と関数型に関しては色々な見方があるので、一つの意見と捉えてください

こんな感じで非常に勉強しやすくわかりやすいです

その上、言語としてあらかた完成しているので、

余程出版の古いものではない限りは必要な費用として本一冊買えば十分です

いや態々買わなくても図書館に行けば腐るほどあると思います

私が今も学習に利用しているのは

**新井親夫氏の『FORTRAN90入門: 基礎から再帰手続きまで』**　ですね

問題の部分に色々と難点はありますが、私ができている事くらいなら一か月くらいでできると思いますヨ

むしろ私よりできるようになって色々教えてください

![おねがい.png](https://qiita-image-store.s3.amazonaws.com/0/293790/beda5156-1285-a082-00ba-d2548de4b254.png)


##ここはやべぇヨ、Fortran

と、ここで終わればイイハナシダーなんですが、そうは問屋が卸しません

~~良い所の裏を返せば、それが全てFortranの悪い所~~

正直Fortranの位置付けとしては、

**【右も左も分からないプログラム初心者に贈るプログラム"言語"学習への入門】**

これに尽きると思います

私は一番最初にpythonから勉強を始めました。

paizaの無料レッスンやChekiOで問題を解いていたんですが、一つの壁にぶち当たりました

私は言語の学習がしたかったんですよ

私はそのモジュールがどうやって動いているのか、どうすればモジュールを使わずに書けるのか、

そういうもっと根源的な部分が知りたかったのです

で、本を探していたんですがそういった本はあんまりないんですよ

当たり前の話、何故pythonがここまで流行るのかを考えればわかる話なんですけど！

そうやって学習意欲が無くなっていって、python自体は関数の引数でハジケました

selfって何？どうしてselfじゃないといけないの？みたいな屁理屈が出始めて、リタイアですね

そのため、私は未だにpythonで関数は使えません

そうして他の言語への探求を始めたのですが、厄介だったのがpythonの書き方ですよ

pythonは誰が書いてもある程度綺麗になるようになっています

それに慣れている私はC言語とかJavaとかできませんでした

~~括弧は一行で完結するものでしょjk~~

![本日の一句.png](https://qiita-image-store.s3.amazonaws.com/0/293790/ae07a1ec-720a-92fe-b9c6-f0aee18e622d.png)

（　＾ω＾）・・・ふざけないと書いてられません

そういった経緯でFortranの学習をし始めたわけです

つまり、私のような偏屈ではない限り（Fortranの学習をする必要は）ないです

それにFortranは計算が速いから云々とか言われますけど、

私の専攻のような大規模計算以外ではその旨味は推して知るべしなので、本当に意味ないです

それにFortranできるよりpythonできた方が就職は有利だと思いますよ

~~これが20年くらい前なら話は別なんですけど・・・~~

**結論、スキルとしてプログラムの学習をするなら素直に別言語にしよう**

身も蓋もないネ

##最後
とこんな感じで8割ほど自分語りしました

やったぜ

~~ひとり○○○~~(自主規制)は気持ちええんじゃ

私は（ホモじゃ）ないです

あと最近はR言語の学習もしてます

データが処理しやすくて非常に楽しいです、R言語

次回からはyukicoderと並行してR言語についてポチポチするかもしれないです

以上！