تقدّم هذه الصفحة نظرة عامة على 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
.- معظم الوظائف المدمَجة ومعظم الطرق.