หน้านี้เป็นภาพรวมของ 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 ต่อไปนี้
คำอธิบายประกอบประเภท
ทดลอง คำอธิบายประกอบประเภทเป็นฟีเจอร์ทดลองและอาจมีการเปลี่ยนแปลง
ได้ทุกเมื่อ อย่าพึ่งพาการแปล โดยอาจเปิดใช้ใน Bazel ที่ HEAD
โดยใช้แฟล็ก --experimental_starlark_types
Starlark ใน Bazel ที่ HEAD กำลังเพิ่มการรองรับคำอธิบายประกอบประเภททีละน้อย ด้วยไวยากรณ์ที่ได้รับแรงบันดาลใจจาก PEP 484
- คำอธิบายประกอบประเภท Starlark อยู่ระหว่างการพัฒนา ความคืบหน้าจะ ติดตามได้ในปัญหา#22935
- เราจะค่อยๆ ขยายข้อกำหนด starlark-with-types/spec.md
- ข้อเสนอเริ่มต้น: SEP-001 Bootstrapping Starlark types
ความสามารถในการเปลี่ยนแปลงได้
Starlark ให้ความสำคัญกับความไม่เปลี่ยนแปลง มีโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ 2 แบบ ได้แก่ ลิสต์และพจนานุกรม การเปลี่ยนแปลงโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ เช่น การต่อท้ายค่าในรายการหรือการลบรายการใน พจนานุกรม จะใช้ได้กับออบเจ็กต์ที่สร้างในบริบทปัจจุบันเท่านั้น หลังจาก บริบทสิ้นสุดลง ค่าของบริบทจะเปลี่ยนแปลงไม่ได้
เนื่องจากการสร้าง 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- ประเภทลอยและประเภทชุด
- เครื่องกำเนิดไฟฟ้าและนิพจน์เครื่องกำเนิดไฟฟ้า
is(ใช้==แทน)try,raise,except,finally(ดูfailสำหรับข้อผิดพลาดร้ายแรง)global,nonlocal- ฟังก์ชันในตัวส่วนใหญ่ เมธอดส่วนใหญ่