کتابخانه‌ی استاندارد · کدگذاری و داده

پروتوباف encoding/protobuf

خواندن پرونده‌های .proto، کدگذاری سیمی Protocol Buffers و ساختن کد سلام از آن‌ها.

واردسازی کدگذاری.پروتوباف

Protocol Buffers قالب دودویی گوگل برای پیام‌های ساختارمند است. شکل پیام‌ها در پرونده‌ی .proto تعریف می‌شود و این بسته آن را می‌خواند، کد سلام برای پیام‌ها و سرویس‌ها می‌سازد و ابزار سطح پایین نوشتن و خواندن فیلدها را هم دارد.

هر فیلد در بایت‌ها با یک برچسب (شماره‌ی فیلد و نوع سیم) و سپس مقدارش می‌آید. عددها معمولاً varint نوشته می‌شوند: هر بایت ۷ بیت از عدد را دارد و بیت بالایش می‌گوید بایت دیگری هم هست.

گونه‌ها

جریان نشانه پروتو PTokenStream

ساختار جریان نشانه پروتو
نشانه‌های یک متن.
نامانگلیسیگونهتوضیح
tokstoksوکتور<نشانه پروتو>نشانه‌ها.
encoding-protobuf-Parse.salam
واردسازی کدگذاری.پروتوباف

روال ریشه:
    منبع := "syntax = \"proto3\";\npackage shop;\n\nenum Status { OPEN = 0; DONE = 1; }\n\nmessage Order {\n  int64 id = 1;\n  repeated string items = 2;\n  map<string, int32> counts = 3;\n  Status status = 4;\n  oneof pay { string card = 5; bool cash = 6; }\n}\n\nservice Orders {\n  rpc Get (Order) returns (Order);\n  rpc Watch (Order) returns (stream Order);\n}\n"
    ناپایا خوب := نادرست
    پ := پروتوباف.تجزیه پرونده(منبع، خوب)
    سرچاپ خوب، پ.packageName، پ.messages.طول()، پ.enums.طول()، پ.services.طول()، پ.imports.طول()
    پیام := پ.messages[۰]
    سرچاپ پیام.name، پیام.fields.طول()، پیام.oneofs[۰].name، پیام.oneofs[۰].fieldIndices
    هر ف در پیام.fields:
        سرچاپ ف.number، ف.name، پروتوباف.نام نوع فیلد(ف.kind)، ف.typeName، ف.repeated، ف.oneofIndex
    پایان
    م := پیام.fields[۲]
    سرچاپ م.kind == پروتوباف.نوع فیلد نگاشت، پروتوباف.نام نوع فیلد(م.keyKind)، پروتوباف.نام نوع فیلد(م.mapValueKind)
    ش := پ.enums[۰]
    سرچاپ ش.name، ش.values[۱].name، ش.values[۱].number
    س := پ.services[۰]
    سرچاپ س.name، س.methods[۱].name، س.methods[۱].inputType، س.methods[۱].serverStream، س.methods[۱].clientStream
    سرچاپ پروتوباف.نوع ساده از نام("sint64") == پروتوباف.نوع فیلد صحیح۶۴ زیگزاگ، پروتوباف.نوع ساده از نام("Order")
    ناپایا ن := پروتوباف.نشانه گذاری("message A { int32 x = 1; }"، خوب)
    سرچاپ خوب، ن.toks.طول()، ن.toks[۰].lexeme، ن.toks[۰].kind == پروتوباف.نشانه شناسه، ن.toks[۲].kind == پروتوباف.نشانه آکولاد باز
    سرچاپ ن.toks[۶].ival، ن.toks[۶].line
    _ := پروتوباف.تجزیه پرونده("message {"، خوب)
    سرچاپ خوب
پایان
خروجیtrue shop 1 1 1 0 Order 6 pay [4, 5] 1 id int64 false -1 2 items string true -1 3 counts map false -1 4 status message Status false -1 5 card string false 0 6 cash bool false 0 true string int32 Status DONE 1 Orders Watch Order true false true 0 true 10 message true true 1 1 false

فیلد پروتو PField

ساختار فیلد پروتو
یک فیلد پیام.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
kindkindصحیح = 0نوع فیلد؛ یکی از ثابت‌های نوع فیلد.
typeNametypeNameرشته = ""نام گونه برای پیام و شمارشی. تجزیه‌گر نام‌ها را حل نمی‌کند، پس شمارشی هم نوع پیام می‌گیرد.
keyKindkeyKindصحیح = 0نوع کلید برای map.
mapValueKindmapValueKindصحیح = 0نوع مقدار برای map.
mapValueTypeNamemapValueTypeNameرشته = ""نام گونه‌ی مقدار map.
numbernumberصحیح = 0شماره‌ی فیلد.
repeatedrepeatedمنطقی = نادرستفیلد تکرارشونده است.
packedOptpackedOptمنطقی = درستعددهای تکراری فشرده نوشته شوند.
oneofIndexoneofIndexصحیح = -1شماره‌ی گروه oneof؛ ‎-1 اگر نباشد.
is_deprecatedis_deprecatedمنطقی = نادرستفیلد منسوخ علامت خورده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

گروه یکی از POneof

ساختار گروه یکی از
یک گروه oneof: از میان فیلدهایش فقط یکی مقدار دارد.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
fieldIndicesfieldIndicesوکتور<صحیح>شماره‌ی فیلدهای عضو در پیام.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

مقدار شمارشی پروتو PEnumValue

ساختار مقدار شمارشی پروتو
یک مقدار شمارشی.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
numbernumberصحیح = 0عدد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

شمارشی پروتو PEnum

ساختار شمارشی پروتو
یک شمارشی.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
valuesvaluesوکتور<مقدار شمارشی پروتو>مقدارها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پیام پروتو PMessage

ساختار پیام پروتو
یک پیام.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
fieldsfieldsوکتور<فیلد پروتو>فیلدها به ترتیب تعریف.
oneofsoneofsوکتور<گروه یکی از>گروه‌های oneof.
nestedMessagesnestedMessagesوکتور<پیام پروتو>پیام‌های درونی.
nestedEnumsnestedEnumsوکتور<شمارشی پروتو>شمارشی‌های درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

متد پروتو PMethod

ساختار متد پروتو
یک متد سرویس.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
inputTypeinputTypeرشته = ""گونه‌ی ورودی.
outputTypeoutputTypeرشته = ""گونه‌ی خروجی.
clientStreamclientStreamمنطقی = نادرستورودی جریانی است.
serverStreamserverStreamمنطقی = نادرستخروجی جریانی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

سرویس پروتو PService

ساختار سرویس پروتو
یک سرویس gRPC.
نامانگلیسیگونهتوضیح
namenameرشته = ""نام.
methodsmethodsوکتور<متد پروتو>متدها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پرونده پروتو PFile

ساختار پرونده پروتو
یک پرونده‌ی .proto خوانده‌شده.
نامانگلیسیگونهتوضیح
packageNamepackageNameرشته = ""نام بسته.
messagesmessagesوکتور<پیام پروتو>پیام‌ها.
enumsenumsوکتور<شمارشی پروتو>شمارشی‌های سطح بالا.
importsimportsوکتور<رشته>پرونده‌های واردشده.
servicesservicesوکتور<سرویس پروتو>سرویس‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نشانه پروتو PToken

ساختار نشانه پروتو
یک نشانه.
نامانگلیسیگونهتوضیح
kindkindصحیحنوع نشانه.
lexemelexemeرشته = ""متن نشانه.
ivalivalصحیح۶۴ = 0مقدار عدد صحیح.
fvalfvalاعشار۶۴ = 0مقدار عدد اعشاری.
svalsvalرشته = ""مقدار رشته.
linelineصحیح = 0شماره‌ی خط.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

پایاها و متغیرها

نوع سیم WT_…

شیوه‌ی نوشتن مقدار فیلد در بایت‌ها: عدد متغیر، ۸ بایت ثابت، طول‌دار یا ۴ بایت ثابت.
نامانگلیسیمقدار
نوع سیم متغیرWT_VARINT0
نوع سیم ثابت۶۴WT_FIXED641
نوع سیم طول‌دارWT_LEN2
نوع سیم ثابت۳۲WT_FIXED325
encoding-protobuf-Wire.salam
واردسازی کدگذاری.پروتوباف
واردسازی فشرده سازی

روال ریشه:
    ناپایا ب := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن برچسب(ب، ۱، پروتوباف.نوع سیم متغیر)
    پروتوباف.نوشتن عدد متغیر(ب، ۱۵۰ برگردان طبیعی۶۴)
    سرچاپ فشرده سازی.بافر به پایه۶۴(ب)، پروتوباف.ساخت برچسب(۱، ۰)، پروتوباف.ساخت برچسب(۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن برچسب(ب، ۲، پروتوباف.نوع سیم طول‌دار)
    پروتوباف.نوشتن رشته طول‌دار(ب، "سلام")
    پروتوباف.نوشتن برچسب(ب، ۳، پروتوباف.نوع سیم ثابت۳۲)
    پروتوباف.نوشتن ثابت۳۲(ب، ۷ برگردان طبیعی۳۲)
    پروتوباف.نوشتن برچسب(ب، ۴، پروتوباف.نوع سیم ثابت۶۴)
    پروتوباف.نوشتن ثابت۶۴(ب، ۹ برگردان طبیعی۶۴)
    پروتوباف.نوشتن اعشار۳۲(ب، ۰.۵)
    پروتوباف.نوشتن اعشار۶۴(ب، ۲.۲۵)
    پروتوباف.نوشتن بایت‌های طول‌دار(ب، ب.data، ۲)
    ناپایا خ := فشرده سازی.خواننده از بافر(ب)
    ناپایا سالم := درست
    ناپایا شماره := ۰
    ناپایا سیم := ۰
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، سیم، پروتوباف.خواندن عدد متغیر(خ، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، پروتوباف.خواندن رشته طول‌دار(خ، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    پروتوباف.رد کردن فیلد(خ، سیم، سالم)
    پروتوباف.خواندن برچسب(خ، شماره، سیم، سالم)
    سرچاپ شماره، پروتوباف.خواندن ثابت۶۴(خ، سالم)
    سرچاپ پروتوباف.خواندن اعشار۳۲(خ، سالم)، پروتوباف.خواندن اعشار۶۴(خ، سالم)
    ب۲ := پروتوباف.خواندن بافر طول‌دار(خ، سالم)
    سرچاپ فشرده سازی.طول بافر(ب۲)، سالم
    _ := پروتوباف.خواندن عدد متغیر(خ، سالم)
    سرچاپ سالم
    سرچاپ پروتوباف.کدگذاری زیگزاگ۳۲(-۱)، پروتوباف.کدگشایی زیگزاگ۳۲(۳ برگردان طبیعی۳۲)، پروتوباف.کدگذاری زیگزاگ۶۴(-۲)، پروتوباف.کدگشایی زیگزاگ۶۴(۴ برگردان طبیعی۶۴)
    ناپایا ب۳ := فشرده سازی.بافر بایت جدید()
    پروتوباف.نوشتن ثابت۳۲(ب۳، ۴۲ برگردان طبیعی۳۲)
    ناپایا خ۳ := فشرده سازی.خواننده از بافر(ب۳)
    سالم = درست
    سرچاپ پروتوباف.خواندن ثابت۳۲(خ۳، سالم)
    فشرده سازی.آزادسازی بافر(ب)
    فشرده سازی.آزادسازی بافر(ب۳)
پایان
خروجیCJYB 8 18 1 0 150 2 سلام 4 9 0.5 2.25 2 true false 1 -2 3 2 42

نوع فیلدها FK_…

مقدار kind هر فیلد: گونه‌های ساده‌ی پروتوباف، پیام، شمارشی و نگاشت.
نامانگلیسیمقدار
نوع فیلد اعشار۶۴FK_DOUBLE1
نوع فیلد اعشار۳۲FK_FLOAT2
نوع فیلد صحیح۳۲FK_INT323
نوع فیلد صحیح۶۴FK_INT644
نوع فیلد طبیعی۳۲FK_UINT325
نوع فیلد طبیعی۶۴FK_UINT646
نوع فیلد صحیح۳۲ زیگزاگFK_SINT327
نوع فیلد صحیح۶۴ زیگزاگFK_SINT648
نوع فیلد ثابت۳۲FK_FIXED329
نوع فیلد ثابت۶۴FK_FIXED6410
نوع فیلد ثابت علامت‌دار۳۲FK_SFIXED3211
نوع فیلد ثابت علامت‌دار۶۴FK_SFIXED6412
نوع فیلد منطقیFK_BOOL13
نوع فیلد رشتهFK_STRING14
نوع فیلد بایت‌هاFK_BYTES15
نوع فیلد پیامFK_MESSAGE16
نوع فیلد شمارشیFK_ENUM17
نوع فیلد نگاشتFK_MAP18

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نوع نشانه‌ها PTK_…

مقدار kind نشانه‌های نشانه گذاری.
نامانگلیسیمقدار
نشانه اتمامPTK_EOF0
نشانه شناسهPTK_IDENT1
نشانه عدد صحیحPTK_INT2
نشانه عدد اعشاریPTK_FLOAT3
نشانه رشتهPTK_STRING4
نشانه نقطه‌ویرگولPTK_SEMI5
نشانه آکولاد بازPTK_LBRACE6
نشانه آکولاد بستهPTK_RBRACE7
نشانه پرانتز بازPTK_LPAREN8
نشانه پرانتز بستهPTK_RPAREN9
نشانه کروشه بازPTK_LBRACKET10
نشانه کروشه بستهPTK_RBRACKET11
نشانه زاویه بازPTK_LANGLE12
نشانه زاویه بستهPTK_RANGLE13
نشانه مساویPTK_EQ14
نشانه ویرگولPTK_COMMA15
نشانه نقطهPTK_DOT16
نشانه منهاPTK_MINUS17
نشانه خطاPTK_ERROR18

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

روال‌ها

تجزیه پرونده ParseFile

روال تجزیه پرونده(source: رشته، ok &: منطقی): پرونده پروتو
متن .proto (نحو proto3) را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

ساخت برچسب MakeTag

روال ساخت برچسب(fieldNum: صحیح، wireType: صحیح): طبیعی۶۴
برچسب فیلد: شماره‌ی فیلد و نوع سیم در یک عدد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن عدد متغیر WriteVarint

روال نوشتن عدد متغیر(buf &: compress.ByteBuf، n: طبیعی۶۴)
عدد را با کدگذاری متغیر‌طول (varint) می‌نویسد: هر بایت ۷ بیت، عددهای کوچک کوتاه‌تر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن عدد متغیر ReadVarint

روال خواندن عدد متغیر(r &: compress.ByteReader، ok &: منطقی): طبیعی۶۴
یک varint می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن برچسب WriteTag

روال نوشتن برچسب(buf &: compress.ByteBuf، fieldNum: صحیح، wireType: صحیح)
برچسب را به شکل عدد متغیر می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن برچسب ReadTag

روال خواندن برچسب(r &: compress.ByteReader، fieldNum &: صحیح، wireType &: صحیح، ok &: منطقی)
برچسب را می‌خواند و شماره‌ی فیلد و نوع سیم را جدا می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگذاری زیگزاگ۳۲ ZigZagEncode32

روال کدگذاری زیگزاگ۳۲(n: صحیح۳۲): طبیعی۳۲
کدگذاری زیگزاگ: عددهای منفی کوچک را به عددهای مثبت کوچک می‌برد تا varint کوتاهی داشته باشند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگشایی زیگزاگ۳۲ ZigZagDecode32

روال کدگشایی زیگزاگ۳۲(n: طبیعی۳۲): صحیح۳۲
زیگزاگ ۳۲ بیتی را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگذاری زیگزاگ۶۴ ZigZagEncode64

روال کدگذاری زیگزاگ۶۴(n: صحیح۶۴): طبیعی۶۴
کدگذاری زیگزاگ ۶۴ بیتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

کدگشایی زیگزاگ۶۴ ZigZagDecode64

روال کدگشایی زیگزاگ۶۴(n: طبیعی۶۴): صحیح۶۴
زیگزاگ ۶۴ بیتی را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن ثابت۳۲ WriteFixed32

روال نوشتن ثابت۳۲(buf &: compress.ByteBuf، v: طبیعی۳۲)
عدد ۳۲ بیتی را به شکل ۴ بایت کوچک‌انتها می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن ثابت۳۲ ReadFixed32

روال خواندن ثابت۳۲(r &: compress.ByteReader، ok &: منطقی): طبیعی۳۲
۴ بایت را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن ثابت۶۴ WriteFixed64

روال نوشتن ثابت۶۴(buf &: compress.ByteBuf، v: طبیعی۶۴)
عدد ۶۴ بیتی را به شکل ۸ بایت می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن ثابت۶۴ ReadFixed64

روال خواندن ثابت۶۴(r &: compress.ByteReader، ok &: منطقی): طبیعی۶۴
۸ بایت را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن اعشار۳۲ WriteFloat

روال نوشتن اعشار۳۲(buf &: compress.ByteBuf، v: اعشار۶۴)
عدد اعشاری ۳۲ بیتی را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن اعشار۳۲ ReadFloat

روال خواندن اعشار۳۲(r &: compress.ByteReader، ok &: منطقی): اعشار۶۴
عدد اعشاری ۳۲ بیتی را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن اعشار۶۴ WriteDouble

روال نوشتن اعشار۶۴(buf &: compress.ByteBuf، v: اعشار۶۴)
عدد اعشاری ۶۴ بیتی را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن اعشار۶۴ ReadDouble

روال خواندن اعشار۶۴(r &: compress.ByteReader، ok &: منطقی): اعشار۶۴
عدد اعشاری ۶۴ بیتی را می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن بایت‌های طول‌دار WriteLenPrefixedBytes

روال نوشتن بایت‌های طول‌دار(buf &: compress.ByteBuf، p: تهی*، n: صحیح)
طول و سپس بایت‌ها را می‌نویسد؛ برای فیلدهای bytes و پیام‌های درونی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نوشتن رشته طول‌دار WriteLenPrefixedStr

روال نوشتن رشته طول‌دار(buf &: compress.ByteBuf، s: رشته)
طول و سپس رشته را می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن بافر طول‌دار ReadLenPrefixedBuf

روال خواندن بافر طول‌دار(r &: compress.ByteReader، ok &: منطقی): compress.ByteBuf
یک بخش طول‌دار را به بافر می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

خواندن رشته طول‌دار ReadLenPrefixedStr

روال خواندن رشته طول‌دار(r &: compress.ByteReader، ok &: منطقی): رشته
یک بخش طول‌دار را به رشته می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

رد کردن فیلد SkipField

روال رد کردن فیلد(r &: compress.ByteReader، wireType: صحیح، ok &: منطقی)
از روی مقدار یک فیلد با نوع سیم داده‌شده رد می‌شود؛ برای فیلدهای ناشناخته.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Wire.salam

نشانه گذاری Tokenize

روال نشانه گذاری(source: رشته، ok &: منطقی): جریان نشانه پروتو
متن را به نشانه‌ها می‌شکند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

تولید کد GenerateSingle

روال تولید کد(protoSource: رشته، ok &: منطقی): رشته
از متن .proto کد سلام می‌سازد: یک ساختار برای هر پیام، با روال‌های سریال‌سازی.
encoding-protobuf-Generate.salam
واردسازی کدگذاری.پروتوباف
واردسازی رشته

روال ریشه:
    منبع := "syntax = \"proto3\";\nmessage Ping { string text = 1; }\nservice Echo {\n  rpc Say (Ping) returns (Ping);\n  rpc Stream (stream Ping) returns (stream Ping);\n}\n"
    ناپایا خوب := نادرست
    کد := پروتوباف.تولید کد(منبع، خوب)
    سرچاپ خوب، رشته.شامل است(کد، "struct Ping")
    پ := پروتوباف.تجزیه پرونده(منبع، خوب)
    سرچاپ پروتوباف.تعداد سرویس‌ها(پ)، پروتوباف.نام سرویس(پ، ۰)، پروتوباف.تعداد متدهای سرویس(پ، ۰)
    سرچاپ پروتوباف.امضای متد(پ، ۰، ۰)
    سرچاپ پروتوباف.امضای متد(پ، ۰، ۱)
    سرچاپ رشته.شامل است(پروتوباف.تولید سرویس‌ها(پ)، "Echo")
    همه := پروتوباف.تولید با سرویس‌ها(منبع، خوب)
    سرچاپ خوب، رشته.طول(همه) > رشته.طول(کد)
    سرچاپ پروتوباف.خلاصه سرویس(منبع، خوب)
پایان
خروجیtrue true 1 Echo 2 Say(Ping) returns (Ping) Stream(stream Ping) returns (stream Ping) true true true service Echo (2 methods) rpc Say(Ping) returns (Ping) rpc Stream(stream Ping) returns (stream Ping)

نام نوع فیلد FieldKindName

روال نام نوع فیلد(k: صحیح): رشته
نام نوع فیلد، مثل int64.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

نوع ساده از نام ScalarKindFromName

روال نوع ساده از نام(name: رشته): صحیح
نوع فیلد از نام گونه‌ی ساده؛ برای نام پیام، صفر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Parse.salam

تعداد سرویس‌ها ServiceCount

روال تعداد سرویس‌ها(f: پرونده پروتو): صحیح
تعداد سرویس‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

نام سرویس ServiceNameAt

روال نام سرویس(f: پرونده پروتو، i: صحیح): رشته
نام سرویس شماره‌ی i.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تعداد متدهای سرویس ServiceMethodCount

روال تعداد متدهای سرویس(f: پرونده پروتو، i: صحیح): صحیح
تعداد متدهای یک سرویس.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

امضای متد ServiceMethodSignature

روال امضای متد(f: پرونده پروتو، si: صحیح، mi: صحیح): رشته
امضای یک متد، مثل Say(Ping) returns (Ping).

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تولید سرویس‌ها GenerateServices

روال تولید سرویس‌ها(f: پرونده پروتو): رشته
کد رابط سرویس‌ها را می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

تولید با سرویس‌ها GenerateWithServices

روال تولید با سرویس‌ها(protoSource: رشته، ok &: منطقی): رشته
کد پیام‌ها و سرویس‌ها را با هم می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam

خلاصه سرویس ServiceSummary

روال خلاصه سرویس(protoSource: رشته، ok &: منطقی): رشته
خلاصه‌ی خوانای سرویس‌ها و متدها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-protobuf-Generate.salam