Trang này trình bày thông tin tổng quan về Starlark, trước đây gọi là Skylark, ngôn ngữ dùng ở Bazel. Để biết danh sách đầy đủ các hàm và loại, hãy xem Tài liệu tham khảo API Bazel.
Để biết thêm thông tin về ngôn ngữ này, hãy xem kho lưu trữ GitHub của Starlark.
Để biết thông số kỹ thuật đáng tin cậy về cú pháp và hành vi Starlark, hãy xem phần Thông số kỹ thuật của ngôn ngữ Starlark.
Cú pháp
Cú pháp của Starlark lấy cảm hứng từ Python3. Đây là cú pháp hợp lệ trong 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)
Ngữ nghĩa của Starlark có thể khác với Python, nhưng sự khác biệt về hành vi là rất hiếm, ngoại trừ những trường hợp Starlark đưa ra lỗi. Các kiểu Python sau được hỗ trợ:
Khả năng biến đổi
Starlark ưa chuộng tính bất biến. Có 2 cấu trúc dữ liệu có thể thay đổi: danh sách và dict (chính sách). Các thay đổi đối với cấu trúc dữ liệu có thể thay đổi, chẳng hạn như thêm giá trị vào danh sách hoặc xoá một mục trong từ điển chỉ hợp lệ đối với các đối tượng được tạo trong ngữ cảnh hiện tại. Sau khi một ngữ cảnh kết thúc, các giá trị trong ngữ cảnh đó trở thành không thể thay đổi.
Lý do là các bản dựng của Bazel sử dụng tính năng thực thi song song. Trong quá trình tạo bản dựng, mỗi tệp .bzl
và mỗi tệp BUILD
đều nhận được ngữ cảnh thực thi riêng. Mỗi quy tắc cũng được
phân tích trong ngữ cảnh riêng.
Hãy xem một ví dụ với tệp 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
Bazel tạo var
khi foo.bzl
tải. Do đó, var
là một phần trong ngữ cảnh của foo.bzl
. Khi chạy, fct()
sẽ thực hiện điều này trong bối cảnh foo.bzl
. Sau khi quá trình đánh giá foo.bzl
hoàn tất, môi trường chứa một mục không thể thay đổi (var
) có giá trị [5]
.
Khi một bar.bzl
khác tải biểu tượng từ foo.bzl
, các giá trị đã tải vẫn không thể thay đổi. Vì lý do này, mã sau đây trong bar.bzl
là bất hợp pháp:
# `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
Bạn không thể thay đổi các biến toàn cục được xác định trong tệp bzl
bên ngoài tệp bzl
đã xác định các biến đó. Tương tự như ví dụ sử dụng tệp bzl
ở trên, các giá trị do quy tắc trả về là không thể thay đổi.
Sự khác biệt giữa tệp BUILD và .bzl
BUILD
tệp đăng ký mục tiêu thông qua việc thực hiện lệnh gọi đến các quy tắc. Các tệp .bzl
cung cấp định nghĩa cho hằng số, quy tắc, macro và hàm.
Hàm gốc và quy tắc gốc là các ký hiệu chung trong tệp BUILD
. Các tệp bzl
cần tải các tệp này bằng mô-đun native
.
Có 2 hạn chế về cú pháp trong tệp BUILD
: 1) khai báo hàm là bất hợp pháp và 2) không được phép sử dụng đối số *args
và **kwargs
.
Điểm khác biệt với Python
Các biến toàn cục là không thể thay đổi.
Không cho phép câu lệnh
for
ở cấp cao nhất. Thay vào đó, hãy sử dụng các hàm này bên trong các hàm. Trong các tệpBUILD
, bạn có thể sử dụng khả năng đọc hiểu danh sách.Không cho phép câu lệnh
if
ở cấp cao nhất. Tuy nhiên, bạn có thể sử dụng biểu thứcif
:first = data[0] if len(data) > 0 else None
.Thứ tự xác định để lặp lại thông qua Từ điển.
Không cho phép đệ quy.
Loại số nguyên chỉ giới hạn ở số nguyên 32 bit đã ký. Thông báo lỗi sẽ bị tràn.
Việc sửa đổi một tập hợp trong quá trình lặp lại là một lỗi.
Ngoại trừ các phép kiểm thử đẳng thức, các toán tử so sánh
<
,<=
,>=
,>
, v.v. không được xác định trên các loại giá trị. Tóm lại:5 < 'foo'
sẽ báo lỗi và5 == "5"
sẽ trả về giá trị false.Trong các bộ dữ liệu, dấu phẩy theo sau chỉ hợp lệ khi bộ dữ liệu nằm giữa các dấu ngoặc – khi bạn viết
(1,)
thay vì1,
.Giá trị cố định theo từ điển không được có khoá trùng lặp. Ví dụ: lỗi này là
{"a": 4, "b": 7, "a": 1}
.Các chuỗi được biểu thị bằng dấu ngoặc kép (chẳng hạn như khi bạn gọi repr).
Các chuỗi không được lặp lại.
Các tính năng sau đây của Python không được hỗ trợ:
- nối chuỗi ngầm ẩn (sử dụng toán tử
+
rõ ràng). - Thông tin so sánh theo chuỗi (chẳng hạn như
1 < x < 5
). class
(xem hàmstruct
).import
(xem câu lệnhload
).while
,yield
.- kiểu số thực có độ chính xác đơn và kiểu tập hợp.
- biểu thức biểu thức của bộ sinh.
is
(thay vào đó, hãy sử dụng==
).try
,raise
,except
,finally
(xemfail
để biết các lỗi nghiêm trọng).global
,nonlocal
.- hàm tích hợp nhất, hầu hết các phương thức.