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