หน้านี้เป็นภาพรวมของ 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)
ความหมายของ Starlark อาจแตกต่างจาก Python แต่ความแตกต่างด้านลักษณะการทำงานนั้นเกิดขึ้นได้น้อย ยกเว้นกรณีที่ Starlark แสดงข้อผิดพลาด ระบบรองรับ Python ประเภทต่อไปนี้
ความสามารถในการเปลี่ยนแปลงได้
Starlark ให้ความสำคัญกับความคงที่ โครงสร้างข้อมูลที่เปลี่ยนแปลงได้มี 2 ประเภท ได้แก่ ลิสต์และ dict การเปลี่ยนแปลงโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ เช่น การต่อท้ายค่าในลิสต์หรือลบรายการในพจนานุกรมจะใช้ได้กับออบเจ็กต์ที่สร้างขึ้นในบริบทปัจจุบันเท่านั้น หลังจากบริบทเสร็จสิ้นแล้ว ค่าของบริบทจะเปลี่ยนแปลงไม่ได้
เนื่องจากบิลด์ Bazel ใช้การดำเนินการแบบขนาน ระหว่างบิลด์ ไฟล์ .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
Bazel จะสร้าง var
เมื่อ 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
มีข้อจำกัดทางไวยากรณ์ 2 ข้อ ได้แก่ 1) การประกาศฟังก์ชันผิดกฎหมาย และ 2) ไม่อนุญาตให้ใช้อาร์กิวเมนต์ *args
และ **kwargs
ความแตกต่างกับ Python
ตัวแปรส่วนกลางจะเปลี่ยนแปลงไม่ได้
ไม่อนุญาตให้ใช้คำสั่ง
for
ที่ระดับบนสุด ให้ใช้ภายในฟังก์ชันแทน ในBUILD
ไฟล์ คุณอาจใช้การทำความเข้าใจรายการได้ไม่อนุญาตให้ใช้คำสั่ง
if
ที่ระดับบนสุด แต่จะใช้นิพจน์if
ได้:first = data[0] if len(data) > 0 else None
ลําดับที่แน่นอนสำหรับการวนซ้ำผ่านพจนานุกรม
ไม่อนุญาตให้ใช้การเกิดซ้ำ
ประเภท Int จำกัดอยู่ที่จำนวนเต็มที่มีเครื่องหมาย 32 บิต ระบบจะแสดงข้อผิดพลาดหากมีจำนวนเกิน
การแก้ไขคอลเล็กชันระหว่างการทำซ้ำถือเป็นข้อผิดพลาด
ยกเว้นการทดสอบความเท่ากัน ระบบจะไม่กำหนดโอเปอเรเตอร์การเปรียบเทียบ
<
,<=
,>=
,>
ฯลฯ สำหรับค่าประเภทต่างๆ กล่าวโดยย่อคือ5 < 'foo'
จะแสดงข้อผิดพลาด และ5 == "5"
จะแสดงผลเป็นเท็จในทูเปิล เครื่องหมายคอมมาต่อท้ายจะใช้ได้ก็ต่อเมื่อทูเปิลอยู่ภายในวงเล็บ เช่น เมื่อคุณเขียน
(1,)
แทน1,
ลิเทอรัลพจนานุกรมต้องไม่มีคีย์ซ้ำกัน ตัวอย่างเช่น
{"a": 4, "b": 7, "a": 1}
แสดงถึงข้อผิดพลาดสตริงจะแสดงด้วยเครื่องหมายคำพูดคู่ (เช่น เมื่อคุณเรียกใช้ repr)
สตริงเป็นองค์ประกอบที่วนซ้ำไม่ได้
ระบบไม่รองรับฟีเจอร์ Python ต่อไปนี้
- การต่อสตริงโดยนัย (ใช้โอเปอเรเตอร์
+
อย่างชัดแจ้ง) - การเปรียบเทียบแบบเชน (เช่น
1 < x < 5
) class
(ดูฟังก์ชันstruct
)import
(ดูคำสั่งload
)while
,yield
- ประเภท float และ set
- เงื่อนไขเริ่มต้นและนิพจน์เงื่อนไขเริ่มต้น
is
(ใช้==
แทน)try
,raise
,except
,finally
(ดูข้อผิดพลาดร้ายแรงที่fail
)global
,nonlocal
- ฟังก์ชันในตัวส่วนใหญ่ เมธอดส่วนใหญ่