कॉमन एक्सप्रेशन लैंग्वेज (सीईएल) एक सामान्य एक्सप्रेशन लैंग्वेज है. इसे तेज़ी से, पोर्टेबल तरीके से, और सुरक्षित तरीके से एक्ज़ीक्यूट करने के लिए डिज़ाइन किया गया है. CEL का इस्तेमाल अकेले किया जा सकता है या इसे किसी बड़े प्रॉडक्ट में एम्बेड किया जा सकता है. CEL, कई तरह के ऐप्लिकेशन के लिए सबसे सही है. जैसे, रिमोट प्रोसीज़र कॉल (आरपीसी) को रूट करने से लेकर सुरक्षा नीतियां तय करने तक. CEL को बढ़ाया जा सकता है. यह किसी भी प्लैटफ़ॉर्म पर काम कर सकता है. साथ ही, इसे एक बार कंपाइल करने और कई बार आकलन करने वाले वर्कफ़्लो के लिए ऑप्टिमाइज़ किया गया है.
CEL को खास तौर पर, उपयोगकर्ता के कोड को सुरक्षित तरीके से लागू करने के लिए डिज़ाइन किया गया है. किसी उपयोगकर्ता के Python कोड पर बिना सोचे-समझे eval()
को कॉल करना खतरनाक हो सकता है. हालांकि, किसी उपयोगकर्ता के CEL कोड को सुरक्षित तरीके से एक्ज़ीक्यूट किया जा सकता है. साथ ही, CEL ऐसी गतिविधियों को रोकता है जिनकी वजह से परफ़ॉर्मेंस कम हो सकती है. इसलिए, यह नैनोसेकंड या माइक्रोसेकंड में सुरक्षित तरीके से आकलन करता है. CEL की स्पीड और सुरक्षा की वजह से, यह परफ़ॉर्मेंस के लिहाज़ से ज़रूरी ऐप्लिकेशन के लिए सबसे सही है.
CEL, सिंगल-लाइन फ़ंक्शन या लैम्डा एक्सप्रेशन जैसे एक्सप्रेशन का आकलन करता है. CEL का इस्तेमाल आम तौर पर, बूलियन फ़ैसलों के लिए किया जाता है. हालांकि, इसका इस्तेमाल JSON या प्रोटोकॉल बफ़र मैसेज जैसे ज़्यादा कॉम्प्लेक्स ऑब्जेक्ट बनाने के लिए भी किया जा सकता है.
सीईएल क्यों?
कई सेवाएँ और ऐप्लिकेशन, एलान किए गए कॉन्फ़िगरेशन का आकलन करते हैं. उदाहरण के लिए, भूमिका के आधार पर ऐक्सेस कंट्रोल (आरबीएसी) एक एलान वाला कॉन्फ़िगरेशन है. यह उपयोगकर्ता की भूमिका और उपयोगकर्ताओं के सेट के आधार पर, ऐक्सेस करने का फ़ैसला लेता है. ज़्यादातर मामलों में, एलान वाले कॉन्फ़िगरेशन काफ़ी होते हैं. हालांकि, कभी-कभी आपको ज़्यादा एक्सप्रेसिव पावर की ज़रूरत होती है. ऐसे में, CEL काम आता है.
CEL की मदद से डिक्लेरेटिव कॉन्फ़िगरेशन को बढ़ाने के उदाहरण के तौर पर, Google Cloud Identity and Access Management (IAM) की सुविधाओं के बारे में जानें. RBAC एक सामान्य तरीका है. हालांकि, IAM उपयोगकर्ताओं को CEL एक्सप्रेशन उपलब्ध कराता है. इनकी मदद से, उपयोगकर्ता अनुरोध या ऐक्सेस किए जा रहे संसाधनों की प्रोटो मैसेज प्रॉपर्टी के हिसाब से, भूमिका के आधार पर दी गई अनुमति के दायरे को और सीमित कर सकते हैं. डेटा मॉडल के ज़रिए ऐसी स्थितियों के बारे में बताने से, एपीआई की सतह जटिल हो जाएगी. इस पर काम करना मुश्किल होगा. इसके बजाय, एट्रिब्यूट के आधार पर ऐक्सेस कंट्रोल (एबीएसी) के साथ CEL का इस्तेमाल करना, RBAC का एक बेहतर और असरदार एक्सटेंशन है.
सीईएल के मुख्य सिद्धांत
सीईएल में, किसी एक्सप्रेशन को एनवायरमेंट के हिसाब से कंपाइल किया जाता है. कंपाइलेशन चरण में, प्रोटोकॉल बफ़र फ़ॉर्मैट में ऐब्स्ट्रैक्ट सिंटैक्स ट्री (एएसटी) बनता है. कंपाइल किए गए एक्सप्रेशन को बाद में इस्तेमाल करने के लिए सेव किया जाता है, ताकि आकलन को जल्द से जल्द पूरा किया जा सके. किसी एक कंपाइल किए गए एक्सप्रेशन का आकलन, कई अलग-अलग इनपुट के साथ किया जा सकता है.
यहां इन कॉन्सेप्ट के बारे में ज़्यादा जानकारी दी गई है.
एक्सप्रेशन
एक्सप्रेशन, उपयोगकर्ता लिखते हैं. एक्सप्रेशन, सिंगल-लाइन फ़ंक्शन बॉडी या लैम्डा एक्सप्रेशन के जैसे होते हैं. इनपुट का एलान करने वाला फ़ंक्शन सिग्नेचर, CEL एक्सप्रेशन के बाहर लिखा जाता है. साथ ही, CEL के लिए उपलब्ध फ़ंक्शन की लाइब्रेरी अपने-आप इंपोर्ट हो जाती है.
उदाहरण के लिए, यहां दिया गया CEL एक्सप्रेशन एक अनुरोध ऑब्जेक्ट लेता है. साथ ही, अनुरोध में claims
टोकन शामिल होता है. एक्सप्रेशन, बूलियन वैल्यू दिखाता है. इससे पता चलता है कि claims
टोकन अब भी मान्य है या नहीं.
दावों वाले टोकन की पुष्टि करने के लिए, CEL एक्सप्रेशन का उदाहरण
// 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
उपयोगकर्ता, CEL एक्सप्रेशन तय करते हैं. वहीं, सेवाएं और ऐप्लिकेशन, वह एनवायरमेंट तय करते हैं जहां यह चलता है.
एनवायरमेंट
सेवाओं के हिसाब से एनवायरमेंट तय किए जाते हैं. CEL को एम्बेड करने वाली सेवाएं और ऐप्लिकेशन, एक्सप्रेशन एनवायरमेंट के बारे में बताते हैं. एनवायरमेंट, वैरिएबल और फ़ंक्शन का कलेक्शन होता है. इनका इस्तेमाल CEL एक्सप्रेशन में किया जा सकता है.
उदाहरण के लिए, यहां दिया गया textproto
कोड, request
और now
वैरिएबल वाले एनवायरमेंट का एलान करता है. इसके लिए, CEL सेवा से मिले CompileRequest
मैसेज का इस्तेमाल किया जाता है.
CEL एनवायरमेंट के एलान का उदाहरण
# Format: $SOURCE_PATH/service.proto#CompileRequest
declarations {
name: "request"
ident {
type { message_type: "google.rpc.context.AttributeContext.Request" }
}
}
declarations {
name: "now"
ident {
type { we
ll_known: "TIMESTAMP" }
}
}
प्रोटो-आधारित घोषणाओं का इस्तेमाल, CEL टाइप-चेकर करता है. इससे यह पक्का किया जाता है कि किसी एक्सप्रेशन में मौजूद सभी आइडेंटिफ़ायर और फ़ंक्शन रेफ़रंस सही तरीके से घोषित किए गए हों और उनका इस्तेमाल किया गया हो.
एक्सप्रेशन प्रोसेसिंग के चरण
सीईएल एक्सप्रेशन को तीन चरणों में प्रोसेस किया जाता है:
- पार्स करें
- चेक
- आकलन करें
CEL का इस्तेमाल करने का सबसे सामान्य तरीका यह है कि कॉन्फ़िगरेशन के समय एक्सप्रेशन को पार्स और जांचा जाए, एएसटी को सेव किया जाए, और फिर रनटाइम में एएसटी को बार-बार वापस लाया जाए और उसका आकलन किया जाए.
सीईएल को प्रोसेस करने के चरणों का उदाहरण
CEL को आसानी से समझने लायक एक्सप्रेशन से एएसटी में पार्स किया जाता है. इसके लिए, ANTLR लेक्सर और पार्सर व्याकरण का इस्तेमाल किया जाता है. पार्स करने के दौरान, प्रोटो-आधारित एएसटी जनरेट होता है. एएसटी में मौजूद हर Expr
नोड में एक पूर्णांक आईडी होता है. इसका इस्तेमाल, पार्स करने और जांच करने के दौरान जनरेट किए गए मेटाडेटा को इंडेक्स करने के लिए किया जाता है. पार्सिंग के दौरान जनरेट हुई syntax.proto
फ़ाइल, एक्सप्रेशन के स्ट्रिंग फ़ॉर्म में टाइप किए गए कॉन्टेंट का ऐब्स्ट्रैक्ट रिप्रज़ेंटेशन दिखाती है.
एक्सप्रेशन को पार्स करने के बाद, एनवायरमेंट के हिसाब से उसके टाइप की जांच की जाती है. इससे यह पक्का किया जाता है कि एक्सप्रेशन में मौजूद सभी वैरिएबल और फ़ंक्शन आइडेंटिफ़ायर, पहले से तय किए गए हों और उनका सही तरीके से इस्तेमाल किया जा रहा हो. टाइप-चेकर, checked.proto
फ़ाइल बनाता है. इसमें टाइप, वैरिएबल, और फ़ंक्शन रिज़ॉल्यूशन मेटाडेटा शामिल होता है. इससे आकलन की क्षमता में काफ़ी सुधार हो सकता है.
आखिर में, एक्सप्रेशन को पार्स और उसकी जांच करने के बाद, सेव किए गए AST का आकलन किया जाता है.
CEL का आकलन करने वाले को तीन चीज़ों की ज़रूरत होती है:
- किसी भी कस्टम एक्सटेंशन के लिए फ़ंक्शन बाइंडिंग
- वैरिएबल बाइंडिंग
- आकलन करने के लिए एएसटी
फ़ंक्शन और वैरिएबल बाइंडिंग, एएसटी को कंपाइल करने के लिए इस्तेमाल की गई बाइंडिंग से मेल खानी चाहिए. इनमें से किसी भी इनपुट का इस्तेमाल, कई आकलन में फिर से किया जा सकता है. जैसे, वैरिएबल बाइंडिंग के कई सेट में किसी एएसटी का आकलन किया जा रहा है, कई एएसटी के लिए एक ही वैरिएबल का इस्तेमाल किया जा रहा है या किसी प्रोसेस के पूरे लाइफ़टाइम के दौरान फ़ंक्शन बाइंडिंग का इस्तेमाल किया जा रहा है (यह एक सामान्य मामला है).