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

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4

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