プロトコルバッファ

プロトコルバッファ
開発者グーグル
初回リリース2001 年初頭 (内部) [1]
2008 年 7 月 7 日(公開) (2008-07-07)
安定版リリース
23.3  / 2023 年 6 月 14 日; 43日前[2] (14 June 2023)
リポジトリ
  • github.com/protocolbuffers/protobuf
で書かれているC++、C#、Java、Python、JavaScript、Ruby、Go、PHP、Dart
オペレーティング·システムどれでも
プラットホームクロスプラットフォーム
タイプシリアル化フォーマットとライブラリ、IDLコンパイラ
ライセンスBSD
Webサイトprotobuf.dev

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

概要

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

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

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

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

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

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

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

制限事項

Protobuf には単一の仕様はありません。[8]この形式は、数メガバイトを超えない小さなデータの塊に最適で、すぐにメモリにロード/送信できるため、ストリーミング可能な形式ではありません。[9]ライブラリは、そのままでは圧縮を提供しません。この形式は、非オブジェクト指向言語 ( Fortranなど) でも十分にサポートされていません[10]

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

// ポリライン.proto
構文= "proto2" ;  

メッセージポイント{必須int32 x = 1 ; int32 y = 2が必要ですオプションの文字列ラベル= 3 ; }  
      
      
      


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


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

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

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

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

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

// Polyline.cpp 
#include "polyline.pb.h"   // "protoc Polyline.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 (名前); 戻り; }  
   


Polyline * 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#[12] 、およびPython用のコード ジェネレーターを提供します。[13]

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

Ballerina[16] C[17] [18] C++[19] DartElixir[20] [21] Erlang[22] Haskell[23] JavaScript[24] ではサードパーティ実装も利用できます。] PerlPHPProlog[25] [26] R[27] Rust[28] [29] [30] Scala[31] Swift[32] Julia[33]ニム[34]

こちらも参照

参考文献

  1. ^ "よくある質問 | プロトコル バッファ". Google 開発者2016 年10 月 2 日に取得
  2. ^ 「リリース - google/protobuf」 – GitHub経由。
  3. ^ エイシェイ・スミス。「jvm-serializers ベンチマーク」。GitHub2010 年 7 月 12 日に取得
  4. ^ ケントン・ヴァルダ。「スティーブ・ヴィノスキーへの返答」2008 年 7 月 14 日に取得
  5. ^ "grpc". grpc.io 2016 年10 月 2 日に取得
  6. ^ "text_format.h - プロトコル バッファ - Google コード" . 2012 年 3 月 2 日に取得
  7. ^ "プロトコルのベスト プラクティス | プロトコル バッファーのドキュメント" . 2023 年 5 月 26 日に取得
  8. ^ 「概要」. protobuf.dev 2023-05-28に取得
  9. ^ 「概要」. protobuf.dev 2023-05-28に取得
  10. ^ 「概要」. protobuf.dev 2023-05-28に取得
  11. ^ ThirdPartyAddOns - protobuf - サードパーティのアドオンへのリンク。- プロトコル バッファ - Google のデータ交換形式 - Google プロジェクト ホスティング。コード.google.com。2013 年 9 月 18 日に取得。
  12. ^ "C# のプロトコル バッファー". コードブロック2017 年 5 月 12 日に取得
  13. ^ 「プロトコル バッファー言語ガイド」。Google 開発者2016 年 4 月 21 日に取得
  14. ^ “言語ガイド (proto3) | プロトコル バッファー”. Google 開発者2020年8月9日に取得
  15. ^ "プロトコル バッファー v3.0.0-beta-2 をリリース · プロトコルバッファー/protobuf". GitHub 2020年8月9日に取得
  16. ^ “バレリーナ - GRPC”.
  17. ^ "Nanopb - コード サイズが小さいプロトコル バッファ" . 2017 年 12 月 12 日に取得
  18. ^ "C でのプロトコル バッファーの実装". GitHub2017 年 12 月 12 日に取得
  19. ^ "組み込み Proto - マイクロコントローラー用 Protobuf" . 2021年8月15日に取得
  20. ^ 「プロトックス」。GitHub2021年10月25日。
  21. ^ 「プロトブフエリクサー」。GitHub2021年10月26日。
  22. ^ “トーマス・アブラハムソン/GPB”. GitHub2021年10月19日。
  23. ^ 「プロトレンズ」。GitHub2021年10月16日。
  24. ^ "JavaScript のプロトコル バッファ". github.com 2016 年 5 月 14 日に取得
  25. ^ "SWI-Prolog: Google のプロトコル バッファ ライブラリ".
  26. ^ "SWI-Prolog / contrib-protobufs" . 2022 年 4 月 21 日に取得
  27. ^ “RProtoBuf”. GitHub
  28. ^ “Rust-protobuf”. GitHub2021年10月26日。
  29. ^ 「プロスト!」。GitHub2021年8月21日。
  30. ^ “クイックプロトバッファ”. GitHub2021年10月12日。
  31. ^ 「スカラPB」。GitHub2022 年9 月 27 日に取得
  32. ^ "Swift Protobuf". GitHub2021年10月26日。
  33. ^ "ThirdPartyAddOns - protobuf - サードパーティ アドオンへのリンク。 - プロトコル バッファ - Google のデータ交換形式 - Google プロジェクト ホスティング" . 2012 年 11 月 7 日に取得
  34. ^ 「外部ツールに依存しないマクロ システムの力を活用する純粋な Nim での Protobuf 実装」。GitHub2021年10月21日。

外部リンク

  • 公式ドキュメント(developers.google.com)
  • GitHubの protobuf