この記事には複数の問題があります。改善
やノートページでの議論にご協力ください。ランタイムライブラリ(英: run-time library)は、標準Cライブラリなど、コンピュータプログラムの実行時(ランタイム)にメインプログラムと常に同時に存在して利用される前提のライブラリである。 C言語ではmain関数を実行した直後、<stdio.h>に定義されたstdoutを参照すると標準出力のファイルポインタを得ることができる。また、main関数の引数を参照すればコマンドライン引数の文字列を参照することができる。これらはオペレーティングシステム (OS) やコンパイラが初期化しているものではなく、main関数を呼び出している関数が更に存在しその中に「スタートアップルーチン」とよばれる初期化処理と解放処理が存在しているからである[1][2][3]。また、putsといった標準ライブラリの関数はランタイムライブラリの中に実装されているため、別途明示的なリンク指定をすることなくヘッダーの#includeをするだけで使うことができる。これらのスタートアップルーチンや標準関数といった、言語に必要な標準的機能を提供するライブラリがランタイムライブラリである。 CランタイムライブラリはシステムコンポーネントとしてOSに標準搭載されていることもある。GNU CライブラリからフォークしたLinux libc、AndroidのBionic libc ランタイムライブラリは一般的なライブラリと異なり、言語機能を支える側面から処理系の一部という性格が強い。特にC++では、例外処理や、new、delete、ユーザー定義のコンストラクタを持つ型の静的変数といった、コンパイル時のコード生成では冗長でコードが肥大化してしまう言語機能が存在し、それらの機能は(共通化されたサブルーチンとしての)ランタイムライブラリの関数に依存している。他の言語でもっと大きなものの例としてはガベージコレクションの機能などがある[要出典]。このため一般的なライブラリと異なり、ランタイムライブラリは明示的にリンク指定をしなくても処理系のリンカによって自動でリンクされる。また、ランタイムライブラリはデバッグ用とリリース用など、用途に応じて一つの環境に複数存在するが、処理系のリンカはコンパイルオプションやリンクオプションに応じて適切なランタイムライブラリを選択する[2]。 必然的にリンクされるものであり、インタフェース的にも密結合であることから、(動的リンクがサポートされている環境でも)静的リンクされることも多い。同様に、ダイナミックリンクライブラリで提供されていて動的リンクする場合でも、必要に応じて遅延ロードするのではなく、プロセスの起動時に一括で早期ロードされることもある。 CおよびC++には言語仕様によってOSに依存しないフリースタンディング環境が定められている。Cにおけるフリースタンディング環境では標準ライブラリとして関数が一切存在しない。また、エントリーポイントもmainである必要がなく、グローバル変数等の初期化もいらない。Cにおけるフリースタンディング環境ではランタイムライブラリを必要としない。ただしC++についてはOSなしの環境でも最低限の言語機能を実現するためランタイムライブラリを必要とする。 ランタイムライブラリを除去する方法はフリースタンディング環境だけでなく、処理系のオプションによって強制的に実現することもできる。gccでは-nodefaultlibs[5]を指定し、Microsoft Visual C++では/NODEFAULTLIB[6]を指定する。標準のランタイムライブラリを除去することにより実行ファイルを軽量化したり、TinyCRTのような第三者提供のランタイムライブラリ[7]を使用することができるようになる。
概要
処理系との関係
ランタイムライブラリの除去