From: Nobuo Yamashita <nobsun / sampou.org>
Subject: [haskell-jp:235] Re: 低レベルプログラミングとstricttypesystem
Date: Thu, 30 Oct 2003 15:09:47 +0900 (JST)

> comp.lang.lisp の議論を見てないので、発端は知らないのですが、
> 一般論として、動的型付けの方が静的型付けより、優位な場合って、どんな時ですか。
[...]
> でも、多分論点はこれではなく、静的型付けができないものを扱えることが、
> 動的型付けの利点なんですよね。で、静的型付けができないもので、使いでの
> あるものって何だろうという素朴な疑問です。

c.l.lの議論は爆発してて私も追ってません。
(ちなみに、c.l.functionalとのクロスポストになってます)

細かい点をあげてゆくと、「いやそれはこっちでも出来る」というような
話になって、c.l.lの二の舞になりそうです。

個人的には、違いはむしろ、結果として出来あがったプログラムを
比較して何がやりやすい/やりにくいかではなくて、プログラムの
作成過程において、どういうスタイルを取るかという問題であるように
思えます。スタイルの違いによって、静的型付けを頼れる足場と見るか
余分な制約と見るかが違って来るように思えます。

また、スタイルの違いと見ると、動的型付け/静的型付けは両極端に
ある概念ではなく、むしろプログラム言語の制約という広いスペクトルの
違いの一部であるように見えてきます。可変長引数を許すか許さないか、
状態の変更を許すか許さないか、戻り値は任意個か一つだけか、
オブジェクトのエクステントは無限か有限か、そういったさまざまな
選択が絡み合って、このスペクトルを構成しているように思えます。

そういう観点から、ひとつシナリオをあげてみます。動的型付け、
可変長引数、状態変更有りな言語に慣れたプログラマがよく取る戦略です。

ある基本的な関数 (foo x y) というのがあって、それが大きな
プログラムの中でたくさん呼ばれているとします。
ある日、プログラマ D.Y.Namic氏は、(foo x y)の呼び出し
の特定の場合に、付加的なパラメータzを渡してやると、非常に
効率があがるかもしれないと思い付きました。しかし、それを
検証するには、実際にコードを書いてみないと何ともいえません。
そこでD.Y.Namic氏はfooのシグネチャを (foo x y &optional z)
と変えて、とりあえず一つのモジュールについてのみ、zの使用を
検証してみます。他のモジュールでもfooはたくさん呼ばれており、
検証のためには他のモジュールも使う必要があるのですが、とりあえず
それらはそのままにしておきます。
検証の結果、その変更は充分なメリットが認められたので、
旧来のモジュールも徐々にzを使うように変更し、全て変更し終わった
ところでfooのシグネチャを (foo x y z) に変更しました。

さて、静的型付けに慣れた St. Atic 氏はどういった戦略を取る
べきでしょう。

ここで、静的型付けでも、「可変長引数、状態変更有り」な言語であれば、
ほぼ同じ戦略が取れるでしょう。但し、fooのシグネチャ変更により
全てのモジュールのリコンパイルが必要になるかもしれません。
こっそり自分だけで試してみたい時はちょっと困るかも。
更に、その型変更はfooを高階関数として引数にとる関数にも波及的に影響を
及ぼしてゆきます。ただ、こういういいかげんな言語ではきっと
キャストみたいな荒技があったりするので、あまり問題にはならない
かもしれません。

厳密な型推論をやる言語だと可変長引数は難物です。でも、fooが
pure functionalならば、元のfooの中身をコピーしたfoo1を作って、
検証用モジュールだけ (foo1 x y z) を呼ぶようにする
手があります。型変更は波及的に影響を及ぼすことでしょうが、
ひとつのモジュール内ならなんとかなるかもしれません。

じゃ、fooがmutableな状態をcloseしていたら?  この場合は、
「静的型付け、固定長引数」は足かせにしかならないでしょう。
まあ、そんな言語は無さそうですが。

私はD.Y.Namic氏に近いスタイルを取りますが、みなさんはどうでしょうか。

--shiro

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/