तारीख सेव करें: BazelCon 2023, 24 से 25 अक्टूबर तक Google म्यूनिख में होगा! ज़्यादा जानें

स्टारलैक की भाषा

किसी समस्या की शिकायत करें स्रोत देखें

इस पेज पर, Starlark के बारे में खास जानकारी दी गई है. इसे Skylark के नाम से जाना जाता है, जो Bazel में इस्तेमाल की जाने वाली भाषा है. फ़ंक्शन और टाइप की पूरी सूची के लिए, Bazel API का रेफ़रंस देखें.

भाषा के बारे में ज़्यादा जानने के लिए, Starlark के GitHub रेपो को देखें.

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 टाइप का इस्तेमाल किया जा सकता है:

म्यूटेबिलिटी

स्टारलार्क अचलता का पक्ष लेता है. दो म्यूट किए जा सकने वाले डेटा स्ट्रक्चर उपलब्ध हैं: सूची और शब्द. बदली जा सकने वाली डेटा-संरचना में बदलाव, जैसे किसी सूची में वैल्यू जोड़ना या किसी शब्दकोश में कोई एंट्री मिटाना सिर्फ़ मौजूदा संदर्भ में बनाए गए ऑब्जेक्ट के लिए मान्य होते हैं. किसी संदर्भ के खत्म होने के बाद, उसके मान नहीं बदले जा सकते.

ऐसा इसलिए होता है, क्योंकि 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

foo.bzl के लोड होने पर Bazel var बनाता है. इसलिए, 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 फ़ाइलों में दो वाक्यात्मक प्रतिबंध होते हैं: 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}.

  • स्ट्रिंग को डबल कोट (जैसे कि जब आप रिप्रे कहते हैं) के साथ दिखाया जाता है.

  • स्ट्रिंग को फिर से इस्तेमाल नहीं किया जा सकता.

Python की ये सुविधाएं इस्तेमाल नहीं की जा सकतीं:

  • इंप्लिसिट स्ट्रिंग एग्रीगेशन: अश्लील + ऑपरेटर का इस्तेमाल करें.
  • उनकी तुलना करके मिली जानकारी, जैसे कि 1 < x < 5.
  • class (struct फ़ंक्शन देखें).
  • import (load स्टेटमेंट देखें).
  • while, yield.
  • फ़्लोट और सेट टाइप.
  • जनरेटर और एक्सप्रेशन का कॉम्बिनेशन.
  • is (इसके बजाय == का इस्तेमाल करें).
  • try, raise, except, finally (गंभीर गड़बड़ियों के लिए fail देखें).
  • global, nonlocal.
  • ज़्यादातर बिल्ट-इन फ़ंक्शन, इस्तेमाल करने के ज़्यादा तरीके.