コンピュータ ソフトウェアのコンパイラ理論では、組み込み関数(組み込み関数とも呼ばれる)は、特定のプログラミング言語で使用できる関数(サブルーチン)であり、その実装はコンパイラによって特別に処理されます。通常、インライン関数と同様に、元の関数呼び出しの代わりに自動生成された命令のシーケンスを置き換えることができます。[ 1 ]インライン関数とは異なり、コンパイラは組み込み関数について詳細な知識を持っているため、特定の状況に合わせてそれをより適切に統合および最適化できます。
組み込み関数を実装するコンパイラは、プログラムが最適化を要求した場合にのみそれらを有効にし、それ以外の場合は言語ランタイムシステム(環境)によって提供されるデフォルトの実装にフォールバックする場合があります。
組み込み関数は、ベクトル化や並列化を明示的に実装するために、そのような構造を扱わない言語でよく使用されます。たとえば、AltiVecやOpenMP などの一部のアプリケーション プログラミング インターフェイス(API) は、コンパイル時にそれぞれベクトル化可能な操作とマルチプロセッシング対応の操作を宣言するために組み込み関数を使用します。コンパイラは組み込み関数を解析し、ターゲットプラットフォームに適したベクトル演算またはマルチプロセッシングオブジェクト コードに変換します。一部の組み込み関数は、変数が取ることができない値など、オプティマイザに追加の制約を提供するために使用されます。[ 2 ]
Microsoft [ 3 ] Intel [ 1 ]およびGCC [ 4 ]のCおよびC++コンパイラは、 x86の単一命令複数データ( SIMD ) 命令 ( MMX、ストリーミング SIMD 拡張(SSE)、SSE2、SSE3、SSSE3、SSE4、AVX、AVX2、AVX512、FMAなど) に直接マッピングする組み込み関数を実装しています。組み込み関数を使用すると、通常 C/C++ ではアクセスできない標準アセンブリ命令 (例えば、 128 ビットおよび256 ビットでのビット スキャンおよび並列操作) にマッピングできます。
C および C++ コンパイラの中には、移植性のないプラットフォーム固有の組み込み関数を提供するものがあります。その他の組み込み関数 ( GNU組み込み関数など) は、より抽象化されており、いくつかの最新のプラットフォームの機能を近似し、適切な命令がないプラットフォームでは移植可能なフォールバック実装を提供します。 [ 5 ] glmやSonyのベクトル数学ライブラリなどの C++ ライブラリ[ 6 ]では、条件付きコンパイル(プラットフォーム固有のコンパイラフラグに基づく)によって移植性を実現するのが一般的です。これにより、適切な低レベルプログラミング言語実装にマッピングされた完全に移植可能な高レベルプリミティブ (たとえば、4 要素の浮動小数点ベクトル型) が提供され、C++ 型システムとインライン化のメリットも享受できます。そのため、C ABIを使用して手書きのアセンブリオブジェクトファイルにリンクするよりも有利です。
以下は、Intelの組み込み関数セットに含まれる組み込み関数のシグネチャの例です。
uint64_t __rdtsc (); // 内部 CPU クロックカウンタを返すuint64_t __popcnt64 ( uint64_t n ); // n に設定されているビット数uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 ビット * 64 ビット => 128 ビット乗算__m512 _mm512_add_ps ( __m512 a , __m512 b ); // 16 個の float の 2 つのベクトルに対して a + b を計算する__m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // 16 個の float の 3 つのベクトルに対して a*b + c を計算するCOBOLの組み込み関数モジュールは、ANSI INCITS X3.23a-1989およびISO 1989:1985/Amd 1:1992で導入されました。
HotSpot Java仮想マシン(JVM)のジャストインタイムコンパイラには、特定のJava API用の組み込み関数も含まれています。[ 8 ] HotSpotの組み込み関数は、 一部のプラットフォームで1つ以上の最適化された実装を持つ標準Java APIです。
ANSI/ISO PL/Iでは、約 90 個の組み込み関数が定義されています。[ 9 ]これらは慣例的に次のようにグループ化されています。[ 10 ] : 337–338
個々のコンパイラは、マシンアーキテクチャやオペレーティングシステムに特化した組み込み関数を追加している。
組み込み関数は、名前を宣言せずにデフォルト値を使用するか、または宣言することで識別されますBUILTIN。同じ名前のユーザー提供関数は、として宣言することで置き換えることができますENTRY。
組み込み関数
{{cite book}}: CS1 maint: 数値名: 著者リスト (リンク)