หน้านี้เป็นภาพรวมของ 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 ที่รองรับมีดังนี้
ความสามารถในการเปลี่ยนแปลง
สตาร์ลาร์กไม่ชอบการเปลี่ยนแปลง โดยมีโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ 2 แบบ ได้แก่ lists และ dicts การเปลี่ยนแปลงโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ เช่น การเพิ่มค่าลงในรายการหรือการลบรายการในพจนานุกรม จะใช้ได้กับออบเจ็กต์ที่สร้างขึ้นในบริบทปัจจุบันเท่านั้น หลังจากจบบริบทแล้ว คุณค่าของเนื้อหาจะเปลี่ยนแปลงไม่ได้
เนื่องจากบิลด์ 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"
จะแสดงผลค่า "เท็จ"ใน Tuple คอมมาต่อท้ายจะใช้ได้เมื่อ Tuple อยู่ระหว่างวงเล็บเท่านั้น เมื่อคุณเขียน
(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
- มีฟังก์ชันในตัวส่วนใหญ่ และเมธอดส่วนใหญ่