بروتوكول التخزين المؤقت

**بروتوكول التخزين المؤقت**  اختصارًا (**Protobuf**) هي تنسيق بيانات حُر، ومفتوح المصدر يعمل على عدة منصات يُستخدم في إجراء تسلسل للبيانات المهيكلة. يفيد في تطوير البرامج للتواصل مع بعضها البعض عبر شبكة أو لتخزين البيانات. تتضمن الطريقة لغة وصف الواجهة التي تصف بنية بعض البيانات والبرنامج الذي يولد شفرة المصدر من هذا الوصف لتوليد أو تحليل دفق البايت الذي يمثل البيانات المهيكلة.

## ملخص
طورت Google Protocol Buffers للاستخدام الداخلي وقدمت منشئ رمز للغات متعددة بموجب ترخيص مفتوح المصدر (انظر أدناه).

أكدت أهداف تصميم بروتوكول التخزين المؤقت على البساطة والأداء. على وجه الخصوص، تم تصميمه ليكون أصغر وأسرع من XML . تُستخدم بروتوكول التخزين المؤقت على نطاق واسع في Google لتخزين وتبادل جميع أنواع المعلومات المنظمة. تعمل هذه الطريقة كأساس لنظام استدعاء إجراء بعيد مخصص (RPC) يتم استخدامه تقريبًا لجميع الاتصالات بين الأجهزة في Google.

تشبه بروتوكول التخزين المؤقت المؤقتة Apache Thrift (التي يستخدمها Facebook ، وEvernote)، أو Ion (التي أنشأتها Amazon)، أو بروتوكولات Microsoft Bond ، وتقدم أيضًا حزمة بروتوكول RPC ملموسة لاستخدامها في خدمات محددة تسمى gRPC .

يتم وصف هياكل البيانات والخدمات في ملف تعريف `.proto` (.proto) ويتم تجميعها باستخدام `protoc` . ينشئ هذا التجميع رمزًا يمكن استدعاؤه بواسطة مرسل أو متلقي هياكل البيانات هذه. على سبيل المثال، يتم إنشاء `example.pb.cc` و `example.pb.h` `example.proto` . يعرّفون فئات ++C لكل رسالة وخدمة في `example.proto` .

من الناحية القانونية، يتم تسلسل الرسائل إلى تنسيق سلكي ثنائي يكون مضغوطًا ومتوافقًا مع الأمام والخلف، ولكنه لا يصف نفسه (أي، لا توجد طريقة لمعرفة الأسماء أو المعنى أو أنواع البيانات الكاملة للحقول بدون مواصفات خارجية). لا توجد طريقة محددة لتضمين أو الإشارة إلى مثل هذه المواصفات الخارجية () داخل ملف Protocol Buffers. يشتمل التطبيق المدعوم رسميًا على تنسيق تسلسل ASCII ،  ولكن هذا التنسيق - على الرغم من أنه يصف ذاتيًا - يفقد سلوك التوافق الأمامي والخلفي، وبالتالي لا يعد اختيارًا جيدًا للتطبيقات بخلاف التصحيح.

على الرغم من أن الغرض الأساسي للمخازن المؤقتة للبروتوكول هو تسهيل الاتصال بالشبكة، إلا أن بساطتها وسرعتها تجعل من المخازن المؤقتة للبروتوكول بديلاً لفئات وهياكل ++C المتمحورة حول البيانات، خاصةً حيث قد تكون هناك حاجة للتشغيل البيني مع لغات أو أنظمة أخرى في المستقبل.

## مثال
مخطط لاستخدام معين للمخازن المؤقتة للبروتوكول يربط أنواع البيانات بأسماء الحقول، باستخدام الأعداد الصحيحة لتحديد كل حقل. تحتوي بيانات المخزن المؤقت للبروتوكول على الأرقام فقط، وليس أسماء الحقول، مما يوفر بعض توفير عرض النطاق الترددي / التخزين مقارنة بالأنظمة التي تتضمن أسماء الحقول في البيانات. 
```protobuf
//polyline.proto
syntax = "proto2";

message Point {
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;
}

message Line {
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;
}

message Polyline {
  repeated Point point = 1;
  optional string label = 2;
}
```
تحدد رسالة «النقطة» عنصري بيانات إلزاميين، *x* و *y* . *تسمية* عنصر البيانات اختيارية. كل عنصر بيانات له علامة. يتم تحديد العلامة بعد علامة التساوي. على سبيل المثال، *x* لديه العلامة 1.

توضح الرسائل "Line" و "Polyline"، اللتان تستخدمان Point ، كيفية عمل التركيب في بروتوكول التخزين المؤقت. يحتوي Polyline على *حقل متكرر* يتصرف مثل المتجه.

يمكن بعد ذلك تجميع هذا المخطط لاستخدامه من قبل لغة برمجة واحدة أو أكثر. توفر Google `protoc` يسمى protoc والذي يمكنه إنتاج مخرجات لـ ++C أو Java أو Python. تتوفر برامج التحويل البرمجي للمخططات الأخرى من مصادر أخرى لإنشاء مخرجات تعتمد على اللغة لأكثر من 20 لغة أخرى.

على سبيل المثال، بعد إنتاج إصدار ++ C من مخطط المخزن المؤقت للبروتوكول أعلاه، يمكن لملف شفرة المصدر C ++ ، polyline.cpp ، استخدام كائنات الرسالة على النحو التالي:
```cpp
// polyline.cpp
#include "polyline.pb.h" // generated by calling "protoc polyline.proto"

Line* createNewLine(const std::string& name) {
  // create a line from (10, 20) to (30, 40)
  Line* line = new Line;
  line->mutable_start()->set_x(10);
  line->mutable_start()->set_y(20);
  line->mutable_end()->set_x(30);
  line->mutable_end()->set_y(40);
  line->set_label(name);
  return line;
}

Polyline* createNewPolyline() {
  // create a polyline with points at (10,10) and (20,20)
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  point1->set_x(10);
  point1->set_y(10);
  Point* point2 = polyline->add_point();
  point2->set_x(20);
  point2->set_y(20);
  return polyline;
}
```


## اللغات البرمجية المدعومة
يوفر Protobuf 2.0 مولد أكواد لـ ++C وJava و#C و  وPython .

يوفر Protobuf 3.0 مولد أكواد لـ ++ C ، وJava (بما في ذلك JavaNano ، وهي لغة مخصصة للبيئات منخفضة الموارد)، وPython ، وGo ، وRuby ، وObjective-C ، و#C . كما أنه يدعم JavaScript منذ 3.0.0-beta-2.

تتوفر تطبيقات الطرف الثالث أيضًا لـ Ballerina ،  C ،  C ++ ،  Dart ، Elixir ،  Erlang ،  Haskell ،  JavaScript ،  Perl ، PHP ، R ،  رست،  سكالا، سويفت،  جوليا  ونيم.

## انظر أيضًا

* برمجيات
* لغات برمجة

## المراجع



## روابط خارجية

* Official documentation at developers.google.com
* 

تصنيف:برمجيات تستخدم رخصة بي إتش بي
تصنيف:برمجيات تسخدم رخصة بي إس دي
تصنيف:برمجيات جوجل
تصنيف:برمجة
تصنيف:تنسيقات تسلسل البيانات
تصنيف:حواسيب