プログラムということ

id:ukiya:20070203:1170501286 の続き。


「現在のディレクトリにあるファイルのうち、一定の規則に沿ったファイル名を、一定の規則で書き換える」
プログラムを組むとします。


ふつう、プログラムはプログラム言語で組むのですが、
ここでは少し視点を変えて、この仕事を、誰か他の人にやらせるとします。
その人は融通がきかず、与えたマニュアル通りの仕事しかしませんが、
マニュアルは明確である限りどんなに複雑なものでも良くて、仕事の速度は猛烈に速いです。
さて、どうやってマニュアルを与えるでしょうか。


たとえばこんな感じに書いたマニュアルを与えるとします。

  • 現在のディレクトリにあるファイルをリストにしなさい。
  • リストの全てのファイルに対して、以下の作業をしなさい。
    • ファイル名が(規則1)に沿っていたら
        • ファイル名を(規則2)に従って変更しなさい。


さて、これをそのまま、何となく謎言語っぽくするとこんな感じでしょうか。

- list is all files in this directory
- for each filename in list do below
-- if filename matches rule1
--- change filename according to rule2


英語としては滅茶苦茶ですが、何となく雰囲気は伝わるかと思います。
もう少しプログラム言語に近づけてみます。

list = all_files_in_this_directory;
foreach(filename in list) {
  if ( filename_matches_rule1 ){
    change_filename_according_to_rule2;
  }
}

書いてある内容は殆ど変わりません。
しかし、この書き方なら(若干言語毎の単語のクセはあるにせよ)
色々なプログラム言語に極めて近いと言っていいでしょう。
ただし、(規則1)と(規則2)は明らかにされていませんので、
まだ中身は書かれていません。


私が昔、プログラム言語初心者に言語の基礎を教えていた時、
「問題をどう処理にすればいいのか分からない」
というところで詰まっていた人には、上記のように、
「ならばまずは、日本語でいいので、融通のきかない誰かに
 仕事をやらせると思って、マニュアルを書いてみてください。」
と言っていました。


言語を使っていて、本質的にこの表記に近い書き方ができる言語は、
思考をそのままプログラムにできるのでとても楽です。
逆に、上記の他にたくさん色々と書かなければならない言語は、ちょっと大変です。


上記は手続き型言語の場合の話ですが、世の中には上記と本質的に異なる
考え方をしないと書けない言語もあります。関数型言語などがそうですね。


だから何だという話でもないのですが、プログラムについて今ぼーっと思ったことでした。