Hideki Kato <katoh@pop12.odn.ne.jp> writes:

> >「データ構造が固定」は強すぎるかも知れませんが、
> >「データ量の上限が固定」だと現実的ですよね。
> 
> う,実はそれも難しいんですよね.LISP で書いたエキスパートシステムの
> 類で展開されるノード数の最大値なんて...単純に(ワーストケースを)
> 求めたら非現実的な値(まず間違いなく指数関数オーダー)になるだろう
> し...とは言え,それを前提にしないことには具体的な話ができないの
> も,また確か.
> #だからC(か FORTRAN)で作ろう,って話になってしまう...言語の問
> #題じゃないんだけど...

ふむ。「CやFortranでエキスパートシステムを書くと、ノード数の上限が決ま
る」んでしょうかね。それとも「エキスパートシステムを使うのはあきらめる。
そうするとLispを使う価値もなくなる。」ってことですかね。

> >(1) cons1回あたり(可変長の場合は、1バイトあたり)どのくらいの時間がかかっ
> >    て良いかという、許容できる上限値を決める。
> >(2) それを満たすように、cons1回あたりの仕事量のパラメータを調節する。
> >    (これは、比例定数を実機で測っておけば済むはずです。)
> >(3) その後、扱う(生きている)データ量の最大値と、実装されているメモリの
> >    比率から、いつ(たとえば空き領域の残りが何%になったとき)GCを始めれ
> >    ば良いかのが決まる。
> 
> 残念ながら実機は固定できません.市販ソフトウェアですから,どんなハー
> ド上で使われる事になるかは,売る方の与り知らぬところです.
> #起動時にベンチマークでも測るか...?
> #それでも他のタスクが有ったら...とか考えると,専用機というか,
> #ハードと組でシステムとしてしか売れなくなっちゃうわけで...これも
> #困る.

(1)「許容できる停止時間の上限値」は良いですよね。
(2)起動時に比例定数を測るのは簡単にできると思います。BogoMipsみたいな
   もんですね。
(3)実装されているメモリ量(あるいはヒープに使って良いメモリの最大値)も
   実行時に知る手段が何かありますよね。なければ、インストール時や起動
   時に設定してもらえば良い(Java VMみたいに既定値を決めても良い)。

だから、どんなハードでもいちおう問題はないんじゃないですか?

あとは「生きているデータ量の最大値」ですが、これは「最大メモリ量の××
%以下」という仕様にしておけば良いですよね。それを越えるとエラー(下記参
照)。

> >たとえば、
> >「実時間制約(割り付けにどのくらい時間がかかって良いか)」
> >「生きているデータ量の最大値」
> >「ヒープサイズ」
> >をパラメタで渡すと、後はシステムが自動でチューニングしてくれる(制約を
> >満たす限り、なるべくGCを止めておくよう最適化するとか、あるいは停止時間
> >をなるべく均一になるよう最適化するとか)としたらどうでしょう。これなら
> >acceptableでしょうか?
> 
> 上にも書いたとおり二番目が難しいんでねぇ...量だけなら仮想記憶にす
> るとか(今はメモリも安いから)目一杯実装するという手もあるんです
> が...

たとえば
  gc_init(time_in_ms, max_data_bytes, heap_bytes);
と初期化するとしましょう。で、この条件で間に合わなければ初期化の時点で
エラーになったり、GCの途中で(max_data_bytesを越えると)警告が出たりエラー
になったりするとします。

このときのmax_data_bytesが決められないということですね?

しかし、

・「メモリが足りること」というのは、ソフトがハード側に要求するスペック
  として当然の事項ですよね。与えられた仕事に対してメモリが足りなければ
  (あるいは逆に言うとメモリに対してデータが多過ぎれば)エラーにするしか
  ありませんよね。
・「生きているデータ量 +α」の *実*メモリ量は、*どんな言語でも* リア
  ルタイム処理のために必須ですよね。プラスαのぶんは、Lispだと少し多く
  なっちゃうかも知れないけど。
・リアルタイム処理の場合、デッドラインをミスしたらエラーですから、間に
  合わない量しか「実」メモリがなければエラーにするしかありませんよね。
・逆に言うと、実メモリ量が決まると、ある量のデータまでしか扱えない、そ
  れを越えたらエラーにするしかありませんよね。

そうすると最大値は(絶対量でなく)パーセンテージから計算して
   gc_init(time_in_ms, heap_bytes * 0.70, heap_bytes);
のように与えれば良いのでは? で、heap_bytes * 0.70を越える量を使うと
「データ量が多過ぎてリアルタイム性が満たせません」という警告あるいはエ
ラーが出る。

> #それに,そんな事を気にしなくて済むのが LISP を使う利点の一つではな
> #かったかな,とも思ったり.

気にしなくてもかまわない(実メモリに収まらなくても、仮想記憶が足りれば
良い)場合に、気にしない使い方ができるのは利点かも知れません。

しかし、
・どんな言語であろうと実メモリ量を気にせざるを得ない場合(リアルタイム
  処理)で、
・Lispだけ他の言語と違って「気にせずに書く」ということにして、
・その結果Lispだけ「リアルタイム処理には使えない」という結論にされてし
  まう
のはフェアじゃないと思います。それはダブルスタンダードというものです。

他の言語でデータ量を考慮して書くことが必須な場合は、Lispででもデータ量
を考慮して書いて比べて下さい。

                                前田敦司