何も知らないくせに!

相手のことを理解するのは、実に大変なことではある。表面的なことだけを知って、さもしゃあしゃあと解ったふりをして、これはこういうことなんだよと言ったりすると、タイトルのような言葉がとんでくるのである。男女の関係では、さらにややこしくなるので気をつけたいところではある。さて、今回は、そういった(?)プログラミング言語についてお話をしよう。

あらかじめ言っておくが、各プログラミング言語についてディスっているわけではないことを申し上げておく。

プログラミング言語は、基本的に汎用性が高く、どのプログラミング言語を使っても同じ処理をすることができる。だが、それでも得意不得意が存在する。というより、処理するコードを記述する際に、めんどくせーというのがある。前回の「お客さん!おつり、おつり」でも、少し触れたが、Fortranは、少々文字処理が苦手な言語であり、そのあたりのことを理解しておかないと、思わぬ苦労をする。

Fortranは型宣言が必要なプログラミング言語であり、文字列の型宣言では、以下のように記述する。

character(10) :: str

これは変数strは文字列として型宣言し、その長さは10文字までということを表している。10文字を超える場合は切り捨てられる。また、3文字を代入して、len関数で文字数を取得すると、3を返すのではなく10を返す。このことを知っておかないと、文字列の長さ分だけループ処理すると、思わぬ結果が返ってきたりするのである。

ほかのプログラミング言語でもそうだが、こういったことは書かれていないことが多い。単純にLen関数は文字数を返すとしか書かれていないため、信用してしまうとコードを書く際に、なんで〜!となるのである。とくにセカンド言語として、ほかのプログラミング言語を学習するときに起こりやすい。Len関数が同じ働きをすると思ってしまったりするわけだ。いつ誰がそんなことを言ったのかな?

もう一つ考えてみよう。Pythonの場合、while、for、if文になる。条件付きループはwhile文しかない。while文は前方条件である。プログラミング言語によっては、while文が前方条件および後方条件もある。前方条件と後方条件の違いは、条件によって全く処理しないか、1回は処理をとおすよ、という違いである。

【前方条件】
バス停待ち人数 = 10

while 満員じゃねーか
   一人も乗せてあげない


【後方条件】
バス停待ち人数 = 10
do
   とりあえず一人乗せる
while 満員じゃねーか、降りろや

値をチェクする場合は、後方条件の方が便利である。前方条件のwhile文だと最初に比較する対象の値を仮決定する必要がある。ただし、チェックする条件が複数だったり、入力しないと値が決定できなかったりとうまく行かないことがある。比較する値が入力されていないため、前回の金種計算で支払金額をチェックするケースでは次のようにした。

    purchase = 560
    do while(.true.)
        write(*, *)
        write(*,'("購入金額は", i4, " 円です")') purchase
        write(*, fmt='(a)', advance='no') 'お支払金額 ? '
        read(*,'(a10)') str_payment

        --(略)--
    end do

このプログラムを見てもわかるように無限ループを利用し、ループの中でifを使って判断、その結果によって繰り返したり、ループを抜けて次の処理へ移行するようにした。これが後方条件だと、次のような書き方になる。

    purchase = 560
    do
        write(*, *)
        write(*,'("購入金額は", i4, " 円です")') purchase
        write(*, fmt='(a)', advance='no') 'お支払金額 ? '
        read(*,'(a10)') str_payment

        --(略)--
    while (条件) or (条件) or ...

処理としては自然な流れになり、そして理解しやすいものとなる。ただ、while文が2つあると、戸惑うかもしれないので、repeat〜untilという後方条件の制御文があるのいいのだが。ちなみに、do〜whileをサポートしているプログラミング言語はC/C++、Java、C#、PHP、Javascript、Goなどと多い。どうぢて実装してないんだよ!

プログラミング言語の仕様について理解しておくことは大事なことである。相手をよく知ることで、どうぢて(どうして)実装されていないのかと憤慨したり、使えねぇなどと悪態をつくこともないのである。相手のいいところ悪いところを理解して、機能がなければ自作したり、コードの書き方を工夫したりすればよいのである。工夫するのは大変なことだが実力をつけるチャンスでもあるのだ。

人は意外と自分の思いどおりにならないと、ストレスを溜めることになる……おっと、説教臭くなるのでやめることにしよう。小生のようなじじぃは話が長くなり、説教臭い話をする。そして、相手が聞いてくれないとぶつぶつするのだ。老害たるゆえんである。

おしまい!