* KH-FDPLのノート0001 -(by [[K]], 2015.03.17) ** (1) プログラミング入門のためのプログラミング言語について -たとえばC言語で hello, world しましょうというとき、 #include <stdio.h> main() { printf("hello, world\n"); } -みたいに書くと思うのですが、これは多くの初心者を惑わせます。includeって何?stdio.hって何?mainって何? { } って何? -これらを「おまじない」と言うことはできますが、このおまじないが多ければ多いほど、初心者は「よくわからない」という第一印象を持ってしまいます。ですからこういうものは極力減らしたいと考えました。 -もちろんこれらのおまじないは意味があり、これによってC言語は拡張性を担保されているのです。それらを否定するつもりはありません。しかしそれを常に要求するところが不満なのです。拡張したいときに記述できればいいと思うのです。 -またいっぽうで、変数aに1を代入するときは、 int a; a = 1; -などとします。これを「int a = 1;」と書くように指導することもできますが、そうすると「aに1を入れた後にaを3に更新してください」という課題に対して、 int a = 1; int a = 3; -と書いてしまい、エラーになってしまいます。・・・そこで代入と宣言は違うとか、変数型についてあーだこーだとか、そういう話になってしまいます。 -宣言のことで頭を悩ませるのは、プログラミング入門の本質でしょうか。私は違うと思います。本質は自分の組み立てたロジックでプログラムが動いていく様子を理解することです。その本質に早く到達しなければいけません。 -私はその本質に到達する前に「なんとなくプログラミングは難しい感じがしてよくわからない」という第一印象をもたれてしまうケースを何度も目にしてきました。「きっと自分には向いていない」と決め付けてしまうのです。本質を体験してそう思うのならそれは仕方ないと思うのですが、こんな本質的ではないところでそんなふうに感じてしまうのは「もったいない」ことこの上ないと思うのです。 -利用する前に宣言が必要だなんていうのは、いってしまえばコンパイラの事情です。無能なコンパイラに教えてやるためのものです。プログラムに本質的に必要なことではありません。・・・その気になればコンパイラは新出の変数を自動で宣言することもできたはずです。もちろんそんなことをしたら、変数名のタイプミスにプログラマは気づきにくくなって、バグの温床になるかもしれません。それは私でも分かります。でも、一方で、この仕様が初心者を苦しめているということも分かってほしいのです。ですから違う方法でタイプミスに対処できる方法を模索してみてはどうでしょうか。KH-FDPLが目指しているのはそういうことなのです。 ** (2) 構造体の宣言 -構造体やクラスの宣言も似ています。 abc.def = 5; -これを実行するためには、abcがなんという型であるかとか、その型にはdefというメンバ変数があるとか、そんなことを前もって宣言しなければいけません。どうしてそんなことになっているんでしょうか。そんなのはどうだっていいのではないかと思うのです。大事なことは、abcはファイルシステムでいうところのフォルダみたいなもので、そこにdefというファイルがあって、その中身が5だと、それでいいと思うのです。C言語は簡単なことを複雑にしているとしか思えません。だから初心者は構造体が嫌いなのです。 -これをC言語などで実行するためには、abcがなんという型であるかとか、その型にはdefというメンバ変数があるとか、そんなことを前もって宣言しなければいけません。どうしてそんなことになっているんでしょうか。そんなのはどうだっていいのではないかと思うのです。大事なことは、abcはファイルシステムでいうところのフォルダみたいなもので、そこにdefというファイルがあって、その中身が5だと、それでいいと思うのです。C言語は簡単なことを複雑にしているとしか思えません。だから初心者は構造体が嫌いなのです。 ** (3) 見える化 -初心者がプログラムの流れを理解することはとても重要です。変数がどのように変化していくのかが見えたらいいと思います。C言語の場合、プログラムに書き足して変数の値をprintfするようにさせるか、もしくはデバッガなどを使わなければ変数の変化は分かりません。printfをソースに書き足すというのは、何か不自然です。初心者は中で何が起きているのかを知るためにプログラムそのものに手を加えることに抵抗を感じます。 -デバッガはよいです。しかしデバッガにも問題点はあって、デバッガはデバッガの独自の命令体系があって、それを覚えなければいけません。任意の時点で一時停止して、そこでprintf命令を実行できればいいと思うのですが、そうなっていないわけです。これは問題です。 -では「見える化」のために必要なことは何でしょうか。それはプログラムが好きなタイミングで一時停止できて、ソースをいじらずともブレークポイントが設定できて、そのときにprintf命令などを自由に実行できることです。そして気が済めば実行を再開できることです。コンソールが別になっていて、本来の動作を妨げないのがいいです。 -またその際には、現在利用中の変数の一覧なども取れるべきです。これがあれば宣言がなくても変数名の入力ミスに気づけるはずです。・・・デバッグコマンドと正規の命令に区別はあるべきではないので、これはつまり通常の命令として、「現在利用中の変数の一覧」が取れるべきということになります。 -プログラムが終了したあとでも、変数は残っているべきです。実行した結果、最終的に変数がどうなったかを確認するためです。 ** (4) 永続化 -C言語で「なんらかの値をファイルに保存しておきたい」と思ったときに、fopenとかfprintfとかめんどくさいことがいっぱいです。メモリにしまっておくときと比べて、どうしてこんなにも難易度が違うのでしょうか。環境変数とかいうものへのアクセスも、getenvがどうたらこうたらということになっています。こんなのおかしいと私は思います。 -KH-FDPLでは変数は原則として勝手に消えたりはしません。何もしなくても次回起動時に回復されます。したがってファイルに保存することに頭を悩ませることはなくて、適当な構造体に入れておけばいいのです。環境変数の代わりにも使えます。 ** (5) 初心者ではなくても -今までプログラミング入門者を想定して、プログラミング言語はこうあるべきだと書いてきましたが、これらはどれも初心者以外にも有効なことです。 -変数をわざわざ宣言しないでも使えるのなら、そのぶんだけプログラムは短く書けます。見通しがよくなって結構なことです。見える化だって、デバッグには重宝しそうです。永続化だって便利になって結構なことです。 * こめんと欄 #comment