لغة Starlark

تقدّم هذه الصفحة نظرة عامة على Starlark، المعروفة سابقًا باسم Skylark، وهي اللغة المستخدمة في Bazel. للحصول على قائمة كاملة بالدوال والأنواع، راجِع مرجع Bazel API.

وللحصول على مزيد من المعلومات حول اللغة، يُرجى الاطّلاع على تقرير GitHub من Starlark.

للحصول على المواصفات المُعتمدة لبنية Starlark وسلوكها، يمكنك الاطّلاع على مواصفات لغة Starlark.

البنية

تستند بنية Starlark إلى Python3. هذه بنية صالحة في Starlark:

def fizz_buzz(n):
  """Print Fizz Buzz numbers from 1 to n."""
  for i in range(1, n + 1):
    s = ""
    if i % 3 == 0:
      s += "Fizz"
    if i % 5 == 0:
      s += "Buzz"
    print(s if s else i)

fizz_buzz(20)

يمكن أن تختلف دلالات "ستارلارك" عن لغة Python، ولكن الاختلافات السلوكية نادرة، باستثناء الحالات التي تُثير فيها Starlark خطأ. في ما يلي أنواع Python التالية:

قابلية التحويل

يُفَضِّلُ سْتَارَلَارْكَ سِلَامَ الْأَمْرِيحْ. تتوفّر بِنتان من البيانات القابلة للتغيير: القوائم والإملاء. تعتبر التغييرات التي يتم إجراؤها على بُنى البيانات قابلة للتغيير، مثل إضافة قيمة إلى قائمة أو حذف إدخال في المعاجم صالحة فقط للعناصر التي تم إنشاؤها في السياق الحالي. بعد انتهاء السياق، تصبح قيمه غير قابلة للتغيير.

ويرجع ذلك إلى أنّ بازيل يعتمد أسلوب التنفيذ الموازي. أثناء عملية الإنشاء، يحصل كل ملف .bzl وBUILD ملف على سياق التنفيذ الخاص به. ويتم أيضًا تحليل كل قاعدة في سياقها الخاص.

في ما يلي مثال عن الملف foo.bzl:

# `foo.bzl`
var = [] # declare a list

def fct(): # declare a function
  var.append(5) # append a value to the list

fct() # execute the fct function

يتم إنشاء var من خلال Bazel عندما يتم تحميل foo.bzl. وبالتالي، فإن var هو جزء من سياق foo.bzl. وعندما يتم تشغيل fct()، يتم إجراء ذلك في سياق foo.bzl. بعد التقييمfoo.bzl مكتملة، تحتوي البيئة على إدخال غير قابل للتغيير، var ، مع القيمة[5].

عندما يتم تحميل رموز bar.bzl من foo.bzl أخرى، تظل القيم المحمّلة غير قابلة للتغيير. لهذا السبب، الرمز التالي في bar.bzl غير قانوني:

# `bar.bzl`
load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`

var.append(6)  # runtime error, the list stored in var is frozen

fct()          # runtime error, fct() attempts to modify a frozen list

لا يمكن تغيير المتغيّرات العامة المحدّدة في ملفات bzl خارج ملف bzl الذي حدّدها. كما هو الحال في المثال أعلاه باستخدام bzl ملف، إن القيم التي تعرضها القواعد غير قابلة للتغيير.

الاختلافات بين ملفات BUILD و .bzl

يسجّل ملف واحد (BUILD) أهدافًا من خلال إجراء قواعد. توفر ملفات .bzl تحديدات للثوابت والقواعد ووحدات الماكرو والدوال.

الدوال الأصلية والقواعد المحلية هي رموز عامة في ملفات BUILD. يجب تحميل bzl ملفات باستخدام وحدة native.

هناك نوعان من القيود النحوية في BUILD ملفًا: 1) الإشارة إلى الدوال غير قانونية و2) لا يُسمح بالوسيطات *args و**kwargs.

الاختلافات مع Python

  • المتغيرات العمومية غير قابلة للتغيير.

  • لا يُسمح باستخدام for كشف في المستوى الأعلى. يمكنك استخدامها داخل الوظائف بدلاً من ذلك. يمكنك استخدام ملفات القائمة للفهم في ملفات BUILD.

  • لا يُسمح باستخدام if كشف في المستوى الأعلى. ومع ذلك، يمكن استخدام تعبيرات if: first = data[0] if len(data) > 0 else None.

  • ترتيب دقيق للتكرار من خلال القواميس.

  • غير مسموح بالعودة.

  • يقتصر نوع Int على الأعداد الصحيحة الموقّعة 32 بت. سيتم عرض رسالة خطأ بشأن التدفقات.

  • يعدّ تعديل مجموعة أثناء التكرار خطأً.

  • باستثناء اختبارات المساواة، لا يتم تحديد عوامل تشغيل المقارنة < و<= و>= و> وما إلى ذلك عبر أنواع القيم. باختصار: سيعرض 5 < 'foo' رسالة خطأ وستعرض 5 == "5" القيمة false.

  • في الفاصلة، تكون الفاصلة اللاحقة صالحة فقط عندما تكون القيمة الثلاثية بين الأقواس - عند كتابة (1,) بدلاً من 1,.

  • لا يمكن أن تحتوي القيم الحرفية في القاموس على مفاتيح مكررة. على سبيل المثال، هذا خطأ: {"a": 4, "b": 7, "a": 1}.

  • يتم تمثيل السلاسل بعلامات اقتباس مزدوجة (على سبيل المثال عند استدعاء repr).

  • لا يمكن تكرار السلاسل.

لا تتوفّر ميزات Python التالية:

  • ربط السلسلة الضمني (استخدام عامل تشغيل + الصريح)
  • مقارنات متسلسلة (مثل 1 < x < 5).
  • class (راجِع وظيفة struct).
  • import (راجِع كشف load).
  • while، yield.
  • وأنواع طافية.
  • إنشاء المُنشئ وتعبيرات المُنشئ.
  • is (استخدِم == بدلاً من ذلك).
  • try، raise، except، finally (راجع fail للتعرف على الأخطاء الفادحة).
  • global، nonlocal.
  • معظم الوظائف المدمَجة ومعظم الطرق.