プロトコルバッファ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
プロトコルバッファ
開発者グーグル
初回リリース2001年初頭(内部)[1]
2008年7月7日(公開) (2008-07-07
安定リリース
3.19.3  ウィキデータでこれを編集する / 2022年1月11日; 32日前[2] (2022年1月11日
リポジトリ
で書かれているC ++、C#、Java、Python、JavaScript、Ruby、Go、PHP、Dart
オペレーティング・システムどれでも
プラットホームクロスプラットフォーム
タイプシリアル化フォーマットとライブラリ、IDLコンパイラ
ライセンスBSD
Webサイト開発者.google.com / protocol- buffers / Wikidataでこれを編集します

Protocol BuffersProtobuf)は、構造化データのシリアル化に使用される無料のオープンソース クロスプラットフォームデータ形式です。ネットワークを介して相互に通信したり、データを保存したりするプログラムの開発に役立ちます。この方法には、一部のデータの構造を記述するインターフェイス記述言語と、構造化データを表すバイトのストリームを生成または解析するためにその記述からソースコードを生成するプログラムが含まれます。

概要

Googleは、内部使用のためにプロトコルバッファを開発し、オープンソースライセンスの下で複数の言語用のコードジェネレータを提供しました(以下を参照)。

プロトコルバッファの設計目標は、シンプルさとパフォーマンスを強調しました。特に、 XMLよりも小さく高速になるように設計されています[3]

プロトコルバッファは、あらゆる種類の構造化情報を保存および交換するためにGoogleで広く使用されています。このメソッドは、Googleのほぼすべてのマシン間通信に使用されるカスタムリモートプロシージャコール(RPC)システムの基盤として機能します。[4]

プロトコルバッファは、Apache Thrift(Facebook、Evernoteで使用)、Ion(Amazonで作成)、またはMicrosoft Bondプロトコルに似ており、 gRPCと呼ばれる定義済みサービスに使用する具体的なRPCプロトコルスタックも提供します。[5]

データ構造(メッセージと呼ばれる)とサービスは、プロト定義ファイル(.proto)に記述され、でコンパイルされprotocます。このコンパイルにより、これらのデータ構造の送信者または受信者が呼び出すことができるコードが生成されます。たとえば、example.pb.ccexample.pb.hはから生成されexample.protoます。それらは、の各メッセージとサービスのC ++example.protoクラスを定義します。

正規には、メッセージは、コンパクトで、前方および後方互換性がありますが、自己記述型ではないバイナリ ワイヤ形式にシリアル化されます(つまり、外部指定なしでフィールドの名前、意味、または完全なデータ型を伝える方法はありません)。Protocol Buffersファイル内にそのような外部仕様(スキーマ)を含めたり参照したりするための定義された方法はありません。公式にサポートされている実装にはASCIIシリアル化形式が含まれていますが[6]、この形式は自己記述的ですが、前方互換性と後方互換性の動作を失うため、デバッグ以外のアプリケーションには適していません。

Protocol Buffersの主な目的はネットワーク通信を容易にすることですが、そのシンプルさと速度により、ProtocolBuffersはデータ中心のC ++クラスおよび構造体に代わるものになります。特に、将来、他の言語やシステムとの相互運用性が必要になる可能性があります。

プロトコルバッファの特定の使用のためのスキーマは、各フィールドを識別するために整数を使用して、データ型をフィールド名に関連付けます。(プロトコルバッファデータには、フィールド名ではなく数値のみが含まれているため、データにフィールド名が含まれているシステムと比較して、帯域幅/ストレージをいくらか節約できます。)

//polyline.proto
構文 =  "proto2" ;

メッセージ ポイント {
  必須 int32x  = 1 ; _  必要int32y = 2 ; オプションの文字列ラベル= 3 ; } 
      
      


メッセージ  {
  必須 ポイント 開始 =  1 ; 
  必要な ポイント エンド =  2 ; 
  オプションの 文字列 ラベル =  3 ; 
}

メッセージ ポリライン {
  繰り返し ポイント ポイント =  1 ; 
  オプションの 文字列 ラベル =  2 ; 
}

「ポイント」メッセージは、2つの必須データ項目xyを定義します。データ項目ラベルはオプションです。各データ項目にはタグがあります。タグは等号の後に定義されます。たとえば、xにはタグ1があります。

「Line」メッセージと「Polyline」メッセージはどちらもPointを使用しており、ProtocolBuffersで合成がどのように機能するかを示しています。ポリラインには、ベクトルのように動作する繰り返しフィールドがあります。

このスキーマは、その後、1つ以上のプログラミング言語で使用するためにコンパイルできます。Googleは、protocC ++、Java、またはPythonの出力を生成できると呼ばれるコンパイラを提供しています。他のスキーマコンパイラは他のソースから入手でき、20を超える他の言語の言語依存の出力を作成します。[7]

たとえば、上記のプロトコルバッファスキーマのC ++バージョンが生成された後、C ++ソースコードファイルpolyline.cppは次のようにメッセージオブジェクトを使用できます。

// polyline.cpp 
#include "polyline.pb.h"   // "protocpolyline.proto"を呼び出して生成 

Line * createNewLine const std :: string name {    
  //(10、20)から(30、40)までの線を作成します
Line * line = new Line ;      
  -> mutable_start ()-> set_x 10 );
  -> mutable_start ()-> set_y 20 );
  -> mutable_end ()-> set_x 30 );
  -> mutable_end ()-> set_y 40 );
  -> set_label 名前);
  リターンライン; 
}

ポリライン* createNewPolyline (){  
  //(10,10)と(20,20)をポイントとするポリラインを作成し
ますPolyline * polyline = new Polyline ;      
  ポイント* point1 =ポリライン-> add_point ();   
  point1- > set_x 10 );
  point1- > set_y 10 );
  ポイント* point2 =ポリライン-> add_point ();   
  point2- > set_x 20 );
  point2- > set_y 20 );
  ポリラインを返す; 
}

言語サポート

Protobuf 2.0は、C ++JavaC#[8]およびPython用のコードジェネレーターを提供します。[9]

Protobuf 3.0は、C ++Java (JavaNano、低リソース環境向けの方言を含む)、PythonGoRubyObjective-CC#用のコードジェネレーターを提供します。[10] 3.0.0-beta-2以降のJavaScriptもサポートしています。[11]

Ballerina[12] C[13] [14] C ++[15] DartElixir[16] [17] Erlang[18] Haskell[19] JavaScript[20 ]のサードパーティ実装も利用できます。 ] PerlPHPR[21] Rust[22] [23] [24] ScalaSwift[25] Julia [26]およびNim[27]


も参照してください

参考文献

  1. ^ 「よくある質問|プロトコルバッファ」GoogleDevelopers2016年10月2日取得
  2. ^ 「リリース-google / protobuf」–GitHub経由
  3. ^ Eishayスミス。「jvm-serializersベンチマーク」2010年7月12日取得
  4. ^ ケントンバルダ。「スティーブビノスキへの返答」2008年0月14日取得
  5. ^ "grpc"grpc.io。_ 2016年10月2日取得
  6. ^ "text_format.h-プロトコルバッファ-Googleコード" 2012年3月2日取得
  7. ^ ThirdPartyAddOns-protobuf-サードパーティのアドオンへのリンク。-プロトコルバッファ-Googleのデータ交換フォーマット-GoogleプロジェクトホスティングCode.google.com。2013年9月18日に取得。
  8. ^ 「C#のプロトコルバッファ」コードのブロック2017年5月12日取得
  9. ^ 「プロトコルバッファ言語ガイド」GoogleDevelopers 2016年4月21日取得
  10. ^ 「言語ガイド(proto3)|プロトコルバッファ」GoogleDevelopers 2020年8月9日取得
  11. ^ 「リリースプロトコルバッファv3.0.0-beta-2・protocolbuffers / protobuf」GitHub 2020年8月9日取得
  12. ^ 「バレリーナ-GRPC」
  13. ^ 「Nanopb-小さいコードサイズのプロトコルバッファ」2017年12月12日取得
  14. ^ 「Cでのプロトコルバッファの実装」2017年12月12日取得
  15. ^ 「組み込みProto-マイクロコントローラー用のProtobuf」2021年8月15日取得
  16. ^ 「プロトックス」2021年10月25日。
  17. ^ 「Protobuf-elixir」2021年10月26日。
  18. ^ 「トーマス-アブラハムソン/ GPB」2021年10月19日。
  19. ^ 「プロトレンズ」2021年10月16日。
  20. ^ 「JavaScript用のプロトコルバッファ」github.com 2016年5月14日取得
  21. ^ 「マスターのRprotobuf / SRC・eddelbuettel / Rprotobuf」
  22. ^ 「Rust-protobuf」2021年10月26日。
  23. ^ 「PROST!」2021年8月21日。
  24. ^ 「Quick-protobuf」2021年10月12日。
  25. ^ 「SwiftProtobuf」2021年10月26日。
  26. ^ 「ThirdPartyAddOns-protobuf-サードパーティのアドオンへのリンク。-プロトコルバッファ-Googleのデータ交換フォーマット-Googleプロジェクトホスティング」2012年11月7日取得
  27. ^ 「マクロシステムの能力を活用して外部ツールに依存しない純粋なNimでのProtobufの実装」GitHub2021年10月21日。

外部リンク