21

私が持っている質問は、主にセクション 4、パラグラフ 6に関連しています。

準拠する実装の 2 つの形式は、ホスト型と独立型です。適合するホストされた実装は、厳密に適合するプログラムを受け入れるものとします。

私が理解しているように、これはファイルシステム、割り当てられたメモリ、およびスレッドを備えた典型的なアプリケーション環境を構成しています...

準拠する独立した実装は、ライブラリ条項 (条項 7) で指定された機能の使用が標準ヘッダー 、、、、、、、、、および の内容に限定されている厳密に<float.h>適合するプログラム<iso646.h>を受け入れるものとします。<limits.h><stdalign.h><stdarg.h><stdbool.h><stddef.h><stdint.h><stdnoreturn.h>

...そしてこれは、標準のファイルシステム、割り当てられたメモリまたはスレッドを持たない、典型的なカーネルお​​よび/または組み込みの最小限の環境を構成します(とりわけ)。

準拠する実装には、厳密に準拠するプログラムの動作を変更しないという条件で、拡張 (追加のライブラリ関数を含む) を含めることができます。

これにより、ホストされた実装に、ホストされた実装または独立した実装と自称する自由が与えられたかのように見えます。ファイルシステム、割り当てられたメモリ、またはスレッド (とりわけ) に関しては、これらは拡張カテゴリに分類されるため、単に実装することができます。毎回エラーを示す値を返すインターフェース。ほんの数例を挙げると:

  • fopenfgetsそしてmalloc戻ることができますNULL
  • fprintffscanffputcおよびfgetc返すことができますEOF
  • thrd_create戻ることができますthrd_error(「リクエストを受け入れることができなかった」ことを示します)

これは、セクション 4、パラグラフ 6 が与える区別が事実上無意味であることを意味します。ホストされた独立した実装でこれらの関数の実際の機能レベルを保証する要件はありますか? たとえば、上記の関数は、対応する失敗値以外の値を実際に返すことができる必要がありますか?

4

4 に答える 4

22

引用されたパラグラフはすでにそれを非常によく述べています。

ホストされた実行環境も独立型ですが、その逆ではありません。コンパイラは、独立した実装を提供するだけで済みます。たとえば、gcc は、標準ライブラリが含まれていないため、厳密に言えば独立型のみです。ただし、ホストされた環境 (デフォルト) 用にコンパイルするときに使用可能であると想定し、システムで lib が使用可能であると仮定します (glibc など)。こちらをご覧ください

簡単に言えば、自立は単なる言語です。ライブラリといくつかのヘッダーのみをサポートする必要はありません (主に一般的な型と、数値制限などの実装固有のもの)。これは、標準ライブラリが存在する必要がないことを意味し、対応するヘッダーも存在しません。理由は、ファイルやディスプレイなどの機能を備えていない可能性が最も高い独立した環境です。これは、カーネル、ベアメタル組み込みなどに使用されます。

たとえば、ホスト環境 ( ) 用にコンパイルする場合、gcc は-fhosted、標準ライブラリで使用される関数に対応する意味があると想定し、非常に積極的な最適化を適用する可能性があることに注意してください (これらの関数の多くが組み込まれています)。独立型の場合、実際にはそうではないため、strcmpたとえば完全に異なるセマンティクスを持つ関数を使用できます。ただし、構造体の代入などの通常のコードに使用される mem...-関数が存在することを前提としています。

そのため、ベアメタル用にビルドする場合は、常に を渡す必要があります-ffreestanding

ホストされた実装が自分自身をfreestandingと呼ぶ場合、それは明らかにホストされた実装ではありません。ただし、自分自身をホストと呼ぶと、標準で必要なすべての機能を提供する必要があり、ダミーを実装するだけではなく、標準で定義されているセマンティクスを提供する必要があります。

明確に述べると、引用されたセクションにより、リストされたいくつかのヘッダーを除いて、独立した環境でライブラリのすべての機能を省略することができます。したがって、他のライブラリを提供して同じ名前を使用することは自由ですが、好きなことをしてください。それは標準ライブラリではないため、準拠する必要はありません。

5.1.2.1はさらに、「節 4 で必要とされる最小限のセット以外の、独立したプログラムで利用可能なライブラリ機能は実装定義である」と述べています。それは私の声明を支持します。main()補足:プログラムのエントリ ポイントとしても必要ありません。

于 2015-06-14T01:47:20.020 に答える
2

標準が定義するホストされたそれぞれ独立した実装は、最小限の定義です。どちらのバリアントも、さまざまな実際のシステムに合理的に実装できる最小の共通分母です。

このような最小限の実行可能なセットを定義する根拠は、理想的にはそれぞれのフレーバーに準拠するすべての実装で期待される結果でコンパイルおよび実行するために、2 つのフレーバーのいずれかを対象とするプログラムがどのように見える必要があるかを指定することです。

標準(つまり、いずれか) に厳密に準拠するプログラムは、最大限に移植性があります。

言うまでもなく、実際に存在する実装は、独立型とホスト型の両方で、通常、大量の拡張機能を提供します。これは、標準に関する限りは問題ありませんが、拡張機能が厳密に準拠したプログラムを無効にしてはならないという 1 つの警告があります。

あなたの質問に戻ります。標準が作る違い、つまり理論は明らかです。実際に既存の実装 — プラクティス — は、標準の最小要件の間またはそれを超える広い範囲に分類されますが、厳密に準拠するプログラム (ホストされた実装または独立した実装を対象とし、拡張機能に依存しない) に関する「動作を変更してはならない」という条項に拘束されます。

ちなみに、標準ライブラリのダミー関数に関する例は正しいです。独立した実装の場合、これらは許可された拡張機能の面白いケースです。独立した環境を対象とする厳密に準拠したプログラムはとにかくそれらを呼び出しません。ホスト環境の一部として、それらは準拠していますが役に立たないでしょう。(実際には、特定のシステム リソースが使い果たされた場合や、テスト スタブの実装である場合に、このような状況に遭遇する可能性があります。)

于 2019-12-08T11:48:55.933 に答える
1

多くの種類の異なる実行プラットフォームをターゲットとする多くの種類の C 実装があり、その多くはさまざまな便利な機能を提供し、他の実装ではできないことを保証します。標準の作成者は、ほとんどの場合、さまざまなプラットフォームとアプリケーション分野を対象とする実装によってどのような機能と保証が提供されるべきか、およびそれらがどのように提供されるべきかが十分に明白であるべきであり、標準を持つ必要はないと判断しました。そのような詳細に関心を持っています。一方、ファイル I/O などを必要とするアプリケーションの数と、それらを提供できるプラットフォームの数は、そのような機能を含む実装を「特別な」ものとして認識するのに十分でした。

一般に、独立した使用のために設計された実装は、ホストされた実装を有効に処理できないプラットフォームで使用できます。標準は、一部の小規模な C プラットフォームでは実用的ではない要件を課していますが、C のほぼ適合する実装の一部は、256 命令と 16 バイト相当の変数を保持するのに十分な記憶域しかないプロセッサで非常に有効に使用できます。デジタル キッチン温度計/タイマー ガジェットのようなものにファイル システムやコンソールがない場合、標準出力の記述子などにストレージを浪費する必要があるのはなぜでしょうか?

さらに、標準では、独立したアプリケーションが I/O を実行できる標準的な手段を定義していないため、プラットフォームによって I/O の処理方法が異なるため、ほとんどの独立したアプリケーションは、特定のターゲット プラットフォームまたはプラットフォームの範囲を対象としています。基礎となるプラットフォームが提供する本来の機能や保証を公開しないホストされた実装は、そのような機能や保証を必要としないプログラムを実行するのに役立ちます。ただし、組み込みプログラムがプラットフォーム固有の機能と保証を使用せずに多くのことを行うことは不可能であるため、プログラマーがそのようなものにアクセスできない独立した実装では、多くのことを行うことができません。高品質の実装では、プログラマーが必要なことを達成するのに役立つ可能性のある機能または保証を使用できるようにする必要がありますが、奇妙なことをしないようにするためにコンパイルオプションを使用する必要がある場合もあります。何らかの理由で、規格委員会による決定を考慮することが流行になっています。機能または保証の価値がコストを正当化しないいくつかの実装およびアプリケーション分野。これは、低レベルのプログラミングで役立ち、プラットフォームが提供する機能または保証を実装が提供することをプログラマーが期待すべきではないことを示すものです。本質的にゼロコストとして。

于 2017-04-04T22:29:19.020 に答える