Wednesday, 7 September 2011

良いプログラミング言語では

[A]

* 少ない行数で、小さな実行可能な部分をすぐに作れる。

* それを使って、いろいろなテストができる。

* どんどん、広げていくことが楽しい。自由度がある。

* 二度書く手間がほとんどない。

[B]

* 複雑なものを徐々に作り上げていくと、徐々に選択肢が狭まり次にやることが決まってくる。

* 拡張する時に、変更が少なく、局所的。

* 寿命が来た時に新しく書き直すことが苦痛にならない

[C]

* プログラミング言語自体が進歩している

もちろん、プログラミング言語だけではなくて、設計経験も大きいと思うんだけどさ。

ダメなものとしてあげるなら、tcl と php 。書き進めるには良いんだが、[B] のようにならない。大域変数を中心とした言語の限界だと思う。
Java でも、static を多用されると厳しい。

C / C++ は、一つのことをするのに必ず二回書く必要がある。大域変数に頼りがち。

Haskell や Prolog だと、完成が近付くにつれ「徐々に選択肢が狭まり次にやることが決まってくる」。型やデータの流れがプログラムを規定するから。特に、これらの言語は、

* 変数名に意味がない

ので、変数名を考える必要があまりない。なので、変数に関する「プログラムに影響を与える自由度」が逆に減っている。大域変数やインスタンス変数は変数名が大きく影響するからね。

ただし、関数名や述語名は重要。でも、hoge1, hoge2 とかは多用するな。僕のプログラミングスタイルの一つかも。

tcl/php/C/C++ でも、大域変数を禁止して、単一代入でプログラミングすると、「徐々に選択肢が狭まり次にやることが決まってくる」を体験できるはずです。

Object 指向言語は、本質的にオブジェクトが再代入されてしまうのでダメだね。Scala は、それに抵抗しているところがある。でも、これらは旧世代な印象があるな。

No comments: