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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

หน้านี้เป็นภาพรวมของ 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
  • ฟังก์ชันในตัวส่วนใหญ่ เมธอดส่วนใหญ่