鍋あり谷あり

テーマを決めずに適当に書いています。

返信返信

コメントありがとうございます。>k.inaba さん・shiro さん
きちんと時間を取って考えないと返信が書けないので、ペースが遅くなってます。すいません。

まず。
私は既存の処理系の話と言語仕様の話をごっちゃにして書いていて、shiro さんは言語仕様の話をしているからかみ合ってないのかなと思いました(悪いのは私)。

で。
様々なことに関する理解が不足していると自覚した上で書きます:
D言語gcを見て考えたんですが。
gc を利用する関数や、gc を利用する new 演算子を全く使わないでソースを書いたとします。そういう場合には gc がリンクされないということであれば、C言語と同程度にOSを書くのに向いた*1処理系であると感じられます。
一方。いくら new 演算子の使用を避けても gc をリンクすることは避けられず、main の前に gc ランタイムの初期化コードが入るのは仕様であるということであれば、低水準な世界で動くプログラムには向かないと思います。
つまり。実装上の問題であるわけですが、発展途上の言語のようなのでこれからどうなるかということでしょうか。

それと。
私は D言語C/C++ を対比させているのに なぜ shiro さんや smii さんが Scheme や ML の話をするのかが実はわからなかったんですが、もしかして、id:Nabetani:20050823:p2 の流れですか? 私自身はすっかり忘れてました。
Scheme にも ML にも Haskell にもまったく明るくない(にも関わらず、関数的アンテナに入っていますが、これはもちろん私の責任ではありません)のでなんともわかりませんが:
確保したメモリが回収されず、やりようによってはそのうちメモリを使い切ってクラッシュするという実装 + 低レベルメモリアクセスプリミティブ という処理系なら、Cと同程度に低水準と呼ぶに値するような気がします。
……勉強不足なので気がするだけなわけですが。

あと。(ここで文体が変わり)そもそもの発端( id:Nabetani:20051118:p2 )に戻り。

D言語は、私の思い描く「C++ のこういうところを整理しただけの言語」とはだいぶ違うということもわかった。
整数のゼロをヌルポインタとして使うのは流石にやめたようではあるが、例えば

void foo( uint  a ){  printf( "uint\n" );  }
void foo( ulong a ){  printf( "ulong\n" );  }
void foo( int   a ){  printf( "int\n" );  }
void foo( long  a ){  printf( "long\n" );  }

void test()
{
  foo( 0xffff ); // int
  foo( 65535 ); // int
  foo( 0xffffffff ); // uint
  foo( 4294967295 ); // long : 十進か十六進かで型が変わる!
  foo( 0xffffffffffff ); // long
  foo( 281474976710655 ); // long
  foo( 0xffffffffffffffff ); // ulong
  //foo( 18446744073709551615 ); // これはエラー。
}

こういうところは C言語のままである。
“-1<(1).sizeof”が偽なのも気に入らない(符号付きと符号なしの比較でエラーになってほしい)

どうも、D言語も(C++ほどではないとはいえ)C言語と同じような動作をするように心がけられているらしい。
もったいないけど普及のためには仕方ないのか。

*1:OSのもっとも低水準の部分や、とても小さなOSを想定していると言うことは以前書いたとおりです