BazelCon 2022 akan hadir pada 16-17 November ke New York dan online.
Daftar sekarang.

Bahasa Starlark

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Halaman ini merupakan ringkasan dari Starlark, sebelumnya dikenal sebagai Skylark, bahasa yang digunakan dalam Bazel. Untuk mengetahui daftar lengkap fungsi dan jenis, lihat referensi Bazel API.

Untuk informasi selengkapnya tentang bahasa tersebut, lihat repo GitHub Starlark.

Untuk mengetahui spesifikasi resmi perilaku dan perilaku Starlark, lihat Spesifikasi Bahasa Starlark.

Sintaksis

Sintaksis Starlark terinspirasi oleh Python3. Ini adalah sintaksis yang valid di 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)

Semantik Starlark dapat berbeda dari Python, tetapi perbedaan perilaku jarang terjadi, kecuali untuk kasus di mana Starlark memunculkan error. Jenis Python berikut didukung:

Mutabilitas

Starlark mendukung immutability. Tersedia dua struktur data yang dapat diubah: daftar dan dikte. Perubahan pada struktur data yang dapat berubah, seperti menambahkan nilai ke daftar atau menghapus entri dalam kamus hanya valid untuk objek yang dibuat dalam konteks saat ini. Setelah konteks selesai, nilainya akan menjadi tidak dapat diubah.

Hal ini karena build Bazel menggunakan eksekusi paralel. Selama proses build, setiap file .bzl dan setiap file BUILD mendapatkan konteks eksekusinya sendiri. Setiap aturan juga dianalisis dalam konteksnya sendiri.

Mari kita lihat contoh pada file 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 membuat var saat foo.bzl dimuat. Oleh karena itu, var adalah bagian dari konteks foo.bzl. Saat fct() dijalankan, maka akan dilakukan dalam konteks foo.bzl. Setelah evaluasi untuk foo.bzl selesai, lingkungan berisi entri yang tidak dapat diubah, var, dengan nilai [5].

Saat bar.bzl lain memuat simbol dari foo.bzl, nilai yang dimuat tetap tidak dapat diubah. Untuk alasan ini, kode berikut di bar.bzl bersifat ilegal:

# `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

Variabel global yang ditentukan dalam file bzl tidak dapat diubah di luar file bzl yang menentukannya. Sama seperti contoh di atas yang menggunakan file bzl, nilai yang ditampilkan oleh aturan tidak dapat diubah.

Perbedaan antara file BUILD dan .bzl

File BUILD mendaftarkan target melalui panggilan ke aturan. File .bzl menyediakan definisi untuk konstanta, aturan, makro, dan fungsi.

Fungsi native dan aturan native adalah simbol global dalam file BUILD. File bzl perlu dimuat menggunakan modul native.

Ada dua batasan sintaksis dalam file BUILD: 1) mendeklarasikan fungsi tidak sah, dan 2) argumen *args dan **kwargs tidak diizinkan.

Perbedaan dengan Python

  • Variabel global tidak dapat diubah.

  • Pernyataan for tidak diizinkan di tingkat teratas. Gunakan dalam fungsi. Dalam file BUILD, Anda dapat menggunakan pemahaman daftar.

  • Pernyataan if tidak diizinkan di tingkat teratas. Namun, ekspresi if dapat digunakan: first = data[0] if len(data) > 0 else None.

  • Urutan deterministik untuk melakukan iterasi melalui Kamus.

  • Rekursi tidak diizinkan.

  • Jenis int terbatas pada bilangan bulat 32-bit yang telah ditandai. Menu tambahan akan memunculkan error.

  • Memodifikasi koleksi selama iterasi merupakan error.

  • Selain untuk pengujian persamaan, operator perbandingan <, <=, >=, >, dll. tidak ditentukan di seluruh jenis nilai. Singkatnya: 5 < 'foo' akan menampilkan error dan 5 == "5" akan menampilkan salah.

  • Dalam tuple, tanda koma tidak valid hanya jika tuple berada di antara tanda kurung — saat Anda menulis (1,), bukan 1,.

  • Literal kamus tidak boleh memiliki kunci duplikat. Misalnya, ini adalah error: {"a": 4, "b": 7, "a": 1}.

  • String direpresentasikan dengan tanda kutip ganda (seperti saat Anda memanggil repr).

  • String tidak dapat dikembalikan.

Fitur Python berikut tidak didukung:

  • penyambungan string implisit (gunakan operator + eksplisit).
  • Perbandingan berantai (seperti 1 < x < 5).
  • class (lihat fungsi struct).
  • import (lihat pernyataan load).
  • while, yield.
  • jenis float dan set.
  • generator dan ekspresi generator.
  • is (gunakan == sebagai gantinya).
  • try, raise, except, finally (lihat fail untuk mengetahui error fatal).
  • global, nonlocal.
  • sebagian besar fungsi bawaan, sebagian besar metode.