[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[b-free: 1318] Re: b-free:1205について のコメント (1/2)(Re: オブジェクト指向のOSへの適用)



References: <35232BE4.692CEC89@bridgew.edu> <19980402182808A.night@soft.hitachi.co.jp>
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

古い発言に応答しています。
すんだ話も多いのですが一応、、、。

# 長いので2つに分けました。


Ryuichi Naitoh wrote:

> > 僕は、Java よりずっと orthogonalな言語だと思いますがね。
> > 表現力もあるし、機能を追加するときも十分な試行錯誤と policy みたいな物の
> > 上になり立っていると信じています。
> 
> たとえば、C++ の演算子の多重定義は必要ですか?

あると、source code を読むのが(僕は)速くなっていいですねぇ。
例えば、Complex class なんて言うのは、その顕著な例でしょう。

# ただし、間違った使い方されると、逆効果ですが。
# あと、本当に speed が必要なところでは、しんどいときもある。
# inline の効果が弱められてしまったことだし、、、。

僕が思うに、一つの設計思想として「いかにして、user defined class を
predefined type と同様に扱えるようにするか」というのが言語拡張の大きな観
点だったと思います。例えば、struct が変数定義の時に必要なくなったり、
template で int も complex も同様に扱えます。
それは、十分自由なOOPを行うためには必須であった気がします。

その点、Java は効率のためか、二つを分けましたね。
primitive という奴と、class に。

だから初めて Java に入る人は、関数呼び出しで何で int が値渡しなのに
class が参照渡しか疑問に思うかもしれません。強いて言うならば、例えば数値
1を渡すときは、1という object が定義済みで存在し、その object への参照
を受け渡ししていると考えると(無理して)納得いかなくも無いのです
が、、、。まあ、Smalltalk と同じ機構ですね。

# とにかく、Java のOOはずいぶん制約されているように思う。

 
> それから、えーとえーと、例外処理や多重継承、テンプレート機能、それから
> 名前空間などがバージョンが上がるごとに追加されていきましたが、こういう
> 機能は追加するようネものではないものと思います。
> 機能を追加するときに、どういうように追加するかという吟味はもちろんした
> と思います。
> しかし、言語全体のデザインという点ではどうでしょうか? 初めからデザイ
> ンがよかったら、機能を追加するようなことは必要ないと思いません?

Design については、Cの段階から再設計し直したと考えて良いでしょう。
Class を使えるようにするために、しかし no overhead を掲げて、色々な実装
項目をどのように実現するか手探りで行ったものと思います。
その課程で問題点がたぶん大量にでてきたでしょうから、一つずつ慎重に解決し
ようとした結果が、徐々に機能を追加するという形になったのだと思います。
で、最近になってようやく一通りのことが終わったので、「標準」が決定したの
ではないかな。

まあ、Stroustrup が(たぶん冗談で)「なぜ、C++は++Cじゃないの
か?」と何かで問いかけていましたが、早い話「C++を評価すると、Cに還元
できる」という話なんですよ。その一方で(副作用で)C+1になってると。

元々のC++の始まりも構造体を拡張してOOPを実現しようと言う話から始ま
ったわけですし、最初のC++処理系も、Compiler ではなくC++からCへの
変換 program でしたよね。

だから、言語設計という観点で手探りであったとしても不思議はないと思いま
す。

# Lisp の上に色々な言語を載せるようなもんだな。


 
> Stroustrup の書いた C++ 言語の本を見ると、版が上がるごとにページ数が大
> 幅に増えています。
> 
> # おかげで読む気力が萎えてしまう(笑)

でも、あれって、大部分は class library の話ですよね?
僕だって、全然、すべて把握しているわけではないです。

# と、かってに Night さんが把握してないと仮定してますが、
# Night さんだと、把握してそう。(笑)


 
> 更にこれらの機能を追加するごとに新しい構文が追加されているおかげで、コ
> ンパイラの作成者は大変です(もちろん、ソースプログラムを読む方も大変で
> す。何とかして (泣) )。

それは思う。(笑)
でも、構文の追加点は些細な部分も多いですから、program 書く方にとっては全
然しんどくない気がしますが。むしろ、冗長さをどんどん避けられる方向に言語
が改良されましたから、書く方にとっては楽になってきてますね。


 
> そのうち、ガーベジコレクションやスレッドも入るんじゃなかろうか?
> (また新しい構文が増えるんだろうなあ)

ははは。(無いと良いですね。^_^;;)
そう言えば、どっかの本に、CやC++にゴミ集めを導入することに関する論文
があったな。
"Advanced Topics in Programming Language" だったかなんか。
題名は忘れちゃったけど、、、。(この本手元にない)
流し読みしかしてないけど、けっこう、over-head を少なくして可能ならしいで
すよ。その本では、malloc の変わりになるものを library で提供する形で実現
していたと思います。

# 詳細が欲しければ調べますけど、、、。


 
> 余談ですけど、C++ は決して C 言語の欠点をなくそうというものではないん
> ですよね。C++ への進化は C 言語の拡張への努力であって、C 言語の欠点を
> 消そうという努力ではない。

Cの欠点というのは言うなれば「何でも出来てしまう」ということですよね。
そういう事を欠点で意味するなら、そうですね。:-)
まあ、C++では型検査とかが厳しくはなってはいますが。

 
> そういや、GCC には例外処理はちゃんと入ったんだろうか?

どうなんでしょ?>誰か知ってる人


> テンプレート機能がないオブジェクト指向言語は、アルゴリズムとオブジェク
> トが分離できないということですか。

いえいえ、分離は出来るんですが、、、、。

では、もう少し具体的に考えてみましょうか。
partition-exchange sort(別名 quick sort ^_^) の algorithm を実装したいの
ですが、毎回 element の型が違う度に作るのはしんどいので汎用のものを作ろ
うと思います。で、C library で提供されているのはご承知の通り次のようなも
のです。


 1.element ではなく、pointer table の sort と割り切る。
 2.不等号を element の上に定義してやり、その関数を同時に渡す。


まあ、これで十分なのですが、これをOOPでやるとしましょうか。やっぱ、保
守とか読みやすくもしたいですから。そこで、この関数が受け取れる object の
必要条件を sortable という抽象 class で表現しましょう。sortable は不等号
関数が実装されることを保証するものです。で、element の型は sortable から
派生しましょう。すると、quick sort algorithm にこの elements を渡せるよ
うになりますから、ずいぶん汎用になりますねぇ。どんな種類の型でも
sortableから多重に継承すれば、この algorithm が使えます。実際の code
も、ずっと理解しやすくなっているはずです。なにせ、不等号関数が sortable
に取り込まれてしまいましたから。

ただ、幾つか問題があります。
algorithm 中では、ただ単に sortable という型として扱っていますから、不等
号関数は仮想でなくてはいけません。よって、不要な overhead がかかります。
sort する要素にはよけいな情報が加わります。それに何より、sort algorithm
だけのために sortable から継承させるのって、なんか、むだが多い。そう言う
わけで、template の出番だと思います。

template は、実際には、全く継承関係のない型にも同じ操作を適用しようと云
うものですよね。自分が同じ algorithm を型だけ変えて書き直す変わりに、
compiler がやってくれる。そう言うわけで、code size 以外の overhead を無
く、object の継承関係に立ち入ることなく、色々な object に適応可能な
generic な操作を与えることが出きるわけです。

 
> それでは、テンプレート機能がないオブジェクト指向言語は、処理(アルゴリ
> ズム)の遮蔽が不十分だということですね。
> テンプレート機能がないオブジェクト指向言語、えーと、たとえば Java にも
> テンプレートは必要だと思いますか?

Java は Object 型や Class 型がありますから、template は必要無い気がしま
すが、、、。


  (、、、続く)

-Aki.