7

GCCに関するこの公式マニュアルを読みました。テキストの翻訳で問題が発生することがあります。6 ページ目 (第 2.1 章) で、私はそのようなテキストの断片を理解できません:

ISO C 標準では、(4 節で) 準拠する実装の 2 つのクラスが定義されています。適合するホストされた実装は、すべてのライブラリ機能を含む標準全体をサポートします。<float.h>準拠する独立した実装は、特定のライブラリ機能を提供するためにのみ必要 <limits.h>です。AMD1 以降、 にあるものも; C99 以降、 および にあるものも; そしてC11以降、それらも <stdarg.h><stddef.h><iso646.h><stdbool.h><stdint.h><stdalign.h>と 。さらに、C99 で追加された複合型は、独立した実装には必要ありません。標準では、プログラムの 2 つの環境も定義されています。すべての実装に必要であり、プログラムの起動と終了の処理が実装定義である、独立した実装に必要なライブラリ機能を超えるライブラリ機能を持たない独立した環境と、ホストされた環境です。すべてのライブラリ機能が提供され、起動は関数int main (void)またはint main (int, char *[]). OS カーネルは独立した環境になります。オペレーティング システムの機能を使用するプログラムは、通常、ホストされた実装になります。

私はそれを正しく理解しているかどうかわかりません...

私がそれをどのように理解したかを言い換えます:

  1. ISO C 標準の 2 つの実装が存在します: フル (準拠するホストされた実装として名前が付けられます) とライト (準拠する独立した実装として名前が付けられます)。
  2. ホスト環境 (完全な標準の場合) と独立した環境 (ライト標準の場合) の 2 つの環境 (標準の実装ごとに) が存在します。

軽量版はOS開発用です。フルバージョンは、OS で動作するプログラム用です。

mainそして、関数に関するフレーズがわかりませんでした。

この文章の断片について説明してほしい。

4

3 に答える 3

12

それは両方のビットです。

この標準では、2つのランタイム環境が定義されています。1つには、すべての言語に加えて、標準のランタイムライブラリの小さなサブセットに加えて、追加の実装定義のものがあります。これは独立した環境であり、(ご想像のとおり)ベアメタル(OSカーネルなど)でのプログラミングを目的としています。

もう1つのより洗練された環境には、上記のすべての機能に加えて、すべての標準ランタイムライブラリが含まれます。これは、アプリケーションプログラミングを目的としたホスト環境です。

現在、実装に必要なのは、自立型環境の機能のみです。それがすべてである場合、それは独立した実装と呼ばれます。深く組み込まれたマイクロコントローラー用のクロスコンパイラーは、多くの場合、独立した実装です。これは、標準のCランタイムの多くが意味をなさないか、大きすぎて収まらないためです。

ホスト環境の実装はオプションです。実装がホスト環境を提供する場合、それはホスト実装と呼ばれます。ホストされた実装は、自立型環境、つまり自立型実装の機能のみが使用可能なコンパイルモードも提供する必要があります。(このモードは通常、Cランタイム自体のようなものをコンパイルするために使用されますが、そのほとんどはCです。)

main最後に、 (int main(void)およびint main(int, char **))の標準署名は、ホストされた環境の一部です。自立型環境でもこれらの署名を使用できますが、の署名をmain好きなように定義したり(void main(void)一般的)、エントリポイントに別の名前を使用したりすることもできます。

于 2012-12-04T19:22:47.940 に答える
5

C11 4/6:

準拠する実装の2つの形式は、ホスト型と独立型です。準拠するホスト型実装は、厳密に準拠するプログラムを受け入れるものとします。適合自立型実装は、ライブラリ節(第7節)で指定された機能の使用が標準ヘッダーの内容に限定されている厳密に適合したプログラムを受け入れるものとします<float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, and <stdnoreturn.h>

最初に、C標準のコンテキストでの「実装」は、「Cコンパイラの実装」を意味し、他には何も意味しないことに注意してください。

あなたがあなたの質問で正しく述べているように、自立型の実装は、その下にオペレーティングシステムを持つことを意図していないシステムのためのコンパイラです。言い換えると、独立した実装コンパイラは、「ベアボーン」CPUで実行される組み込みアプリケーションであるプログラム、またはそれ自体がオペレーティングシステムであるプログラムを生成します。ホストされた実装は、OS上で実行されるアプリケーションを対象としたコンパイラです。

自立型アプリケーション用のコンパイラは、上記のヘッダーを提供するだけで済みます。残りのヘッダー(stdio.hなど)は、前述の標準の「第7節」で定義されていますが、独立した実装では必須ではありません。

ただし、いくつかのライブラリは、ホスト型実装にも自立型実装にも必須ではないことに注意してください。たとえば、複素数ライブラリ:C11 7.3.1:

「マクロを定義する実装__STDC_NO_COMPLEX__は、このヘッダーを提供したり、その機能をサポートしたりする必要はありません。」

さらに、独立型とホスト型の2つの異なる実行環境では、main()の構文が異なります。詳細については、こちらを参照してください。プログラマーの間でよくある誤解は、Cで許可されている形式はであるということですint main()。これは、ホストされた環境でのみ当てはまります。

たとえば、自立型プログラムは、リセットされていない割り込みサービスルーチンで開始できます。そこからvoid main()関数を呼び出すことも、他の関数を完全に呼び出すこともできます。これは実装定義です。

于 2012-12-04T20:06:16.373 に答える
1

つまり、起動時に main() 関数を実行するために独立した環境は必要ありません。たとえば、代わりに _main() を探している可能性があります (正確な名前と署名は実装で定義されています)。

于 2012-12-04T19:11:10.350 に答える