بروتوكول بافرز

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

ملخص

طورت جوجل بروتوكول بافرز للاستخدام الداخلي وقدمت مولد أكواد للغات متعددة بموجب ترخيص مفتوح المصدر .

ركزت أهداف تصميم بروتوكول بافرز على البساطة والأداء. وعلى وجه الخصوص، صُمم ليكون أصغر حجماً وأسرع من لغة XML . [ 3 ]

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

يشبه بروتوكول Buffers بروتوكولات Apache Thrift و Amazon Ion و Microsoft Bond، حيث يقدم مجموعة بروتوكولات RPC ملموسة لاستخدامها في خدمات محددة تسمى gRPC . [ 5 ]

تُوصَف مخططات هياكل البيانات (المسماة بالرسائل ) والخدمات في ملف تعريف أولي (proto definition file .proto) ويتم تجميعها باستخدام protoc. يُولّد هذا التجميع شيفرةً يمكن استدعاؤها من قِبَل مُرسِل أو مُستقبِل هياكل البيانات هذه. على سبيل المثال، يتم توليد example.pb.ccو من . تُعرّف هذه الملفات فئات C++ لكل رسالة وخدمة في .example.pb.hexample.protoexample.proto

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

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

القيود

لا توجد مواصفات موحدة لبروتوكول Protobuf. [ 8 ] يُعد هذا التنسيق الأنسب لأجزاء البيانات الصغيرة التي لا تتجاوز بضعة ميغابايتات، والتي يمكن تحميلها/إرسالها إلى الذاكرة مباشرةً، ولذلك فهو ليس تنسيقًا قابلاً للبث. [ 9 ] لا توفر المكتبة ضغطًا افتراضيًا. كما أن هذا التنسيق غير مدعوم بشكل جيد في اللغات غير الكائنية التوجه (مثل Fortran ). [ 10 ]

مثال

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

// صيغة ملف polyline.proto = "proto2" ;رسالة نقطة { مطلوب int32 x = 1 ; مطلوب int32 y = 2 ; اختياري سلسلة label = 3 ; }رسالة الخط { مطلوب نقطة البداية = 1 ؛ مطلوب نقطة النهاية = 2 ؛ اختياري نص التسمية = 3 ؛ }رسالة خط متعدد { نقطة متكررة نقطة = 1 ؛ سلسلة اختيارية تسمية = 2 ؛ }

تُحدد الرسالة Pointعنصرين إلزاميّين من البيانات، xوهما و y. العنصر labelاختياريّ. لكل عنصر من البيانات وسم. يُعرّف الوسم بعد علامة المساواة. على سبيل المثال، xالعنصر له الوسم 1.

توضح الرسائل Lineو Polyline، التي تستخدم كلاهما Point، كيفية عمل التركيب في بروتوكول بافرز. Polylineيحتوي على repeatedحقل ، وبالتالي Polylineيتصرف مثل مجموعة من النقاط (عدد غير محدد).

يمكن بعد ذلك تجميع هذا المخطط لاستخدامه بواسطة لغة برمجة واحدة أو أكثر. توفر جوجل مُجمِّعًا يُسمى `scikit-learn`، protocوالذي يُمكنه إنتاج مخرجات للغات C++ أو Java أو Python. كما تتوفر مُجمِّعات مخططات أخرى من مصادر مختلفة لإنشاء مخرجات مُخصصة لأكثر من 20 لغة برمجة أخرى. [ 11 ]

على سبيل المثال، بعد إنتاج نسخة C++ من مخطط بروتوكول المخزن المؤقت المذكور أعلاه، يمكن لملف كود مصدر C++، polyline.cpp ، استخدام كائنات الرسائل على النحو التالي:

// polyline.cpp #include "polyline.pb.h" // تم إنشاؤه عن طريق استدعاء "protoc polyline.proto"استيراد std ؛باستخدام std :: string ؛ باستخدام std :: shared_ptrshared_ptr <Line> createNewLine ( const string & name ) { // إنشاء خط من (10، 20) إلى (30، 40) shared_ptr<Line> line = std:: make_shared <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 ; }shared_ptr <Polyline> createNewPolyline () { // إنشاء خط متعدد النقاط عند (10,10) و(20,20) shared_ptr <Polyline> polyline = std :: make_shared <Polyline> ( ) ; shared_ptr <Point> point1 = std :: make_shared <Point> ( polyline- > add_point ( ) ) ; point1- > set_x ( 10 ) ; point1- > set_y ( 10 ) ; shared_ptr <Point> point2 = std :: make_shared <Point> ( polyline- > add_point ( ) ) ; point2- > set_x ( 20 ) ; point2- > set_y ( 20 ) ; return polyline ; }

الدعم اللغوي

يوفر Protobuf 2.0 مولد أكواد للغات C ++ و Java و C # و Python . [ 12 ]

يوفر بروتوكول Protobuf 3.0 مولد أكواد للغات C++ ، وJava (بما في ذلك JavaNano، وهي لهجة مصممة للبيئات ذات الموارد المحدودةوKotlin ، وPython ، وGo ، وRuby ، و Objective-C ، و C# ، و PHP ، وDart . [ 14 ] كما يدعم JavaScript منذ الإصدار 3.0.0-beta-2. [ 15 ]

تتوفر أيضًا تطبيقات من جهات خارجية للغات Ada ، [ 16 ] و Ballerina ، [ 17 ] و C ، [ 18 ] [ 19 ] و C++ ، [ 20 ] و Dart ، و Elixir ، [ 21 ] [ 22 ] و Erlang ، [ 23 ] و Haskell ، [ 24 ] و JavaScript ، [ 25 ] و Julia ، [ 26 ] و Nim ، [ 27 ] و Perl ، و PHP ، و Prolog ، [ 28 ] [ 29 ] و R ، [ 30 ] و Rust ، [ 31 ] [ 32 ] [ 33 ] و Scala ، [ 34 ] و Swift . [ 35 ]

انظر أيضاً

مراجع

  1. "الأسئلة الشائعة | بروتوكول بافرز" . مطورو جوجل . تم الاطلاع عليه بتاريخ 2 أكتوبر 2016 .
  2. "الإصدارات - google/protobuf" عبر GitHub .
  3. إيشاي سميث. "معايير أداء jvm-serializers" . جيت هاب . تم الاسترجاع في 12 يوليو 2010 .
  4. كينتون فاردا. "رد على ستيف فينوسكي" . تم الاطلاع عليه بتاريخ 14-07-2008 .
  5. "grpc" . grpc.io. تم ​​الاطلاع عليه بتاريخ 2 أكتوبر 2016 .
  6. "text_format.h - Protocol Buffers - Google Code" . تم الاطلاع عليه بتاريخ 2012-03-02 .
  7. "أفضل ممارسات البروتوكول | وثائق بروتوكول بافرز" . تم الاطلاع عليه بتاريخ 26-05-2023 .
  8. "نظرة عامة" . protobuf.dev . تم الاطلاع عليه بتاريخ 28-05-2023 .
  9. "نظرة عامة" . protobuf.dev . تم الاطلاع عليه بتاريخ 28-05-2023 .
  10. "نظرة عامة" . protobuf.dev . تم الاطلاع عليه بتاريخ 28-05-2023 .
  11. إضافات الطرف الثالث - بروتوكول باف - روابط لإضافات الطرف الثالث. - بروتوكول باف - تنسيق تبادل البيانات من جوجل - استضافة مشاريع جوجل . Code.google.com. تم الاطلاع عليه بتاريخ 18-09-2013.
  12. "بروتوكولات التخزين المؤقت في لغة C#" . Code Blockage . تم الاطلاع عليه بتاريخ 12-05-2017 .
  13. "دليل لغة بروتوكول بافرز" . مطورو جوجل . تم الاطلاع عليه بتاريخ 21-04-2016 .
  14. "دليل اللغة (proto3) | بروتوكول بافرز" . مطورو جوجل . تم الاسترجاع في 9 أغسطس 2020 .
  15. "إصدار بروتوكول بافرز v3.0.0-beta-2 · protocolbuffers/protobuf" . GitHub . تم الاطلاع عليه بتاريخ 2020-08-09 .
  16. "تطبيق بروتوكول جوجل بافرز في لغة آدا" .
  17. "راقصة باليه - GRPC" . مؤرشف من الأصل بتاريخ 15 نوفمبر 2021. تم الاطلاع عليه بتاريخ 24 مارس 2021 .
  18. "Nanopb - بروتوكولات تخزين مؤقتة ذات حجم كود صغير" . تم الاطلاع عليه بتاريخ 12-12-2017 .
  19. "تنفيذ بروتوكول Buffers بلغة C" . GitHub . تم الاطلاع عليه بتاريخ 12-12-2017 .
  20. "بروتوكول Proto المدمج - بروتوكول Protobuf لوحدات التحكم الدقيقة" . تم الاطلاع عليه بتاريخ 15-08-2021 .
  21. "Protox" . GitHub . 25 أكتوبر 2021.
  22. ^ "بروتوبوف إكسير" . جيثب . 26 أكتوبر 2021.
  23. ^ "توماس أبراهامسون / جي بي بي" . جيثب . 19 أكتوبر 2021.
  24. "Proto-lens" . GitHub . 16 أكتوبر 2021.
  25. "Protocol Buffers for JavaScript" . github.com . تم الاطلاع عليه بتاريخ 14-05-2016 .
  26. "إضافات الطرف الثالث - بروتوكول باف - روابط لإضافات الطرف الثالث. - بروتوكول باف - تنسيق تبادل البيانات من جوجل - استضافة مشاريع جوجل" . تم الاطلاع عليه بتاريخ 7 نوفمبر 2012 .
  27. "تنفيذ بروتوكول Protobuf بلغة Nim خالصة يستفيد من قوة نظام الماكرو لعدم الاعتماد على أي أدوات خارجية" . GitHub . 21 أكتوبر 2021.
  28. "SWI-Prolog: مكتبة بروتوكولات جوجل" .
  29. "SWI-Prolog / contrib-protobufs" . GitHub . تم الاسترجاع في 21-04-2022 .
  30. "RProtoBuf" . GitHub .
  31. "Rust-protobuf" . GitHub . 26 أكتوبر 2021.
  32. "بروست!" . جيت هاب . 14 نوفمبر 2025.
  33. "Quick-protobuf" . GitHub . 12 أكتوبر 2021.
  34. "ScalaPB" . GitHub . تم الاطلاع عليه بتاريخ 27 سبتمبر 2022 .
  35. "Swift Protobuf" . GitHub . 26 أكتوبر 2021.