1. ホーム
  2. c

[解決済み] C言語のデータ型は、どのようにして「ほとんどのコンピュータで直接サポート」されるのですか?

2022-09-07 13:36:08

質問

K&Rを読んでいます。 "Cプログラミング言語" を読んでいて、こんな文章に出会いました[Introduction, p.3]。

C 言語が提供するデータ型と制御構造は、ほとんどのコンピュータで直接サポートされているため 自己充足的なプログラムを実装するために必要なランタイムライブラリはごくわずかです。

太字の意味は何でしょうか?以下のようなデータ型や制御構造の例はありますか? がコンピュータによって直接サポートされているデータ型や制御構造の例はありますか?

どのように解決するのですか?

はい、直接サポートされていないデータ型があります。

多くの組み込みシステムでは、ハードウェア浮動小数点演算ユニットがありません。 そのため、このようなコードを書くと

float x = 1.0f, y = 2.0f;
return x + y;

こんな感じに変換される。

unsigned x = 0x3f800000, y = 0x40000000;
return _float_add(x, y);

この場合、コンパイラや標準ライブラリは _float_add() の実装を提供しなければならず、組み込みシステムのメモリを消費します。 もしあなたが本当に小さなシステムでバイトを数えているのであれば、これは積み重なる可能性があります。

もう一つの一般的な例は、64 ビット整数 ( long long を使用) であり、これは 32 ビットシステムでは直接サポートされていません。 古い SPARC システムでは整数の乗算をサポートしていなかったので、乗算はランタイムが供給しなければなりませんでした。 他の例もあります。

他の言語

それに比べて、他の言語はもっと複雑なプリミティブを持っています。

例えば、Lispのシンボルは、Luaのテーブル、Pythonの文字列、Fortranの配列などと同様に、多くの実行時サポートを必要とします。 C の同等の型は通常、標準ライブラリにまったく含まれていないか (標準のシンボルやテーブルがない)、はるかに単純で実行時サポートをあまり必要としません (C の配列は基本的に単なるポインタ、ヌル終端の文字列はほぼ同様に単純です)。

制御構造

C言語で欠けている顕著な制御構造は、例外処理です。 非局所的な終了は setjmp()longjmp() これらはプロセッサの状態のある部分を保存したり復元したりするだけです。 それに比べて、C++ ランタイムはスタックを歩き、デストラクタと例外ハンドラを呼び出さなければなりません。