कॉमन एक्सप्रेशन लैंग्वेज (सीईएल) एक सामान्य-उद्देश्य वाली एक्सप्रेशन लैंग्वेज है. इसे तेज़ी से, पोर्टेबल तरीके से, और सुरक्षित तरीके से चलाने के लिए डिज़ाइन किया गया है. सीईएल का इस्तेमाल अकेले या किसी बड़े प्रॉडक्ट में एम्बेड करके किया जा सकता है. सीईएल, अलग-अलग तरह के ऐप्लिकेशन के लिए सही है. जैसे, रिमोट प्रोसीज़र कॉल (आरपीसी) को रूट करने से लेकर सुरक्षा नीतियां तय करने तक. सीईएल को बढ़ाया जा सकता है. यह प्लैटफ़ॉर्म पर निर्भर नहीं है. इसकी औपचारिक पुष्टि की जा सकती है. साथ ही, इसे कंपाइल-वंस/इवैल्युएट-मेनी वर्कफ़्लो के लिए ऑप्टिमाइज़ किया गया है.
सीईएल को खास तौर पर, उपयोगकर्ता के कोड को सुरक्षित तरीके से चलाने के लिए डिज़ाइन किया गया है. उपयोगकर्ता के Python कोड पर eval() को बिना सोचे-समझे कॉल करना खतरनाक हो सकता है. हालांकि, उपयोगकर्ता के सीईएल कोड को सुरक्षित तरीके से चलाया जा सकता है. साथ ही, सीईएल ऐसे व्यवहार को रोकता है जिससे इसकी परफ़ॉर्मेंस कम हो सकती है. इसलिए, यह नैनोसेकंड या माइक्रोसेकंड में सुरक्षित तरीके से काम करता है. सीईएल की रफ़्तार और सुरक्षा की वजह से, यह परफ़ॉर्मेंस के लिहाज़ से ज़रूरी ऐप्लिकेशन के लिए सही है.
सीईएल, ऐसे एक्सप्रेशन का आकलन करता है जो सिंगल-लाइन फ़ंक्शन या लैम्डा एक्सप्रेशन की तरह होते हैं. आम तौर पर, सीईएल का इस्तेमाल बूलियन फ़ैसलों के लिए किया जाता है. हालांकि, इसका इस्तेमाल JSON या प्रोटोकॉल बफ़र मैसेज जैसे ज़्यादा कॉम्प्लेक्स ऑब्जेक्ट बनाने के लिए भी किया जा सकता है.
सीईएल का इस्तेमाल क्यों करें?
कई सेवाएं और ऐप्लिकेशन, डिक्लेरेटिव कॉन्फ़िगरेशन का आकलन करते हैं. उदाहरण के लिए, रोल-आधारित ऐक्सेस कंट्रोल (आरबीएसी) एक डिक्लेरेटिव कॉन्फ़िगरेशन है. यह उपयोगकर्ता की भूमिका और उपयोगकर्ताओं के सेट के हिसाब से, ऐक्सेस से जुड़ा फ़ैसला लेता है. ज़्यादातर मामलों में, डिक्लेरेटिव कॉन्फ़िगरेशन काफ़ी होते हैं. हालांकि, कभी-कभी आपको ज़्यादा एक्सप्रेसिव पावर की ज़रूरत होती है. ऐसे में, सीईएल काम आता है.
डिक्लेरेटिव कॉन्फ़िगरेशन को सीईएल की मदद से बढ़ाने के उदाहरण के तौर पर, Google Cloud Identity and Access Management (IAM) की क्षमताओं पर विचार करें. आरबीएसी आम तौर पर इस्तेमाल किया जाता है. हालांकि, IAM, सीईएल एक्सप्रेशन उपलब्ध कराता है. इससे उपयोगकर्ता, अनुरोध या ऐक्सेस किए जा रहे संसाधनों की प्रोटो मैसेज प्रॉपर्टी के हिसाब से, रोल-आधारित ग्रांट के दायरे को और सीमित कर सकते हैं. डेटा मॉडल के ज़रिए ऐसी शर्तों के बारे में बताने से, एपीआई की सतह जटिल हो जाएगी और इस पर काम करना मुश्किल हो जाएगा. इसके बजाय, एट्रिब्यूट-आधारित ऐक्सेस कंट्रोल (एबीएसी) के साथ सीईएल का इस्तेमाल करना, आरबीएसी का एक एक्सप्रेसिव और पावरफ़ुल एक्सटेंशन है.
सीईएल के मुख्य सिद्धांत
सीईएल में, किसी एक्सप्रेशन को एनवायरमेंट के हिसाब से कंपाइल किया जाता है. कंपाइलेशन के चरण में, प्रोटोकॉल बफ़र फ़ॉर्मैट में एक ऐब्स्ट्रैक्ट सिंटैक्स ट्री (एएसटी) बनता है. कंपाइल किए गए एक्सप्रेशन को आने वाले समय में इस्तेमाल करने के लिए सेव किया जाता है, ताकि आकलन को ज़्यादा से ज़्यादा तेज़ी से किया जा सके. कंपाइल किए गए किसी एक एक्सप्रेशन का आकलन, अलग-अलग तरह के कई इनपुट के साथ किया जा सकता है.
यहां इनमें से कुछ सिद्धांतों के बारे में ज़्यादा जानकारी दी गई है.
एक्सप्रेशन
एक्सप्रेशन, उपयोगकर्ता लिखते हैं. एक्सप्रेशन, सिंगल-लाइन फ़ंक्शन बॉडी या लैम्डा एक्सप्रेशन की तरह होते हैं. इनपुट की जानकारी देने वाला फ़ंक्शन सिग्नेचर, सीईएल एक्सप्रेशन के बाहर लिखा जाता है. साथ ही, सीईएल के लिए उपलब्ध फ़ंक्शन की लाइब्रेरी अपने-आप इंपोर्ट हो जाती है.
उदाहरण के लिए, यहां दिया गया सीईएल एक्सप्रेशन एक अनुरोध ऑब्जेक्ट लेता है. इस अनुरोध में एक claims टोकन शामिल होता है. एक्सप्रेशन, एक बूलियन वैल्यू दिखाता है. इससे पता चलता है कि claims टोकन अब भी मान्य है या नहीं.
claims टोकन की पुष्टि करने के लिए, सीईएल एक्सप्रेशन का उदाहरण
// Check whether a JSON Web Token has expired by inspecting the 'exp' claim.
//
// Args:
// claims - authentication claims.
// now - timestamp indicating the current system time.
// Returns: true if the token has expired.
//
timestamp(claims["exp"]) < now
उपयोगकर्ता, सीईएल एक्सप्रेशन तय करते हैं. वहीं, सेवाएं और ऐप्लिकेशन, वह एनवायरमेंट तय करते हैं जिसमें यह चलता है.
एनवायरमेंट
एनवायरमेंट, सेवाएं तय करती हैं. सीईएल को एम्बेड करने वाली सेवाएं और ऐप्लिकेशन, एक्सप्रेशन एनवायरमेंट की जानकारी देते हैं. एनवायरमेंट, वैरिएबल और फ़ंक्शन का कलेक्शन होता है. इसका इस्तेमाल, सीईएल एक्सप्रेशन में किया जा सकता है.
उदाहरण के लिए, यहां दिया गया textproto कोड, सीईएल सेवा से CompileRequest मैसेज का इस्तेमाल करके, request और now वैरिएबल वाले एनवायरमेंट की जानकारी देता है.
सीईएल एनवायरमेंट की जानकारी देने वाले कोड का उदाहरण
# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
name: "request"
ident {
type { message_type: "google.rpc.context.AttributeContext.Request" }
}
}
declarations {
name: "now"
ident {
type { well_known: "TIMESTAMP" }
}
}
प्रोटो-आधारित जानकारी का इस्तेमाल, सीईएल टाइप-चेकर करता है. इससे यह पक्का किया जाता है कि किसी एक्सप्रेशन में मौजूद सभी आइडेंटिफ़ायर और फ़ंक्शन रेफ़रंस की जानकारी दी गई हो और उनका सही तरीके से इस्तेमाल किया जा रहा हो.
एक्सप्रेशन को प्रोसेस करने के चरण
सीईएल एक्सप्रेशन को तीन चरणों में प्रोसेस किया जाता है:
- पार्स करें
- चेक
- आकलन करें
सीईएल के इस्तेमाल का सबसे सामान्य पैटर्न यह है कि कॉन्फ़िगरेशन के समय, एक्सप्रेशन को पार्स और चेक किया जाए. इसके बाद, एएसटी को सेव किया जाए. फिर, रनटाइम में एएसटी को बार-बार वापस पाया जाए और उसका आकलन किया जाए.
सीईएल को प्रोसेस करने के चरणों का उदाहरण

सीईएल को, इंसान के पढ़ने लायक एक्सप्रेशन से एएसटी में पार्स किया जाता है. इसके लिए,
ANTLR लेक्सर और पार्सर व्याकरण का इस्तेमाल किया जाता है. पार्स करने के चरण में, प्रोटो-आधारित
एएसटी बनता है. इसमें, एएसटी के हर Expr नोड में एक इंटिजर आईडी होता है. इसका इस्तेमाल, पार्स करने और चेक करने के दौरान जनरेट किए गए मेटाडेटा को
इंडेक्स करने के लिए किया जाता है. पार्स करने के दौरान बनने वाली
syntax.proto फ़ाइल, एक्सप्रेशन के
स्ट्रिंग फ़ॉर्म में टाइप की गई चीज़ों के
ऐब्स्ट्रैक्ट प्रतिनिधित्व को दिखाती है.
किसी एक्सप्रेशन को पार्स करने के बाद, उसे एनवायरमेंट के हिसाब से टाइप-चेक किया जाता है. इससे यह पक्का किया जाता है कि एक्सप्रेशन में मौजूद सभी वैरिएबल और फ़ंक्शन आइडेंटिफ़ायर की जानकारी दी गई हो और उनका सही तरीके से इस्तेमाल किया जा रहा हो. टाइप-चेकर, a
checked.proto फ़ाइल बनाता है. इसमें टाइप, वैरिएबल, और फ़ंक्शन
रिज़ॉल्यूशन मेटाडेटा शामिल होता है. इससे आकलन की क्षमता को काफ़ी हद तक बेहतर बनाया जा सकता है.
आखिर में, किसी एक्सप्रेशन को पार्स और चेक करने के बाद, सेव किए गए एएसटी का आकलन किया जाता है.
सीईएल इवैल्युएटर को तीन चीज़ों की ज़रूरत होती है:
- कस्टम एक्सटेंशन के लिए फ़ंक्शन बाइंडिंग
- वैरिएबल बाइंडिंग
- आकलन के लिए एएसटी
फ़ंक्शन और वैरिएबल बाइंडिंग, एएसटी को कंपाइल करने के लिए इस्तेमाल की गई चीज़ों से मेल खानी चाहिए. इनमें से किसी भी इनपुट को एक से ज़्यादा बार इस्तेमाल किया जा सकता है. जैसे, वैरिएबल बाइंडिंग के कई सेट के लिए एएसटी का आकलन करना, कई एएसटी के लिए एक ही वैरिएबल का इस्तेमाल करना या किसी प्रोसेस के दौरान फ़ंक्शन बाइंडिंग का इस्तेमाल करना (यह आम बात है).
औपचारिक पुष्टि
रनटाइम में आकलन के अलावा, सीईएल एक्सप्रेशन और नीतियों की औपचारिक पुष्टि की जा सकती है. इससे गणित के हिसाब से यह साबित किया जा सकता है कि सभी संभावित इनपुट के लिए ये सही हैं.
Z3 थ्योरम प्रूवर की मदद से, सीईएल-Java में सीईएल फ़ॉर्मल वेरिफ़िकेशन फ़्रेमवर्क, एक्सप्रेशन और सीईएल की नीतियों को Satisfiability Modulo Theories (एसएमटी) फ़ॉर्मूले में बदलता है, ताकि:
- सुरक्षा इनवेरिएंट साबित किए जा सकें:
assumeऔरassertकी खास जानकारी का इस्तेमाल करके, यह पुष्टि की जा सके कि इनपुट के किसी भी कॉम्बिनेशन में, ज़रूरी नीतियों को बायपास नहीं किया जा सकता. - लॉजिकल इक्विवेलेंस की पुष्टि की जा सके: गणित के हिसाब से यह साबित किया जा सके कि रीफ़ैक्टर किए गए या एआई से जनरेट किए गए एक्सप्रेशन, ओरिजनल नियम की तरह ही काम करते हैं.
- पूरी तरह से वैधता लागू की जा सके: यह पक्का किया जा सके कि गार्डरेल (जैसे, Kubernetes Validating Admission Policies) सभी इनपुट के लिए लागू हों. साथ ही, उल्लंघन होने पर, ठोस काउंटर उदाहरण जनरेट किए जा सकें.
- फ़ॉल्स पॉज़िटिव को खत्म किया जा सके: अनमैप किए गए कस्टम फ़ंक्शन को अलग करने के लिए, तीन-पास टेंट ट्रैकिंग का इस्तेमाल किया जा सके. इससे यह पक्का किया जा सके कि रिपोर्ट किए गए उल्लंघन, हमेशा रीप्रोड्यूस किए जा सकने वाले बग हों.
इस बारे में जानकारी और असल दुनिया के उदाहरणों के लिए, Google Open Source का यह ब्लॉग पोस्ट पढ़ें: Securing the agentic era: Introducing formal verification for CEL.