プログラミング言語の主たる動作は次の3つに分類されると云われます。
- 順次
- 分岐
- 繰り返し
順次はプログラムコードを書いた順番に上から下へ実行してゆきます。分岐はif文に代表されるように、条件によって実行するコードを選択します。繰り返しはfor文やwhile文のようにあるブロックを繰り返します。
gotoのような処理をスキップするものもありますが、基本は上の3つを駆使してプログラムを組むことになります。そして、こうした制御フローをもったプログラムは私たちが通常使う言葉に変換して考えることができます。
例えば以下のJavaコードは
if (foo == 0) { System.out.println("A"); } else { System.out.println("B"); }
「もし変数fooが0であるならば、”A”を出力し、その他の場合は”B”を出力する」
となります。
プログラムを書くときに単純なものであれば言葉にして考えなくてもコードを直接書くことができますが、複雑になるとよく頭で言葉として整理します。その際に思ったことがあります。それは、プログラムには過去形がないことです。
そもそも実行時にどうすればよいかをコードとして書くので現在形しかなくて当たり前な気もします。ですが、特に分岐は想定された条件を理由にどう振舞うかを記述するので、コーディングの時点では何れのフローを処理するか確定していません。「もし〜」と表現するように未来のことを指しているイメージがあります。繰り返しも「10回繰り返す」であれば現在の定義のように感じますが、「trueになるまで繰り返す」であれば、実行時にtrueになるかどうかわからないので、未来のように感じます。ですが、未来の計画を書いているだけで未来の動作を行う訳ではない以上、結局は現在形のコードしか書くことはできないのだと思います。
只、これは当たり前過ぎる話で、「出力した」というコードはあり得ないように思います。「出力していたら」というコードを書いても「出力した」という過去の情報を現在の変数で保持する必要がありますので、結局過去のコードにはなりません。
そう考えてみると、現実世界でも同じだなと思います。歴史があっても書物であったり記憶であったりが現在保持されているだけで、過去の行動を実行できる人はいません。結局は現在しかないのです。