Categories: 未分類

ブロック(C言語拡張)

Blocks_(C_language_extension)
ブロックは、で追加された非標準の拡張であるアップル社にクランさんの実装C、C ++、およびObjective-Cの使用プログラミング言語ラムダ式を作成するための構文様クロージャをこれらの言語の中に。ブロックは、Mac OS X10.6以降およびiOS4.0以降用に開発されたプログラムでサポートされていますが、サードパーティのランタイムではMac OS X10.5およびiOS2.2以降およびApple以外のシステムでの使用が許可されています。
Appleは、Grand Central Dispatchスレッドアーキテクチャのプログラムを簡単に作成できるようにするという明確な目標を持ってブロックを設計しましたが 、そのアーキテクチャから独立しており、他の言語のクロージャとほぼ同じように使用できます。Appleは独自のブランチに両方のブロックを実施しているGNUコンパイラコレクションと上流にクラン LLVMコンパイラのフロントエンド。ブロックの言語ランタイムライブラリのサポートは、LLVMプロジェクトの一部としても利用できます。Khronosグループは、ブロック構文を使用して、OpenCLのバージョン2.0以降のカーネル内からカーネルをキューに入れます。
関数定義と同様に、ブロックは引数を取り、内部で独自の変数を宣言できます。通常のC関数定義とは異なり、それらの値は周囲のコンテキストから状態をキャプチャできます。ブロック定義は、ブロック内のコードへの参照と、定義時のローカルスタック変数の現在の状態のスナップショットの両方を含む不透明な値を生成します。ブロックは、関数ポインタと同じ方法で後で呼び出すことができます。ブロックは変数に割り当てられたり、関数に渡されたり、通常の関数ポインターのように扱われたりできますが、アプリケーションプログラマー(またはAPI)は、のスコープ外で使用する場合、特別な演算子(Block_copy)でブロックをマークする必要がそれが定義されました。
ブロック値を指定すると、ブロック内のコードは、関数の呼び出しに使用されるのと同じ構文を使用して、後で呼び出すことで実行できます。

コンテンツ
1 例
1.1 コンパイルして実行する
2 GCCの入れ子関数との関係
3 も参照してください
4 参考文献
5 外部リンク


周囲のスコープで可変状態をキャプチャする簡単な例は、整数範囲のイテレータです:
/ *ブロック-test.c * /#include #include / * intを返すものを何も受け取らないブロックのタイプ* /typedef int (^ IntBlock )(); IntBlock MakeCounter (int start 、int incremental ){ __block int i = start ; リターンBlock_copy (^ (無効){ int ret = i ; i + =増分; retを返す; }); }int main (void ){ IntBlock mycounter = MakeCounter (5 、2 )。 printf (”最初の呼び出し:%d n ” 、mycounter ()); printf (”2回目の呼び出し:%d n ” 、mycounter ()); printf (”3回目の呼び出し:%d n ” 、mycounter ()); / *コピーされたため、リリースする必要があります* / Block_release (mycounter ); 0を返す; }

コンパイルして実行する
$ clang -fblocksblocks-test.c #Mac OS X $ ./a.out最初の呼び出し:5 2番目の呼び出し:7 3番目の呼び出し:9
ブロックランタイムは、一部のシステムでデフォルトでリンクされているCライブラリの一部ではありません。この場合、このライブラリに明示的にリンクする必要が
$ clang -fblocksblocks-test.c -lBlocksRuntime #Linux
ランタイムはclangのランタイムの一部ですが、clangパッケージと一緒にインストールされない場合がcompiler-rtから抽出されたスタンドアロンランタイムが利用可能です。

GCCの入れ子関数との関係
ブロックは、字句スコープの入れ子関数をサポートするためのGCCのCの拡張に表面的に似ています。ただし、ブロックとは異なり、GCCのネストされた関数は、含まれているスコープが終了した後に呼び出すことはできません。これにより、未定義の動作が発生します。
GCCスタイルのネストされた関数は、ネストされた関数のアドレスを取得するときに、現在ほとんどのアーキテクチャで実行可能サンクの動的作成を使用しています。ほとんどのアーキテクチャ(X86を含む)では、これらのサンクはスタック上に作成されるため、スタックの実行可能ファイルをマークする必要が実行可能スタックは、一般的に潜在的なセキュリティホールと見なされます。ブロックは実行可能サンクを使用する必要がないため、この弱点を共有しません。一方、ブロックはポインターにまったく新しい型を導入しますが、GCCのネストされた関数へのポインターは通常の関数ポインターであり、既存のコードで直接使用できます。

も参照してください
クロージャ(コンピュータサイエンス)
語彙スコープ
ラムダ(プログラミング)
スパゲッティスタック
サンク(関数型プログラミング) XNU C ++ 11(「ラムダ式」を含む)

参考文献
^ 「のトピックをプログラミングブロック」。アップルデベロッパ。AppleInc 。
^ https://code.google.com/p/plblocks/ ^ 「GrandCentralDispatch」(PDF)(テクノロジーブリーフ)。アップル。2009-09-03。2009年9月20日にオリジナル(PDF)からアーカイブされました。
^ シラクーサ、ジョン「MacOSX 10.6 Snow Leopard:Ars Technicaレビュー:ブロック」。ArsTechnica。
^ Munshi、Aaftab、ed。(2013-07-13)。「OpenCLC仕様。バージョン2.0。ドキュメントリビジョン11」(PDF)。クロノスOpenCLワーキンググループ。NS。173. 2013-11-05のオリジナル(PDF)からアーカイブ。
^ ベングソン、ヨアヒム。「AppleデバイスでのCブロックを使用したプログラミング」。
^ 「mackyle / blocksruntime:スタンドアロンブロックランタイム」。
^ 「ネストされた関数:GNUコンパイラコレクション(GCC)の使用」。

外部リンク
「Clang言語拡張:ブロック」。LLVMプロジェクト。
” “コンパイラ-rt “ランタイムライブラリ”。LLVMプロジェクト。

admin

Share
Published by
admin

Recent Posts

Bqosta

Bqosta Bqosta(ア…

4週間 ago

Bqerzla

Bqerzla Bqerzla…

4週間 ago

Bqarqacha

Bqarqacha Bqarq…

4週間 ago

Bqaatouta

Bqaatouta  「Bqa…

4週間 ago

Bqaa Safrine

Bqaa_Safrine Bq…

4週間 ago

ベルギー郵政

Bpost  「Bpost」 …

4週間 ago