क्या स्थैतिक विश्लेषण के लिए प्रकार के विकल्प हैं?


18

एक प्रोग्रामिंग भाषा में स्टेटिक टाइपिंग संकलन समय पर कुछ गारंटियों को लागू करने के लिए सहायक हो सकती है- लेकिन क्या इस नौकरी के लिए एकमात्र उपकरण हैं? क्या हमलावरों को निर्दिष्ट करने के अन्य तरीके हैं?

उदाहरण के लिए, एक भाषा या परिवेश सरणी लंबाई के बारे में या किसी फ़ंक्शन के इनपुट के बीच संबंधों के बारे में गारंटी लागू करने में मदद कर सकता है। मैंने अभी तक किसी प्रकार की प्रणाली के बाहर ऐसा कुछ नहीं सुना है।

एक संबंधित चीज जिसके बारे में मैं सोच रहा था कि क्या स्थैतिक विश्लेषण करने के लिए कोई गैर-घोषणात्मक तरीके हैं ( अधिकांश भाग के लिए प्रकार घोषणात्मक हैं )।

जवाबों:


24

स्टेटिक टाइप सिस्टम एक तरह का स्टैटिक एनालिसिस होता है, लेकिन कई स्टैटिक एनालिसिस ऐसे होते हैं जो आमतौर पर टाइप सिस्टम में इनकोड नहीं होते हैं। उदाहरण के लिए:

  • मॉडल चेकिंग समवर्ती प्रणालियों के लिए एक विश्लेषण और सत्यापन तकनीक है जो आपको यह साबित करने की अनुमति देती है कि आपका कार्यक्रम सभी संभावित थ्रेड इंटरलेनेज़िंग के तहत अच्छी तरह से व्यवहार किया गया है।

  • डेटा प्रवाह विश्लेषण चर के संभावित मूल्यों के बारे में जानकारी इकट्ठा करता है, जो यह निर्धारित कर सकता है कि क्या कुछ गणना निरर्थक है, या कुछ त्रुटि के लिए जिम्मेदार नहीं है।

  • अमूर्त व्याख्या रूढ़िवादी रूप से एक कार्यक्रम के प्रभावों को मॉडल करती है, आमतौर पर इस तरह से कि विश्लेषण को समाप्त करने की गारंटी दी जाती है- टाइप व्याख्याताओं को अमूर्त व्याख्याकारों के समान तरीके से लागू किया जा सकता है।

  • पृथक्करण तर्क एक प्रोग्राम लॉजिक है ( इनफेर एनालाइज़र में उदाहरण के लिए प्रयुक्त ) जिसका उपयोग प्रोग्राम स्टेट्स के बारे में तर्क करने के लिए किया जा सकता है, और नल पॉइंटर डेरेफेरेंस, अमान्य स्टेट्स और रिसोर्स लीक जैसे मुद्दों की पहचान कर सकता है।

  • कॉन्ट्रैक्ट-आधारित प्रोग्रामिंग पूर्व शर्त, पोस्टकंडिशन, साइड इफेक्ट, और इनवेरिएंट को निर्दिष्ट करने का एक साधन है। एडा को अनुबंधों के लिए मूल समर्थन है और उनमें से कुछ को वैधानिक रूप से सत्यापित कर सकते हैं।

अनुकूलन के दौरान उपयोग के लिए मध्यवर्ती डेटा संरचनाओं का निर्माण करने के लिए ऑप्टिमाइज़िंग कंपाइलर कई छोटे विश्लेषण करते हैं - जैसे कि एसएसए, इनलाइन लागत का अनुमान, अनुदेश युग्मन जानकारी और इसी तरह।

गैर-घोषणापत्र स्थैतिक विश्लेषण का एक और उदाहरण हैक टाइपकार्ट में पाया जाता है , जहां सामान्य नियंत्रण-प्रवाह निर्माण एक चर के प्रकार को परिष्कृत कर सकते हैं:

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

और "रिफाइनिंग" की बात करते हुए, प्रकार सिस्टम की भूमि में वापस, शोधन प्रकार ( लिक्विडहस्केल में इस्तेमाल किया जाता है ) युग्म प्रकारों के साथ "परिष्कृत" प्रकार के उदाहरणों के लिए होल्ड करने की गारंटी है। और निर्भर प्रकार इसे और आगे ले जाते हैं, जिससे प्रकार मूल्यों पर निर्भर होते हैं। आश्रित टाइपिंग का "हैलो वर्ल्ड" आमतौर पर ऐरे कॉनसेप्टेशन फंक्शन है:

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

यहाँ, ++प्रकार के दो ऑपरेंड लेते हैं Vec a mऔर Vec a n, तत्व प्रकार aऔर लंबाई के साथ वैक्टर mऔर nक्रमशः, जो प्राकृतिक संख्या ( Nat) हैं। यह एक वेक्टर को उसी तत्व प्रकार के साथ लौटाता है जिसकी लंबाई है m + n। और यह फ़ंक्शन विशिष्ट रूप से mऔर n, इसलिए वैक्टर की लंबाई गतिशील हो सकती है , बिना इस बाधा को प्रमाणित करता है ।


एक प्रकार की प्रणाली क्या है? मुझे एहसास है कि मैं वास्तव में नहीं जानता। विकिपीडिया पर परिभाषा परिपत्र है: en.wikipedia.org/wiki/Type_system
मैक्स हाइबर

1
@mheiber: एक स्थिर प्रकार प्रणाली बस एक स्थिर विश्लेषण है कि श्रेय प्रकार (जैसे, int, int -> int, forall a. a -> a) शब्दों के लिए (जैसे, 0, (+ 1), \x -> x)। अन्य विश्लेषण डेटा प्रकार से संबंधित विभिन्न गुणों का वर्णन कर सकते हैं, उदाहरण के लिए, दुष्प्रभाव ( pure, io), दृश्यता ( public, private), या राज्य ( open, closed)। व्यवहार में, इन गुणों में से कई को एक ही कार्यान्वयन में जांचा जा सकता है कि प्रकार की जाँच / अनुमान, इसलिए भेद पूरी तरह से स्पष्ट नहीं है।
जॉन पर्डी

4

@ जॉनपर्डी का जवाब बेहतर है, लेकिन मैं कुछ और उदाहरण जोड़ना चाहूंगा:

स्पष्ट:

  • वाक्यविन्यास जाँच

  • linting

अस्पष्ट:

  • जंग प्रोग्रामर को यह निर्दिष्ट करने में सक्षम करती है कि क्या "बाइंडिंग" उत्परिवर्तनीय हैं , और इन बाधाओं को लागू करता है।

  • यह संबंधित प्रकार का है: कुछ भाषाएं संकलन के समय कुछ कोड को चलाने में सक्षम बनाती हैं, जिसका अर्थ है कि कई चीजें जो अन्यथा रनटाइम त्रुटियों को संकलित करती हैं, संकलन समय पर पकड़ी जा सकती हैं। कुछ उदाहरण प्राग के साथ चिह्नित मैक्रोज़ और निम भाषा प्रक्रियाएं हैं ।compileTime

  • तर्क प्रोग्रामिंग मूल रूप से जोर देकर एक कार्यक्रम बना रहा है।

अर्ध-स्थैतिक टाइपिंग:

  • फेसबुक का फ्लो डायनेमिक और स्टैटिक टाइपिंग के बीच हाइब्रिड को सक्षम बनाता है। विचार यह है कि गतिशील कोड भी स्पष्ट रूप से टाइप किया गया है। फ़्लो आपको एक सर्वर चलाने देता है जो आपके कोड को देखता है क्योंकि यह संभव प्रकार की त्रुटियों का पता लगाने के लिए चलता है, भले ही आप अपने कार्यों को टाइप-एनोटेट न करें।

1

टाइप विश्लेषण का बहुत मतलब नहीं है।

Agda एक ट्यूरिंग-पूर्ण प्रकार की प्रणाली के लिए जाना जाता है, एमएल भाषाओं (जैसे Ocaml ) की तुलना में बहुत अलग (और गणना करने के लिए और अधिक कठिन )।


अगाडा, "ट्यूरिंग-कम्प्लीट टाइप सिस्टम" न होने और "ट्यूरिंग-कम्प्लीट टाइप सिस्टम" न होने के लिए एक बड़े प्रयास में जाता है।
user833970
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.