कॉमन एक्सप्रेशन लैंग्वेज (सीईएल)

कॉमन एक्सप्रेशन लैंग्वेज (सीईएल), अलग-अलग कामों के लिए इस्तेमाल की जाने वाली एक्सप्रेशन भाषा है. इसे तेज़ी से, पोर्टेबल और सुरक्षित तरीके से चलाया जा सकता है. सीईएल का इस्तेमाल खुद किया जा सकता है या इसे किसी बड़े प्रॉडक्ट में एम्बेड किया जा सकता है. सीईएल, रिमोट प्रोसेस कॉल (आरपीसी) रूट करने से लेकर सुरक्षा नीतियां तय करने तक, कई तरह के ऐप्लिकेशन के लिए सबसे सही है. सीईएल एक बेहतरीन प्लैटफ़ॉर्म है. यह पूरी तरह से प्लैटफ़ॉर्म पर काम करता है. साथ ही, यह कई वर्कफ़्लो के लिए ऑप्टिमाइज़ किया गया है, जिनसे एक बार में कंपाइल किया जा सकता है या उनका आकलन किया जा सकता है.

सीईएल को खास तौर पर, उपयोगकर्ता कोड को एक्ज़ीक्यूट करने के लिए सुरक्षित बनाने के लिए डिज़ाइन किया गया था. हालांकि, किसी उपयोगकर्ता के Python कोड पर अनजाने में eval() को कॉल करना खतरनाक होता है. हालांकि, आपके पास उपयोगकर्ता के सीईएल कोड को सुरक्षित तरीके से चलाने का विकल्प होता है. सीईएल ऐसी गतिविधि को रोकता है जो इसे कम परफ़ॉर्म करने वाला बनाती है. इसलिए, यह नैनोसेकंड या माइक्रोसेकंड में सुरक्षित तरीके से आकलन करता है. सीईएल की रफ़्तार और सुरक्षा, इसे बहुत ही ज़रूरी ऐप्लिकेशन के लिए एकदम सही बनाती है.

CEL, सिंगल-लाइन फ़ंक्शन या Lambda एक्सप्रेशन से मिलते-जुलते एक्सप्रेशन का आकलन करता है. आम तौर पर, सीईएल का इस्तेमाल बूलियन फ़ैसलों के लिए किया जाता है. हालांकि, इसका इस्तेमाल JSON या प्रोटोकॉल बफ़र मैसेज जैसे ज़्यादा जटिल ऑब्जेक्ट बनाने में भी किया जा सकता है.

सीईएल क्यों ज़रूरी है?

कई सेवाएं और ऐप्लिकेशन, एलान वाले कॉन्फ़िगरेशन की जांच करते हैं. उदाहरण के लिए, भूमिका पर आधारित ऐक्सेस कंट्रोल (आरबीएसी), जानकारी देने वाला एक कॉन्फ़िगरेशन है. इससे, उपयोगकर्ता की भूमिका और उपयोगकर्ताओं के सेट के आधार पर, ऐक्सेस से जुड़ा फ़ैसला लिया जाता है. ज़्यादातर मामलों में डिक्लेरेटिव कॉन्फ़िगरेशन ही काफ़ी होते हैं, लेकिन कभी-कभी आपको ज़्यादा असरदार होने की ज़रूरत होती है. ऐसी ही स्थिति में सीईएल की ज़रूरत है.

सीईएल के साथ डिक्लेरेटिव कॉन्फ़िगरेशन को बढ़ाने के उदाहरण के तौर पर, Google Cloud की पहचान और ऐक्सेस मैनेजमेंट (IAM) की सुविधाओं पर ध्यान दें. हालांकि, आरबीएसी एक सामान्य मामला है, लेकिन IAM, सीईएल एक्सप्रेशन की सुविधा देते हैं. इससे उपयोगकर्ता, अनुरोध के प्रोटो मैसेज प्रॉपर्टी या ऐक्सेस किए जा रहे रिसॉर्स के आधार पर, रोल-आधारित अनुदान के दायरे को और सीमित कर सकते हैं. डेटा मॉडल के ज़रिए ऐसी स्थितियों के बारे में बताने से एपीआई का एक जटिल प्लैटफ़ॉर्म होगा, जिस पर काम करना मुश्किल होता है. इसके बजाय, एट्रिब्यूट-आधारित ऐक्सेस कंट्रोल (ABAC) के साथ सीईएल का इस्तेमाल करना आरबीएसी का एक असरदार और असरदार एक्सटेंशन है.

सीईएल के मुख्य सिद्धांत

सीईएल में, किसी एक्सप्रेशन को एनवायरमेंट के हिसाब से कंपाइल किया जाता है. कंपाइलेशन चरण प्रोटोकॉल बफ़र फ़ॉर्मैट में एक ऐब्सट्रैक्ट सिंटैक्स ट्री (एएसटी) बनाता है. कंपाइल किए गए एक्सप्रेशन सेव किए जाते हैं, ताकि आने वाले समय में उनका इस्तेमाल किया जा सके, ताकि आकलन को जल्द से जल्द रखा जा सके. किसी एक कंपाइल किए गए एक्सप्रेशन का आकलन कई अलग-अलग इनपुट से किया जा सकता है.

यहां इन सिद्धांतों में से कुछ के बारे में विस्तार से बताया गया है.

एक्सप्रेशन

एक्सप्रेशन को उपयोगकर्ताओं ने लिखा है. एक्सप्रेशन, सिंगल-लाइन फ़ंक्शन बॉडी या Lambda एक्सप्रेशन जैसे ही होते हैं. इनपुट का एलान करने वाला फ़ंक्शन सिग्नेचर, सीईएल एक्सप्रेशन के बाहर लिखा गया है. सीईएल में उपलब्ध फ़ंक्शन की लाइब्रेरी अपने-आप इंपोर्ट हो जाती है.

उदाहरण के लिए, नीचे दिया गया सीईएल एक्सप्रेशन, अनुरोध ऑब्जेक्ट को लेता है और अनुरोध में, 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" }
  }
}

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

एक्सप्रेशन प्रोसेसिंग के चरण

सीईएल एक्सप्रेशन तीन चरणों में प्रोसेस किए जाते हैं:

  1. पार्स करें
  2. जांच करें
  3. आकलन करें

सीईएल के इस्तेमाल का सबसे सामान्य पैटर्न कॉन्फ़िगरेशन के समय एक्सप्रेशन को पार्स करना और उनकी जांच करना है. साथ ही, एएसटी को स्टोर करना और फिर रनटाइम के दौरान बार-बार एएसटी को फिर से पाना और उसका आकलन करना है.

सीईएल प्रोसेसिंग के अलग-अलग चरणों की जानकारी देने वाली इमेज

एक्सप्रेशन को कॉन्फ़िगरेशन पाथ पर पार्स और उसकी जांच की जाती है. इसके बाद, उसे स्टोर किया जाता है और फिर रीड पाथ पर एक या ज़्यादा कॉन्टेक्स्ट के हिसाब से उसका आकलन किया जाता है.

सीईएल को ANTLR लेक्सर और पार्सर व्याकरण में इस्तेमाल किए जाने वाले ऐसे एक्सप्रेशन से एएसटी में पार्स किया जाता है जिसे इंसान पढ़ता है. पार्स करने के चरण से, प्रोटो-आधारित एएसटी निकलता है. एएसटी में हर Expr नोड एक पूर्णांक आईडी होता है. इसका इस्तेमाल पार्स करने और जांच करने के दौरान जनरेट किए गए मेटाडेटा में इंडेक्स करने के लिए किया जाता है. पार्स करने के दौरान बनाई गई syntax.proto फ़ाइल, एक्सप्रेशन के स्ट्रिंग फ़ॉर्म में टाइप की गई चीज़ों को ऐब्सट्रैक्ट तरीके के तौर पर दिखाती है.

एक्सप्रेशन को पार्स करने के बाद, एनवायरमेंट के लिए टाइप की जांच की जाती है. इससे यह पक्का किया जाता है कि एक्सप्रेशन के सभी वैरिएबल और फ़ंक्शन आइडेंटिफ़ायर का एलान कर दिया गया है और उनका सही तरीके से इस्तेमाल किया जा रहा है. टाइप चेकर, checked.proto ऐसी फ़ाइल बनाता है जिसमें टाइप, वैरिएबल, और फ़ंक्शन रिज़ॉल्यूशन मेटाडेटा होता है. यह मेटाडेटा आकलन करने की प्रोसेस को काफ़ी बेहतर बना सकता है.

आखिर में, किसी एक्सप्रेशन को पार्स करने और उसकी जांच करने के बाद, सेव किए गए AST का आकलन किया जाता है.

सीईएल समीक्षक को तीन चीज़ों की ज़रूरत होती है:

  • किसी भी कस्टम एक्सटेंशन के लिए फ़ंक्शन बाइंडिंग
  • वैरिएबल बाइंडिंग
  • आकलन करने के लिए एएसटी

फ़ंक्शन और वैरिएबल बाइंडिंग, एएसटी को कंपाइल करने के लिए इस्तेमाल किए गए फ़ंक्शन से मेल खाने चाहिए. इनमें से किसी भी इनपुट का फिर से इस्तेमाल किया जा सकता है. जैसे कि वैरिएबल बाइंडिंग के कई सेट में एएसटी का आकलन किया जा रहा है, कई एएसटी के लिए एक जैसे वैरिएबल का इस्तेमाल किया जा रहा है या किसी प्रोसेस के पूरे जीवनकाल में इस्तेमाल की जाने वाली फ़ंक्शन बाइंडिंग (सामान्य मामला).