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

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.4 ที่ใช้เวลาเพียง 2 นาที 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 ประเภทต่อไปนี้

ความสามารถในการเปลี่ยนแปลงได้

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