From LaTeX and OCaml to LEAN4 and Executables: Lean-Checked Theorems and Generating Proof-Carrying Rust
यह शोधपत्र पायथन-आधारित हिंडली-मिलनर (Hindley–Milner) फ्रंट एंड प्रस्तुत करता है जो ओकैml (OCaml) के एक उपसमुच्चय के लिए, जो साथ ही लीन 4 (Lean 4)-सत्यापित प्रमेय और प्रमाण-वहन अनुबंधों (proof-carrying contracts) के साथ निष्पादन योग्य रस्ट (Rust) कोड उत्पन्न करता है, पारस्परिक आगमनात्मक प्रकारों (mutual inductive types), हस्ताक्षरित पूर्णांक अंकगणित (signed integer arithmetic), और एक कर्नेल एवं उसके स्व-वर्णनात्मक समीकरण के क्रॉस-कार्यान्वयन सत्यापन के माध्यम से प्रणाली को सफलतापूर्वक मान्य करता है।
मूल पेपर CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
सॉफ्टवेयर की दुनिया में, इस बात के बीच एक निरंतर तनाव रहता है कि हम कोड कैसे लिखते हैं और हमें कैसे पता चलता है कि वह सुरक्षित है। प्रोग्रामर जटिल तर्क को समझने योग्य और प्रबंधनीय बनाने के लिए उच्च-स्तरीय (high-level) भाषाओं का उपयोग करते हैं, लेकिन वे मशीनें जो इस कोड को चलाती हैं, बहुत सरल और अधिक कठोर भाषा बोलती हैं। एक से दूसरे तक पहुँचने के लिए, कंपाइलर अनुवादक के रूप में कार्य करते हैं, लेकिन यह अनुवाद प्रक्रिया ही वह स्थान है जहाँ त्रुटियाँ अक्सर छिपी होती हैं। अनुवाद में एक गलती एक सुरक्षित निर्देश को खतरनाक निर्देश में बदल सकती है, जिससे प्रोग्राम क्रैश हो सकता है या अप्रत्याशित व्यवहार कर सकता है। दशकों से, सुरक्षा सुनिश्चित करने का सबसे विश्वसनीय तरीका अंतिम मशीन कोड को सत्यापित करना रहा है, लेकिन यह कठिन है क्योंकि मूल प्रोग्राम का उच्च-स्तरीय अर्थ अक्सर इस प्रक्रिया में खो जाता है। शोधकर्ता यह सवाल पूछ रहे हैं कि क्या हम मूल उच्च-स्तरीय भाषा की स्पष्टता को बनाए रखते हुए, पूर्ण निश्चितता के साथ यह सिद्ध कर सकते हैं कि अंतिम मशीन निर्देश बिल्कुल वैसा ही करेंगे जैसा हमारा इरादा है।
ब्रेंट हार्टशॉर्न ने एक ऐसा सिस्टम बनाया है जो इस प्रश्न का उत्तर देता है, जो एक ही कोड के टुकड़े को एक साथ दो अलग-अलग चीजों के रूप में मानता है। एक ऐसी दस्तावेज़ की कल्पना करें जिसे एक साथ एक गणितीय प्रमाण और एक मशीन के लिए निर्देशों के सेट के रूप में पढ़ा जा सके। इस नए कार्य में, लेखक एक प्रोग्रामिंग भाषा का एक उपसमुच्चय (subset) लेते हैं जिसे OCaml कहा जाता है, जो डेटा को संभालने के अपने सख्त नियमों के लिए जानी जाती है, और प्रत्येक परिभाषा को दो अलग-अलग अर्थ देते हैं। पहले, कोड को एक तार्किक तर्क (logical argument) के रूप में पढ़ा जाता है, जहाँ प्रोग्राम की संरचना स्वयं एक प्रमाण के रूप में कार्य करती है कि कुछ शर्तें हमेशा पूरी की जाएंगी। दूसरा, उसी कोड को एक अलग भाषा में अनुवादित किया जाता है जिसे Rust कहा जाता है, जो गति और सुरक्षा के लिए डिज़ाइन की गई है, और फिर इसे एक प्रोग्राम में संकलित (compile) किया जाता है जिसे वास्तव में कंप्यूटर चला सकता है। इस दृष्टिकोण की प्रतिभा सत्यापन में निहित है: तार्किक प्रमाण की जाँच एक छोटे, विश्वसनीय गणितीय इंजन द्वारा की जाती है, जबकि चलते हुए प्रोग्राम की जाँच एक संदर्भ इंटरप्रेटर (reference interpreter) के विरुद्ध की जाती है जो कोड को चरण-दर-चरण सिम्युलेट करता है। यदि दोनों मेल खाते हैं, और यदि तार्किक प्रमाण कायम रहता है, तो परिणाम सॉफ्टवेयर का एक ऐसा टुकड़ा होता है जो अपने स्वयं के सुरक्षा प्रमाण-पत्र के साथ आता है।
शोधकर्ताओं ने शुरू में एक अनुवादक बनाने से शुरुआत की जो OCaml के एक विशिष्ट हिस्से को समझता है। यह अनुवादक, जो Python में लिखा गया है, इतना छोटा है कि इसे एक व्यक्ति द्वारा पढ़ा और समझा जा सके, जो कि अत्यंत महत्वपूर्ण है क्योंकि यदि अनुवादक स्वयं बहुत जटिल है, तो हम इसके आउटपुट पर भरोसा नहीं कर सकते। यह OCaml कोड लेता है और इसे दो पथों में विभाजित करता है। प्रमाण पथ (proof path) पर, यह कोड को एक ऐसे प्रारूप में परिवर्तित करता है जिसे एक गणितीय कर्नेल (mathematical kernel) जाँच सकता है। यह कर्नेल एक छोटा सा प्रोग्राम है जो एक न्यायाधीश के रूप में कार्य करता है, जो यह सत्यापित करता है कि तर्क सुदृढ़ है और बिना किसी धारणा के काम करता है। प्रोग्राम पथ पर, अनुवादक कोड को Rust में परिवर्तित करता है, जो एक ऐसी भाषा है जिसे तेज़, नेटिव मशीन कोड में संकलित किया जाता है। यह सुनिश्चित करने के लिए कि अनुवाद सटीक था, टीम ने एक संदर्भ इंटरप्रेटर भी बनाया जो मूल OCamL कोड को सीधे चलाता है। उन्होंने फिर तेरह अलग-अलग उदाहरण प्रोग्रामों को संकलित Rust संस्करण और इंटरप्रेटर दोनों के माध्यम से चलाया। हर एक मामले में, संकलित कोड ने इंटरप्रेटर के समान ही आउटपुट दिया, जिससे यह सिद्ध हुआ कि अनुवाद प्रक्रिया ने प्रोग्रामों के व्यवहार को नहीं बदला।
एक बार जब कोड सफलतापूर्वक अनुवादित हो गया, तो टीम ने संकलित Rust संस्करण पर एक कठोर सुरक्षा जाँच लागू की। उन्होंने संकलित कोड को एक अनुबंध (contract) की तरह माना, जहाँ प्रोग्राम को कैसे व्यवहार करना चाहिए, इसके विशिष्ट नियम गणितीय प्रमेयों के रूप में लिखे गए थे। उदाहरण के लिए, उन्होंने जाँच की कि पूर्णांक गणनाएँ (integer calculations) कभी भी गलती से ओवरफ्लो होकर नकारात्मक संख्या में न बदल जाएँ, जो सॉफ्टवेयर में बग का एक सामान्य स्रोत है। उन्होंने पाया कि जबकि अधिकांश सुरक्षा नियम सही थे, वहाँ कुछ विशिष्ट मामले (edge cases) थे जहाँ नियम टूट गए थे। ग्यारह अलग-अलग परिदृश्यों में, संकलित कोड एक ऐसे बिंदु पर पहुँचा जहाँ एक पूर्णांक गणना ओवरफ्लो हो सकती थी, जैसे कि शून्य से सबसे छोटी संभव संख्या को घटाते समय। सिस्टम ने इन्हें 'ओपन ऑब्लिगेशन्स' (open obligations) के रूप में सही ढंग से पहचाना, जिसका अर्थ है कि कोड हर जगह सुरक्षित था सिवाय इन विशिष्ट, ज्ञात सीमाओं के। उदाहरण प्रोग्रामों पर किए गए कुल नब्बे सुरक्षा परीक्षणों में से, उन में से बहत्तर पूरी तरह से सिद्ध किए गए थे, जबकि शेष ग्यारह को खुला छोड़ दिया गया था क्योंकि वे कंप्यूटर द्वारा संख्याओं को संभालने के वास्तविक, सुलभ सीमाओं का प्रतिनिधित्व करते थे।
यह परियोजना एक छोटे ऑपरेटिंग सिस्टम कर्नेल, जो कंप्यूटर संसाधनों को प्रबंधित करने वाला एक मुख्य सॉफ्टवेयर है, पर इस पद्धति को लागू करके आगे बढ़ी। शोधकर्ताओं ने एक कर्नेल लिया जो पहले Python और Rust में लिखा गया था और उसे उनके OCaml उपसमुच्चय में फिर से लिखा। फिर उन्होंने इस नए संस्करण को Rust में अनुवादित किया और संकलित किया। परिणाम उसी कर्नेल का तीसरा कार्यान्वयन (implementation) था। मूल Python संस्करण के विरुद्ध परीक्षण करने पर, नया OCaml-व्युत्पन्न संस्करण सभी 236 परीक्षण मामलों में सही उत्तर देता है। टीम ने इस नए कर्नेल की सुरक्षा को सिद्ध करने का प्रयास किया। वे 236 में से 227 सुरक्षा दायित्वों को सफलतापूर्वक सिद्ध करने में सफल रहे। जो कुछ भी अप्रामाणित रह गया था, वह कोड की त्रुटि नहीं थी, बल्कि उन गणितीय उपकरणों में अंतराल था जिनका उपयोग उन्हें जाँचने के लिए किया जाता था, विशेष रूप से इस संबंध में कि सिस्टम जटिल लूप और काउंटरों को कैसे संभालता है। इसने प्रदर्शित किया कि यह पद्धति एक कार्यात्मक ऑपरेटिंग सिस्टम घटक से लेकर छोटे उदाहरणों तक स्केल कर सकती है।
शायद इस कार्य का सबसे उल्लेखनीय हिस्सा एक गणितीय समीकरण को सीधे एक चालू प्रोग्राम में बदलने की क्षमता थी। शोधकर्ताओं ने एक औपचारिक समीकरण लिया जो एक कर्नेल के व्यवहार का वर्णन करता था, जिसे मानक गणितीय नोटेशन में लिखा गया था, और उसे OCaml कोड में बदलने वाले टूल में डाला। इस कोड को फिर संकलित और चलाया गया। परिणामी प्रोग्राम ठीक वैसा ही व्यवहार करता है जैसा कि समीकरण वर्णित करता है, और हर मामले में मूल Python मॉडल के आउटपुट से मेल खाता है। इस प्रक्रिया ने दिखाया कि एक उच्च-स्तरीय गणितीय विवरण को उसका अर्थ खोए बिना एक सत्यापित, निष्पादन योग्य बाइनरी (executable binary) में बदला जा सकता है। टीम ने सिद्ध किया कि उनके समीकरण का संकलित संस्करण अधिकांश सुरक्षा अनुबंधों को पूरा करता है, हालांकि कुछ अधिक जटिल तार्किक चरणों के लिए जाँच उपकरणों में और अधिक सुधार की आवश्यकता थी।
इस कार्य के निष्कर्ष विश्वसनीय सॉफ्टवेयर बनाने के लिए एक नए मार्ग का सुझाव देते हैं। उच्च-स्तरीय सोर्स कोड को बनाए रखकर और इसके तार्किक अर्थ और इसके संकलित रूप दोनों को सत्यापित करके, शोधकर्ताओं ने एक ऐसा सिस्टम बनाया है जहाँ अंतिम प्रोग्राम की सुरक्षा एक गणितीय प्रमाण द्वारा समर्थित है। पद्धति ने कंप्यूटर द्वारा संख्याओं को संभालने में पूर्णांक ओवरफ्लो जैसी वास्तविक दुनिया की सीमाओं की सफलतापूर्वक पहचान की, और उन्हें वास्तविक बग से अलग किया। हालाँकि यह प्रणाली कर्नेल के सबसे जटिल हिस्सों के लिए प्रत्येक सुरक्षा नियम को सिद्ध नहीं कर पाई, लेकिन इसने विशाल बहुमत को सिद्ध किया, और जो शेष खुले रह गए थे, उन्हें स्पष्ट रूप से चिह्नित किया गया था कि वे कोड के बजाय जाँच उपकरणों में सुधार के क्षेत्र थे। यह कार्य एक प्रदर्शन है कि उच्च-स्तरीय कोड से मशीन निर्देशों तक अनुवाद प्रक्रिया पर स्वामित्व रखना संभव है, यह सुनिश्चित करते हुए कि अंतिम निष्पादन योग्य (executable) अपने आप में उस तर्क की तरह ही कठोर सुरक्षा प्रमाण-पत्र लेकर आता है जिसने इसे बनाया है।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।