1

動的言語(一般的なスクリプト言語と同様)があり、そのためのコンパイラーを作成したいとします。タイプタグのようなもののためにマシンワードのいくつかのビットを予約するのは良い考えですか?特にマイクロコントローラーや同様のデバイスの場合、それは良い考えですか?

タイプ情報のストレージの削減、メモリ管理の多少の容易さ(gcの場合もある)、デバッグの容易さなど、いくつかの利点が考えられます。しかし、これらは、一般的な算術演算または完全な単語を必要とする他の演算のオーバーヘッドを正当化するでしょうか?パフォーマンスのオーバーヘッドがはるかに大きいため、バイトコードVMはこの点ではるかに悪化することに注意してください。だからそれを提案しないでください;)

とにかく、マイクロコントローラクラスのハードウェア用に数値の強いコードを書く人がいるようなものではありませんが、それでも...

4

5 に答える 5

2

型ビットが計算に渡されないようにする必要があるという追加の複雑さは、おそらくストレージの節約をはるかに上回るでしょう。必要なメタデータ/フラグを含むプリミティブ フィールドに隣接するタイプ フィールドを常に割り当てることができます。次に、目的のタイプとステータス情報を格納するために単一の単語を使用できると仮定すると、任意の値のストレージ サイズが常に n+1 ワードであることがわかります。

于 2008-10-23T20:24:59.067 に答える
1

それはあなたのマイクロコントローラがどれだけ「マイクロ」であるかに依存するかもしれません。

たとえば、ARMコアのバレルシフタやロード/ストアで使用できるフリーマスクを使用すると、これらのフラグを処理するコストをかなり合理的に保つことができると思います(試したことはありません)。明らかにそれはクラスのトップエンドですが、ARMは最近どこにでもあります。

LISPは、fixnumがワードよりも小さいことを意味するタイプフラグを使用します。したがって、LISPの実装(関心のあるプロセッサ用にそれらを見つけることができる場合)を調べて、それらがどのようにコストを最小化するか、そしてそれらの最善の努力があなたの要件を満たすかどうかを確認できます。

于 2008-10-23T20:49:37.347 に答える
1

SPARCチップは、この種のアプリケーション用に明示的に設計された、ハードウェアで直接演算機能をタグ付けしています。この機能を備えた他のアーキテクチャへの参照も見ました。実際にこれがどの程度広く使用されているかは別の問題です.Pythonなどのほとんどの動的言語は移植性のために構築されているため、アーキテクチャでこれに依存するオプションは実際にはありません.

古いスモールトークは小さな整数でこれを行っていたと思います-特定の値まではintであり、しきい値を超えるとオブジェクトポインターでした。

于 2008-10-23T21:01:37.680 に答える
0

一方では、コンパイルされたコードで各操作のフラグを直接テストしたい場合は、解釈されたバイトコードが遅いのと同じ種類の理由で遅くなります。バイトコードほど遅くはないかもしれませんが、アムダールの法則があなたに不利に働くでしょう。

一方、完全に動的な言語用の単純なコンパイラは、何らかの形で型チェックを行う必要があります。動的ディスパッチを普遍的に使用すると、最新のプロセッサで重大なパフォーマンスの低下が発生します (マイクロコントローラではそれほど深刻ではないかもしれませんが?)

コンパイラが上記の実行時の型チェックのほとんどを最適化できれば、パフォーマンスを取り戻すことができます。ただし、これを実装することは簡単でも単純でもない場合があります。必要なマスキングは不要な作業になるため、その場合はビットフラグを避けたいと思います。

于 2008-10-23T23:03:14.020 に答える
0

いいえ、これが汎用コンパイラにとって良い考えであることは決してありません。算術演算で「型タグ」ビットを処理するオーバーヘッドは深刻です。

動的型付け言語は、その性質上、各値の型情報を格納するために余分なスペースが必要です。大量の同種型データを保存する必要がある場合、通常は C でそれを行うように設計されたネイティブ コード モジュールを使用するのが正しい方法です。

たとえば、5 つの整数の配列を格納する場合は、Pythonlistで十分です (任意の複雑な混合型を格納できます)。しかし、500 万個の整数の配列を保存したい場合は、arrayそれらを同種の C 配列として保存するモジュールを使用するか、同様のことを行いますが、それらに対して多くの計算を行うために最適化された NumPy を使用する必要があります。

于 2008-10-23T20:27:41.133 に答える