Entry

フローチャートという低水準言語

2008年07月21日

こちらの話から。今時のプログラミング(半笑い)でフローチャートは必ずしも必要じゃないけれども,フローチャートを読み書きできるってことは,プログラマとして必要な最低限の素養なんだとは思う。

さて、研修の話だけど、低水準言語ってだけではなく、きちんとフローチャートを書かせて処理の流れを整理し、あるいは効率が悪くないかを考えさせる、ということも重要だと思っています。

フローチャートとFizzBuzz問題 - novtan別館

こちらの話を受けて,小飼さんのこの話。この考え方は危険だと思うぞ。

フローチャートの表現力はしょぼすぎる

結局のところ、これに尽きる。フローチャートがまともに記述できるのは「手続き」だけだが、かつてはとにかく今やプログラミングにおいて「手続き」が占める割合というのはハナクソぐらいしかない。もちろん「手続き」でないものも「手続き」に還元可能ではあるが、プログラマーに求められているのは「期待どおりに動くもの」であって、手続きは手段に過ぎない。

(snip)

ここではあえてCで書いてみた。LL言語と比較して「フローチャート通り」なプログラムを強いられやすいCですらこのありさまだ。

404 Blog Not Found:フローチャートがダメな3つの理由

たしかに,結果からしてみたら手続は手段なわけですけれど,エンジニアは「結果が必然であるために手続を理解している必要がある」。そのための,表現・伝達(共有)・維持の手段がフローチャートなわけで,受託なんかの場合には大切な契約書兼証跡にもなる。おそらく,小飼さんはここらへんについて踏まえているんでしょうけど,「結果がよければなんでもいい」というように読む読者がいるとしたら,これは大変危険です。「なんかここをちょこっといぢったらちゃんと動くようになりましたぁ……(理由は分からないけど)」とかいった,寝言をかます人が増えるだけ。

もうひとつ。上記引用では次のような,フローチャートで表現できない(とされる)例を挙げています。

#include <stdio.h>

int main(int argc, char **argv){
    int i;
    for (i = 1; i <= 100; i++)
        printf( i % 3 ? i % 5 ? "%d\n"   : "Buzz\n"
                      : i % 5 ? "Fizz\n" : "FizzBuzz\n", i);
    return 0;
}

問題は三項演算子の部分だと思うんですけれど,上のコードについて「フローチャート的な意味での制御構造」が見えないとしたら,それはそれで問題なんだと思います。たしかに,C の文法上,三項演算子は制御構造には含まれません。けれど,実質的に(アセンブリ=機械語レベルで)見れば,これは「フローチャート的な意味での制御構造」に還元されます。

ここで,C の話に機械語を持ち込むのは,ただのマニアなんじゃね?とか思うかもしれません。けど,そう思うとしたら,その人はマルチスレッドのプログラムを書くべきじゃない。どの値(メモリ)がどのタイミングで何回評価されるのか,を踏まえられければ(つまり制御構造を踏まえられなければ),クリティカルセクションを切ることなんでできませんもんね。if-文は複数の命令だからクリティカルセクションを切るけど,三項演算子を使った文は1つの命令だから切らなくていいよねー……とか言う人がいたとしたら,マヌケ以外の何物でもありません。

最近の言語,Java でも Perl でも Ruby でもそうですけど,あーゆのって,プログラミングというよりは,設定ファイルを作る作業とほとんど変わんねんじゃね?とか思うことがあります。UNIX なんかでは,シェルの設定をシェルスクリプトで書くけれど,そんな感覚です。設定内容とちょっとした文法だけ踏まえていれば,誰でも書けます。なぜなら,そういう風に書けるようにできているから。

言ってみれば,フローチャートなんか知らない人でも書けるように取り計らってもらった環境。言語仕様の設計者がどういう理念を持っていたかは知らなけれど,少なくとも業界的には,低コストで人海戦術に動員しやすい環境,という認識なんじゃないだろうか。

つわけで,プログラミング環境にナメられないためにも,低水準なフローチャートは読み書きできた方がいいんだと思います。「コンピュータは,メモリにロードされた命令を,クロックに合わせて,順番に実行していく」といった,フローチャート的なアーキテクチャは LL が普及した今でも(そしてしばらくは),変わりませんから。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN