ภาษาสตาร์ลาร์ก

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้เป็นภาพรวมของ 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 ประเภท ได้แก่ ลิสต์และ 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" จะแสดงผลเป็นเท็จ

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