コンピュータプログラミングにおいて、標準ライブラリとは、プログラミング言語の様々な実装で利用できるライブラリのことである。多くの場合、標準ライブラリは関連するプログラミング言語の仕様によって規定されるが、言語コミュニティのより非公式な慣習によって一部または全部が定められる場合もある。
一部のプログラミング言語では、標準ライブラリの中核となる部分を定義し、それはすべての実装で利用可能でなければならない一方、その他の部分はオプションで実装できるようにしている。
多くの言語では、標準ライブラリは独自のネームスペースを持つことが多い。例えば、C++、D、Rust はstd::*を標準ライブラリのネームスペースとして使用する。C # はを使用しSystem.*、Java はjava.*、javax.*および を使用するjdk.*。しかし、PythonやGoのような一部の言語では、「標準ライブラリのネームスペース」や、標準ライブラリに属するモジュールの共通のプレフィックスは存在しない。
コア言語の側面で定義されているように、コア言語とその標準ライブラリの境界線は比較的曖昧です。言語設計者が意図的に両者を分離しているにもかかわらず、プログラマーは両者を混同する可能性があります。
コア言語とその標準ライブラリの境界は、コア言語の構成要素を標準ライブラリの観点から定義することで、一部の言語ではさらに曖昧になっています。例えば、Javaでは文字列リテラルをクラスのインスタンスとして定義していますjava.lang.String。Smalltalkでは、匿名関数式(「ブロック」)をライブラリのBlockContextクラスのインスタンスとして定義しています。Schemeでは、コア言語として実装すべき部分と標準ライブラリとして実装すべき部分が明確に規定されていません。
コア言語で利用可能な構成要素に応じて、標準ライブラリには以下が含まれる場合があります。
一般的に提供される機能には以下が含まれます。
標準ライブラリの設計思想は多岐にわたる。例えば、C++の設計者であるビャルネ・ストロヴストルップは次のように述べている。
標準 C++ ライブラリには何が含まれるべきでしょうか? 理想としては、プログラマーがライブラリ内で興味深く、重要で、かつ十分に汎用的なクラス、関数、テンプレートなどをすべて見つけられることです。しかし、ここで問われているのは「何らかのライブラリには何が含まれるべきか」ではなく、「標準ライブラリには何が含まれるべきか」です。「すべて!」という答えは、前者の質問に対する妥当な最初の近似値ですが、後者の質問に対する答えではありません。標準ライブラリは、すべてのプログラマーが利用できるように、すべての実装者が提供しなければならないものです。[ 1 ]
これは、大規模なソフトウェア群を構築する際に「すべてのプログラマー」が合理的に必要とするであろう構成要素のみを含む、比較的小規模な標準ライブラリを示唆しています。これは、 CおよびC++標準ライブラリで採用されている哲学です。その結果、C標準ライブラリとC++標準ライブラリは、例えばJava標準ライブラリやC#標準ライブラリ(より広範な機能を備えている)と比較して、規模と範囲が大幅に小さくなっています。
対照的に、Pythonの設計者であるグイド・ファン・ロッサムは、標準ライブラリに関してより包括的なビジョンを採用している。Pythonは、コーディングが容易なオブジェクト指向の高水準言語を提供しようとしている。Pythonのチュートリアルの中で、彼は次のように書いている。
Pythonには「必要なものがすべて揃っている」という哲学があります。これは、その大規模なパッケージの洗練された堅牢な機能を通して最もよくわかります。[ 2 ]
ヴァン・ロッサムは、 XML、XML-RPC、電子メール メッセージ、ローカライズを処理するためのライブラリを列挙しているが、これらはC++ 標準ライブラリには含まれていない機能である。この別の考え方は、スクリプト言語( PythonやRubyなど) や、Javaや.NET Framework言語のように仮想マシンを使用する言語によく見られる。C++ では、このような機能は標準ライブラリの一部ではなく、 BoostやPOCOなどの他のライブラリに含まれている。Java では、以前は標準ライブラリであったJava Platform、Enterprise Edition (現在は Jakarta EE) およびJavaFX が、個別の独立したライブラリに移動された。