**بروتوكول التخزين المؤقت** (بالإنجليزية: Protocol Buffers)‏ اختصارًا (**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 المتمحورة حول البيانات، خاصةً حيث قد تكون هناك حاجة للتشغيل البيني مع لغات أو أنظمة أخرى في المستقبل.

مثال
----

مخطط لاستخدام معين للمخازن المؤقتة للبروتوكول يربط أنواع البيانات بأسماء الحقول، باستخدام الأعداد الصحيحة لتحديد كل حقل. تحتوي بيانات المخزن المؤقت للبروتوكول على الأرقام فقط، وليس أسماء الحقول، مما يوفر بعض توفير عرض النطاق الترددي / التخزين مقارنة بالأنظمة التي تتضمن أسماء الحقول في البيانات. 

```
//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 ، استخدام كائنات الرسالة على النحو التالي:

```
// 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 ،  رست،  سكالا، سويفت،  جوليا  ونيم.

انظر أيضًا
----------

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

المراجع
-------

1. ↑  وصلة مرجع:. الوصول: 28 يناير 2023.
2. ↑  وصلة مرجع:. الوصول: 28 يناير 2023.
3. ↑  Eishay Smith. "jvm-serializers Benchmarks". مؤرشف من الأصل في 2021-03-23. اطلع عليه بتاريخ 2010-07-12.
4. ↑  Kenton Varda. "A response to Steve Vinoski". مؤرشف من الأصل في 2020-11-09. اطلع عليه بتاريخ 2008-07-14.
5. ↑  "grpc". *grpc.io*. مؤرشف من الأصل في 2021-11-14. اطلع عليه بتاريخ 2016-10-02.
6. ↑  "text\_format.h - Protocol Buffers - Google Code". مؤرشف من الأصل في 2012-02-25. اطلع عليه بتاريخ 2012-03-02.
7. ↑  ThirdPartyAddOns - protobuf - Links to third-party add-ons.  نسخة محفوظة 2015-03-18 على موقع واي باك مشين.
8. ↑  "Protocol Buffers in C#". *Code Blockage*. مؤرشف من الأصل في 2021-11-15. اطلع عليه بتاريخ 2017-05-12.
9. ↑  "Protocol Buffers Language Guide". *Google Developers*. مؤرشف من الأصل في 2021-11-01. اطلع عليه بتاريخ 2016-04-21.
10. ↑  "Language Guide (proto3) | Protocol Buffers". *Google Developers* (بالإنجليزية). Archived from the original on 2021-11-10. Retrieved 2020-08-09.
11. ↑  "Release Protocol Buffers v3.0.0-beta-2 · protocolbuffers/protobuf". *GitHub* (بالإنجليزية). Archived from the original on 2020-11-22. Retrieved 2020-08-09.
12. ↑  "Ballerina - GRPC". مؤرشف من الأصل في 2021-11-15.
13. ↑  "Nanopb - protocol buffers with small code size". مؤرشف من الأصل في 2021-09-30. اطلع عليه بتاريخ 2017-12-12.
14. ↑  "Protocol Buffers implementation in C". مؤرشف من الأصل في 2021-08-01. اطلع عليه بتاريخ 2017-12-12.
15. ↑  "Embedded Proto - Protobuf for microcontrollers". مؤرشف من الأصل في 2021-10-31. اطلع عليه بتاريخ 2021-08-15.
16. ↑  "Protox". 25 أكتوبر 2021. مؤرشف من الأصل في 2020-12-01.
17. ↑  "Protobuf-elixir". 26 أكتوبر 2021. مؤرشف من الأصل في 2021-07-15.
18. ↑  "Tomas-abrahamsson/GPB". 19 أكتوبر 2021. مؤرشف من الأصل في 2020-10-30.
19. ↑  "Proto-lens". 16 أكتوبر 2021. مؤرشف من الأصل في 2021-01-18.
20. ↑  "Protocol Buffers for JavaScript". github.com. مؤرشف من الأصل في 2021-11-12. اطلع عليه بتاريخ 2016-05-14.
21. ↑  "Rprotobuf/SRC at master · eddelbuettel/Rprotobuf". مؤرشف من الأصل في 2021-11-15.
22. ↑  "Rust-protobuf". 26 أكتوبر 2021. مؤرشف من الأصل في 2021-07-30.
23. ↑  "PROST!". 21 أغسطس 2021. مؤرشف من الأصل في 2021-10-13.
24. ↑  "Quick-protobuf". 12 أكتوبر 2021. مؤرشف من الأصل في 2021-01-03.
25. ↑  "Swift Protobuf". 26 أكتوبر 2021. مؤرشف من الأصل في 2021-11-12.
26. ↑  "ThirdPartyAddOns - protobuf - Links to third-party add-ons. - Protocol Buffers - Google's data interchange format - Google Project Hosting". مؤرشف من الأصل في 2015-03-18. اطلع عليه بتاريخ 2012-11-07.
27. ↑  "Protobuf implementation in pure Nim that leverages the power of the macro system to not depend on any external tools". *GitHub* (بالإنجليزية). 21 Oct 2021. Archived from the original on 2020-11-18.

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

* Official documentation at developers.google.com
* protobuf على غيت هاب

* أيقونة بوابةبوابة برمجة الحاسوب
* أيقونة بوابةبوابة برمجيات حرة
* أيقونة بوابةبوابة علم الحاسوب