2010-01-05

C++0x本:言語とライブラリの分離

どうしても、言語とライブラリを一緒に解説しなければならない部分がある。

たとえば、Move Semanticsだ。あるいは、Initializer listsだ。メモリ周りも、言語と完全に切り離すことができない。

実際、Move Semanticsというのは、言語でもライブラリでもなくて、プログラミングのテクニックに属する。しかし、これを解説しないわけにもいかない。というのは、規格書には、Move Semanticsという言葉自体は出てきているからだ。具体的な解説はないものの。

一体どうすればいいのだろう。どうしても、言語とライブラリを明確に切り離せないものも存在する。個々に詳しく解説した上で、言語にもライブラリにも属さない章を作り、そこで、組み合わせて使う場合を解説すればいいのだろうか。

2 comments:

I.S. said...

これの前のentryも同じですが、各言語機能は互いに依存しあっていて、libraryについても、libraryから完全に切り離された言語などは存在価値がないと思いますし、Cなども、簡略化や統一化のために入出力をlibraryにしたのであって、間接的にでも入出力のないprogramなんてありえませんしね。(入出力が言語機能になっている言語は多いです)

C++0xの追加要素では、initializer listは、特に言語寄りの機能ですね。

というわけで、原理原則よりも実状を重視したほうがいいのではないかと思いますね。

hito said...

initializer_listとか、new演算子のようなものは、言語機能と一緒に説明しても、大した混乱を招くことはないでしょう。
ただ、Move Semanticsは別です。
Move Semanticsは、プログラミングのテクニックなのです。
move コンストラクタも、言語側ではなく、ライブラリ側で定義されているのです。
いわば、イテレーターや関数オブジェクトと同じです。

もちろん、それを実現するには、rvalue referenceが必要ですが、
rvalue reference自体は、とくにlvalue referenceと変わりありません。
rvalueとlvalueが区別されているからこそ、意味があるのです。

Move Semanticsが言語機能であると誤解するのは、非常に危険なことで、なんとしてもそれは避けたい。