Pkl, कॉन्फ़िगरेशन के लिए एक प्रोग्रामिंग भाषा

Apple ने Pkl को open-source किया है, जो एक typed, programmable configuration language है, जिसका उद्देश्य YAML और JSON जैसे formats जनरेट करना है, साथ ही templates, validation, और IDE tooling जोड़ना है। समर्थक Apple के भीतर इसकी सफलता को रेखांकित करते हैं, खासकर जटिल Kubernetes और Terraform setups को संभालने में, और इसे string-templated YAML तथा Helm charts के अधिक maintainable विकल्प के रूप में देखते हैं। संशयवादी एक और config language की ज़रूरत पर सवाल उठाते हैं—खासकर ऐसी जो Turing-complete हो, Java/GraalVM-based हो, और जिसमें Python/.NET bindings न हों—और बहस करते हैं कि क्या richer config DSLs वास्तव में जितनी समस्याएँ हल करती हैं, उससे अधिक समस्याएँ पैदा नहीं करतीं।

Pkl क्या है और इसकी मुख्य विशेषताएँ

  • नई “configuration as code” भाषा: declarative डेटा के साथ general-purpose constructs (types, conditionals, loops, imports)।
  • अन्य फ़ॉर्मैट जनरेट करती है (JSON, YAML, XML, PLIST, आदि) और bindings के माध्यम से embed की जा सकती है (वर्तमान में Go, Java, Kotlin, Swift) या CLI के जरिए उपयोग की जा सकती है।
  • मज़बूत static typing और validation: ranges, regexes, और richer templates/schemas जैसी constraints; “Pantry” नामक reusable templates के संग्रह के माध्यम से साझा की जा सकती है।
  • GraalVM/Truffle पर बनी; CLI और language bindings के लिए एक ही implementation; C/FFI-शैली embedding की योजनाएँ।

बताए गए उपयोग-केस

  • Apple के भीतर वर्षों से भारी उपयोग: Kubernetes manifests, Terraform, alerts, infra config, multi-target generation (monitoring configs + docs)।
  • कई टिप्पणीकारों का कहना है कि इसने उनके संगठनों में k8s के लिए Helm की जगह ले ली, जिससे string templating और YAML indentation समस्याओं से बचाव हुआ।
  • multi-output config pipelines के लिए प्रस्तावित (जैसे, एक Pkl source → k8s, Prometheus, docs, app config) और “config in Python/TypeScript” के एक सुरक्षित विकल्प के रूप में।

मौजूदा टूल्स से तुलना

  • अक्सर इनसे तुलना की जाती है: YAML/JSON (+ JSON Schema), Helm, Terraform/HCL, Jsonnet, Dhall, CUE, Nix, Starlark, Lua।
  • JSON/YAML की तुलना में: types, templating, validation, reuse जोड़ता है; fragile string templating से बचाता है।
  • Jsonnet के मुकाबले: समान “programmable config,” लेकिन Pkl typed है और इसके पास मज़बूत IDE tooling है; Jsonnet को इसकी simplicity और मौजूदा bindings के लिए सराहा जाता है।
  • CUE/Dhall के मुकाबले: Pkl Turing-complete है (अधिक expressive, अधिक risk); CUE/Dhall termination और अधिक principled logic/type foundations पर ज़ोर देते हैं।
  • “बस Python/TypeScript इस्तेमाल करें” के मुकाबले: समर्थकों का तर्क है कि उनमें packaging/runtime की समस्याएँ और unsafe, unsandboxed arbitrary code आती है; आलोचकों का कहना है कि एक नया DSL जोड़ना किसी परिचित general language का उपयोग करने से बदतर है।

Tooling, Ergonomics, और Implementation संबंधी चिंताएँ

  • IDE support: native IntelliJ plugin, basic VS Code/neovim plugins; LSP “जल्द आ रहा है।” कुछ लोग सवाल करते हैं कि LSP को प्राथमिक क्यों नहीं बनाया गया।
  • कुछ को runtime और binary size (Graal-based native binary ~100MB), Java dependency, और .NET/Python/Node bindings की कमी को लेकर चिंता है।
  • अन्य लोग प्रस्तावित C library की सराहना करते हैं और नोट करते हैं कि Graal/Truffle मजबूत optimization और polyglot embedding सक्षम करते हैं।

सुरक्षा, जटिलता, और Turing-Completeness

  • built-in HTTP/filesystem access के साथ Turing-completeness सुरक्षा और “slow config” संबंधी चिंताएँ उठाती है; maintainers sandboxing flags और options की ओर इशारा करते हैं।
  • इस पर बहस कि configs को вообще Turing-complete होना चाहिए या नहीं: कुछ लोग arbitrary transforms के लिए पूरी शक्ति चाहते हैं; अन्य termination guarantees और बहुत सीमित control flow को पसंद करते हैं।

उत्साह बनाम संदेह

  • उत्साही: इसे Apple के सबसे अच्छे internal tools में से एक कहते हैं, Helm/YAML की तुलना में “delightful” मानते हैं; type-safe config, reuse, IDE validation, और cross-language sharing पसंद करते हैं।
  • संशयवादी: “yet another config language” मानते हैं, डरते हैं कि config DSLs unreadable mini-programs बन जाते हैं, YAML+JSON Schema, Jsonnet, Cue, या बस real languages को प्राथमिकता देते हैं।
  • कुछ लोग Apple के open-source track record पर भरोसा नहीं करते और लंबे समय की community-friendliness तथा cross-platform focus पर सवाल उठाते हैं।
  • Python के “pickle” और .pkl files के साथ नाम की टकराव को संभावित रूप से भ्रमित करने वाला बताया गया है।