"फ़ंक्शन" और "प्रक्रिया" के बीच अंतर क्या है?


203

सामान्यतया, हम सभी प्रोग्रामिंग भाषाओं में कार्यों या प्रक्रियाओं के बारे में सुनते हैं। हालांकि, मुझे अभी पता चला है कि मैं इन शब्दों का लगभग परस्पर उपयोग करता हूं (जो कि शायद बहुत गलत है)।

तो, मेरा सवाल है:

उनकी कार्यक्षमता, उनके उद्देश्य और उपयोग के संदर्भ में क्या अंतर है?

एक उदाहरण की सराहना की जाएगी।


इसे भी देखें: stackoverflow.com/q/10388393/974555
gerrit

6
मुझे लगता है कि एसआईसीपी को यह अधिकार प्राप्त है। कार्य केवल गणित में मौजूद हैं, और वे यह दर्शाते हैं कि ज्ञान क्या है । प्रक्रियाएं भाषाओं प्रोग्रामिंग (कार्य भी शामिल होते हैं) में मौजूद हैं, और वे प्रतिनिधित्व करते हैं कैसे ज्ञान। कार्य : sqrt (x) = y ऐसा कि y ^ 2 = x। प्रक्रिया : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
mk12

जवाबों:


295

एक फ़ंक्शन एक मान देता है और एक प्रक्रिया सिर्फ कमांड निष्पादित करती है।

नाम फ़ंक्शन गणित से आता है। इसका उपयोग इनपुट के आधार पर मूल्य की गणना करने के लिए किया जाता है।

एक प्रक्रिया कमांड का एक सेट है जिसे क्रम में निष्पादित किया जा सकता है।

अधिकांश प्रोग्रामिंग भाषाओं में, यहां तक ​​कि फ़ंक्शंस में कमांड का एक सेट हो सकता है। इसलिए अंतर केवल एक रिटर्न वाले हिस्से में है।

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


आप किसी अनिवार्यता (जावा, ग) या घोषित भाषा (स्केला, स्कीम) में कोई दुष्प्रभाव नहीं होने का आश्वासन कैसे दे सकते हैं?
ऑर्लीबग

1
@orlybg, घोषणात्मक भाषाओं में, संगति भाषा के कार्यान्वयन से आती है। उनका दायरा प्रतिबंध उन्हें दुष्प्रभाव होने से रोकता है। दूसरी ओर, अनिवार्य भाषाएं उनके दुष्प्रभावों का स्पष्ट रूप से फायदा उठाती हैं। दुष्प्रभाव हमेशा खराब नहीं होते हैं।
थारिंदु रुसिरा

मैं निम्नलिखित Ada ट्यूटोरियल ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ) पढ़ रहा हूं , जहां उस पृष्ठ का दूसरा पैराग्राफ "प्रक्रिया में आद्या से शुरू होता है, जो पास्कल में समान है। एक प्रक्रिया में रिटर्न स्टेटमेंट हो सकते हैं। " क्या यह पाठ में कोई त्रुटि है? या इसका मतलब यह है कि इसमें रिटर्न स्टेटमेंट हो सकते हैं लेकिन कोई मान नहीं है?
jviotti

3
पास्कल में, प्रक्रियाओं में रिटर्न स्टेटमेंट नहीं होते हैं, केवल कार्य करते हैं। पाठ में एक त्रुटि होनी चाहिए। हालांकि, एक प्रक्रिया में एक "निकास" बयान हो सकता है, जो तर्कों के बिना "वापसी" कथन के रूप में कार्य कर सकता है, जिसका अर्थ है कोई वापसी मान नहीं।
एरिक फोर्टियर

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

42

यह संदर्भ पर निर्भर करता है।

पास्कल जैसी भाषाओं में, फ़ंक्शंस और प्रक्रियाएँ अलग-अलग इकाइयाँ होती हैं, जो इस बात में भिन्न होती हैं कि वे एक मान लौटाती हैं या नहीं। वे अलग तरह से wrt व्यवहार करते हैं। भाषा वाक्यविन्यास (उदाहरण के लिए प्रक्रिया कॉल फॉर्म स्टेटमेंट्स; आप एक एक्सप्रेशन बनाम फ़ंक्शन कॉल का उपयोग नहीं कर सकते हैं, स्टेटमेंट कॉल नहीं करते हैं, आपको उन्हें अन्य स्टेटमेंट में उपयोग करना होगा)। इसलिए, पास्कल-ब्रेड प्रोग्रामर उन दोनों के बीच अंतर करते हैं।

सी जैसी भाषाओं में, और कई अन्य समकालीन भाषाओं में, यह भेद खत्म हो गया है; सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं में, प्रक्रियाएं एक मजेदार रिटर्न प्रकार के साथ कार्य करती हैं। शायद यही वजह है कि इनका इस्तेमाल परस्पर किया जाता है।

कार्यात्मक भाषाओं में, आमतौर पर प्रक्रिया जैसी कोई चीज नहीं होती है - सब कुछ एक फ़ंक्शन है।


और प्रोग्रामिंग भाषाओं का दस्तावेज़ीकरण फ़ंक्शन और प्रक्रियाओं को कॉल कर सकता है जो कुछ भी इसे पसंद करता है, क्योंकि लोग किसी भी नाम को स्वीकार करेंगे क्योंकि उन नामों के पीछे की पृष्ठभूमि बहुत पहले धो दी गई है।
आर्ने बबेनहॉसराइड

18

C में उदाहरण:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

यद्यपि आपको ध्यान देना चाहिए कि C मानक प्रक्रियाओं, केवल कार्यों के बारे में बात नहीं करता है।


4
... सी मानक प्रक्रियाओं, केवल कार्यों के बारे में बात नहीं करता है। ऐसा इसलिए है क्योंकि इसमें केवल कार्य हैं। एक फ़ंक्शन जो कुछ भी नहीं लौटाता है a void function। कर्निघन और रिची च 1.7: "सी में, एक फ़ंक्शन फोरट्रान में एक सबरूटीन या फ़ंक्शन के बराबर है, या पास्कल में एक प्रक्रिया या कार्य है।" दूसरे शब्दों में ... यह उत्तर गलत है।
मोगसाद

8
उत्तर गलत नहीं है, और यह शुद्ध कार्यों और प्रक्रियाओं के बीच अंतर का एक अच्छा उदाहरण है। K & R ने चीजों को सरल रखने के लिए प्रत्येक उप-रेखा को "फ़ंक्शन" कहा, लेकिन साइड इफेक्ट के साथ एक उप-समूह वास्तव में एक "प्रक्रिया" है, गणित से विहित अर्थ में "फ़ंक्शन" नहीं। सी एक बेहतर भाषा हो सकती है अगर यह वास्तविक कार्यों को प्रक्रियाओं से अलग करती है, तो यह स्थैतिक विश्लेषण, प्रदर्शन अनुकूलन और समानांतरकरण में मदद करेगा।
सैम वाटकिंस

12

सामान्य तौर पर, एक प्रक्रिया निर्देशों का एक क्रम है।
एक फ़ंक्शन समान हो सकता है, लेकिन यह आमतौर पर एक परिणाम देता है।


11

एक शब्द सबरूटीन या सबप्रोग्राम है जो कोड के एक मानकीकृत टुकड़े के लिए खड़ा है जिसे विभिन्न स्थानों से बुलाया जा सकता है।

कार्य और प्रक्रियाएं उन पर कार्यान्वयन हैं। आमतौर पर फ़ंक्शंस मान लौटाते हैं और प्रक्रियाएँ कुछ भी नहीं लौटाती हैं।


6

बुनियादी अंतर

  • एक फ़ंक्शन को एक मान वापस करना चाहिए, लेकिन संग्रहित प्रक्रियाओं में यह वैकल्पिक है: एक प्रक्रिया 0 या n मान वापस कर सकती है।
  • फ़ंक्शंस में इसके लिए केवल इनपुट पैरामीटर हो सकते हैं, जबकि प्रक्रियाओं में इनपुट / आउटपुट पैरामीटर हो सकते हैं।
  • फ़ंक्शन के लिए एक इनपुट पैरामीटर लेना अनिवार्य है, लेकिन एक संग्रहीत प्रक्रिया में 0 से n इनपुट पैरामीटर हो सकते हैं ।
  • कार्यविधियों को एक प्रक्रिया से बुलाया जा सकता है जबकि कार्यविधियों को किसी कार्य से नहीं बुलाया जा सकता है।

उन्नत अंतर

  • किसी प्रक्रिया में ब्लॉक-कैच ब्लॉक द्वारा अपवादों को नियंत्रित किया जा सकता है, जबकि फ़ंक्शन में कैच-ब्लॉक ब्लॉक का उपयोग नहीं किया जा सकता है।
  • हम एक प्रक्रिया में लेनदेन प्रबंधन के लिए जा सकते हैं, जबकि एक समारोह में हम नहीं कर सकते।

SQL में:

  • एक प्रक्रिया की अनुमति देता है SELECTके रूप में DML (और साथ ही INSERT, UPDATE, DELETEसमारोह केवल अनुमति देता है, जबकि) उस में बयान, SELECTउस में बयान।
  • प्रक्रियाओं को एक SELECTबयान में उपयोग नहीं किया जा सकता है , जबकि कार्यों को एक SELECTबयान में एम्बेड किया जा सकता है ।
  • संग्रहीत कार्यविधियाँ SQL कथनों में कहीं भी WHERE(या HAVINGया क SELECT) ब्लॉक में उपयोग नहीं की जा सकती हैं , जबकि कार्य कर सकते हैं।
  • फ़ंक्शंस जो रिटर्न टेबल को दूसरे रोसेट के रूप में माना जा सकता है। इसका उपयोग JOINअन्य तालिकाओं वाले ब्लॉक में किया जा सकता है ।
  • इनलाइन फ़ंक्शंस को उन विचारों के रूप में माना जा सकता है जो पैरामीटर लेते हैं और JOINब्लॉक और अन्य रोसेट संचालन में उपयोग किए जा सकते हैं ।

3
यह उत्तर बहुत भाषा-विशिष्ट है, जबकि सवाल भाषा-अज्ञेय का था। यहाँ बयान सामान्य मामले में सभी सच नहीं हैं, लेकिन यह उपयोगी होगा यदि आप उस भाषा या वातावरण को स्पष्ट करते हैं जिसे आप उनके लिए मुखर कर रहे हैं।
मोगसाद

5

अधिक सख्ती से, एक फ़ंक्शन f उस संपत्ति का पालन करता है जो f (x) = f (y) है यदि x = y, अर्थात यह हर बार उसी परिणाम की गणना करता है जिसे एक ही तर्क के साथ कहा जाता है (और इस प्रकार यह स्थिति नहीं बदलता है प्रणाली।)

इस प्रकार, रैंड () या प्रिंट ("हैलो"), आदि कार्य नहीं हैं, लेकिन प्रक्रियाएं हैं। जबकि sqrt (2.0) एक फ़ंक्शन होना चाहिए: कोई अवलोकन प्रभाव या राज्य परिवर्तन नहीं होता है, चाहे कोई भी इसे कितनी बार कॉल करे और यह हमेशा 1.41 और कुछ देता है।


3
यह उपयोग "कार्यात्मक" प्रोग्रामिंग के संदर्भ में प्रासंगिक है। ध्यान रखें कि कई (अक्सर अत्यावश्यक) भाषाएं जो अपने उपप्रोग्राम को "फ़ंक्शन" कहती हैं, उन्हें इस संपत्ति की आवश्यकता नहीं होती है।
dmckee --- पूर्व-संचालक ने बिल्ली का बच्चा

1
मैंने सुझाव नहीं दिया कि प्रोग्रामिंग भाषाओं को इस संपत्ति की आवश्यकता है। वैसे भी, कोई भी किसी भी भाषा में सख्त कार्य लिख सकता है, और मुझे लगता है कि स्वच्छ कार्यों में जितना संभव हो उतना प्रोग्राम करना अच्छी आदत है, फिर टुकड़ों को कुछ मुख्य प्रक्रिया के साथ मिलाएं।
इंगो

4

अगर हम यहां भाषा-अज्ञेयवादी हैं, तो प्रक्रिया आमतौर पर मज़बूती से और निश्चित रूप से कुछ परिणाम प्राप्त करने के लिए आवश्यक कृत्यों की एक श्रृंखला को निर्दिष्ट करती है। यही है, एक प्रक्रिया मूल रूप से एक एल्गोरिथ्म है।

दूसरी ओर, कार्य एक बड़े कार्यक्रम के भीतर कुछ स्वतंत्र कोड है। दूसरे शब्दों में, फ़ंक्शन एक प्रक्रिया का कार्यान्वयन है।


4

यह एक प्रसिद्ध पुराना प्रश्न है, लेकिन मैं आधुनिक प्रोग्रामिंग भाषा अनुसंधान और डिजाइन के बारे में कुछ और जानकारी साझा करना चाहता हूं।

मूल उत्तर

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

एक फ़ंक्शन एक प्रक्रिया से अधिक है क्योंकि रिटर्न मान को शरीर में "आउटपुट" के रूप में भी निर्दिष्ट किया जा सकता है। फंक्शन कॉल अधिक या कम एक ही तरह की कॉल प्रक्रियाएं हैं, सिवाय इसके कि आप फ़ंक्शन कॉल के परिणाम का उपयोग कर सकते हैं, सिंटैक्टली (आमतौर पर कुछ अन्य अभिव्यक्ति के उप-प्रकार के रूप में)।

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

(स्पष्ट होने के लिए, ऊपर उल्लिखित "इनपुट" और "आउटपुट" कार्यों के वाक्यविन्यास गुणों के आधार पर सरलीकृत धारणाएं हैं। कई भाषाएं अतिरिक्त रूप से संदर्भ / साझाकरण के मापदंडों को तर्क देने का समर्थन करती हैं, उपयोगकर्ताओं को कॉल के दौरान तर्कों में एन्कोडेड जानकारी परिवहन करने की अनुमति देती हैं। इस तरह के पैरामीटर को केवल "इन / आउट पैरामीटर" के रूप में भी कहा जा सकता है। यह सुविधा कॉल में पारित होने वाली वस्तुओं की प्रकृति पर आधारित है, जो प्रक्रिया / फ़ंक्शन की विशेषता के गुणों के लिए रूढ़िवादी है।)

हालाँकि, यदि किसी फ़ंक्शन कॉल के परिणाम की आवश्यकता नहीं है, तो इसे अनदेखा किया जा सकता है (कम से कम तार्किक रूप से) और फ़ंक्शन परिभाषाएँ / फ़ंक्शन कॉल इस प्रकार प्रक्रिया परिभाषाओं / प्रक्रिया कॉल के अनुरूप होनी चाहिए। ALGOL जैसी भाषाएं जैसे C, C ++ और Java, सभी इस प्रकार से "फ़ंक्शन" की सुविधा प्रदान करती हैं: परिणाम प्रकार voidको एन्कोडिंग द्वारा पारंपरिक प्रक्रियाओं की तरह दिखने वाले कार्यों के एक विशेष मामले के रूप में, "प्रक्रियाओं की सुविधा प्रदान करने की कोई आवश्यकता नहीं है। " अलग से। यह भाषा डिजाइन में कुछ प्रस्फुटन को रोकता है।

चूँकि SICP का उल्लेख किया गया है, इसलिए यह भी ध्यान देने योग्य है कि R n RS द्वारा निर्दिष्ट योजना भाषा में , एक प्रक्रिया को अभिकलन के परिणाम को वापस करना पड़ सकता है या नहीं करना पड़ सकता है। यह पारंपरिक "फ़ंक्शन" (परिणाम लौटाने) और "प्रक्रिया" (कुछ भी नहीं लौटाने) का संघ है, अनिवार्य रूप से कई ALGOL जैसी भाषाओं की "फ़ंक्शन" अवधारणा के समान है (और वास्तव में और भी अधिक गारंटी देता है जैसे कि आवेदक मूल्यांकन की तरह। कॉल से पहले ऑपरेंड)। हालांकि, पुराने फैशन के अंतर अभी भी एसआरएफआई -96 जैसे प्रामाणिक दस्तावेजों में पाए जाते हैं ।

मैं विचलन के पीछे के सटीक कारणों के बारे में ज्यादा नहीं जानता, लेकिन जैसा कि मैंने अनुभव किया है, ऐसा लगता है कि आजकल के विनिर्देशन के बिना भाषा डिजाइनर अधिक खुश होंगे। यही है, एक स्टैंडअलोन सुविधा के रूप में "प्रक्रिया" अनावश्यक है। voidप्रकार की तकनीक पहले से ही उपयोग को चिह्नित करने के लिए पर्याप्त है जहां दुष्प्रभाव पर जोर दिया जाना चाहिए। यह सी-लाइक भाषाओं पर अनुभव रखने वाले उपयोगकर्ताओं के लिए भी अधिक स्वाभाविक है, जो कुछ दशकों से अधिक लोकप्रिय हैं। इसके अलावा, यह आर n आरएस जैसे मामलों में शर्मिंदगी से बचा जाता है जहां व्यापक अर्थों में "प्रक्रियाएं" वास्तव में "कार्य" हैं।

सिद्धांत रूप में, एक फ़ंक्शन को निर्दिष्ट इकाई प्रकार के साथ निर्दिष्ट किया जा सकता है क्योंकि फ़ंक्शन कॉल के प्रकार को इंगित करता है कि परिणाम विशेष है। यह पारंपरिक प्रक्रियाओं (जहां कॉल का परिणाम निर्बाध है) को दूसरों से अलग करता है। एक भाषा के डिजाइन में विभिन्न शैलियाँ हैं:

  • जैसा कि आर n आरएस में, केवल अनिर्दिष्ट परिणामों को "अनिर्दिष्ट" मान के रूप में चिह्नित किया जाता है (अनिर्दिष्ट प्रकार का, यदि भाषा में इसका उल्लेख करना है) और यह अनदेखा किया जाना पर्याप्त है।
  • एक समर्पित इकाई प्रकार (जैसे कर्नेल के #inert) के मूल्य के रूप में निर्बाध परिणाम निर्दिष्ट करना भी काम करता है।
  • जब वह प्रकार एक और नीचे का प्रकार होता है , तो इसे एक प्रकार की अभिव्यक्ति के रूप में प्रयोग करके (उम्मीद) स्टेटिक रूप से सत्यापित और रोका जा सकता है। voidALGOL-जैसी भाषाओं में टाइप वास्तव में इस तकनीक का एक उदाहरण है। ISO C11 _Noreturnइस तरह का एक समान लेकिन अधिक सूक्ष्म है।

आगे की पढाई

जैसा कि गणित से प्राप्त पारंपरिक अवधारणा है, काले जादू के टन हैं, ज्यादातर लोग यह जानने की जहमत नहीं उठाते हैं। कड़ाई से बोलते हुए, आपको अपनी गणित की पुस्तकों के अनुसार पूरी चीजें स्पष्ट होने की संभावना नहीं होगी। CS पुस्तकें बहुत मदद नहीं कर सकती हैं, या तो।

प्रोग्रामिंग भाषाओं के विषय में, कई चेतावनी हैं:

  • गणित की विभिन्न शाखाओं में कार्य हमेशा समान अर्थ वाले नहीं होते हैं। विभिन्न प्रोग्रामिंग प्रतिमानों में कार्य भी काफी भिन्न हो सकते हैं (कभी-कभी फ़ंक्शन कॉल के सिंटैक्स भी समान दिखते हैं)। कभी-कभी मतभेद पैदा करने के कारण समान होते हैं, लेकिन कभी-कभी वे नहीं होते हैं।
    • गणितीय कार्यों द्वारा मॉडल गणना करना मुहावरेदार है और फिर प्रोग्रामिंग भाषाओं में अंतर्निहित गणना को लागू करना है । जब तक आप यह नहीं जानते कि उनसे क्या बात की जा रही है, तब तक उन्हें मैप करने से बचें।
  • इकाई के साथ मॉडल को भ्रमित न करें।
    • बाद वाला पूर्व के कार्यान्वयन के लिए केवल एक है । संदर्भों के आधार पर एक से अधिक विकल्प हो सकते हैं (उदाहरण के लिए रुचि रखने वाली गणित की शाखाएं)।
    • विशेष रूप से, यह "फंक्शन" को "मैपिंग" के रूप में व्यवहार करने के लिए कमोबेश बेतुका है या कार्टेशियन उत्पादों के सबसेट को ऑर्डिनल्स के वॉन-न्यूमैन एन्कोडिंग के{{{}}, {}} रूप में प्राकृतिक संख्याओं का इलाज करना पसंद है ... कुछ सीमित संदर्भों के अलावा ...
  • गणितीय रूप से, कार्य आंशिक या कुल हो सकते हैं । विभिन्न प्रोग्रामिंग भाषाओं का यहां अलग-अलग उपचार है।
    • कुछ कार्यात्मक भाषाएं फ़ंक्शन की कुलता की गारंटी दे सकती हैं ताकि फ़ंक्शन कॉल के भीतर गणना की गारंटी हमेशा सीमित चरणों में समाप्त हो सके। हालांकि, यह अनिवार्य रूप से ट्यूरिंग-पूर्ण नहीं है, इसलिए कमजोर कम्प्यूटेशनल अभिव्यक्ति है, और सामान्य प्रयोजन की भाषाओं में बहुत अधिक नहीं देखा जाता है इसके अलावा टाइपकास्टिंग के शब्दार्थ (जो कुल होने की उम्मीद है)।
    • यदि प्रक्रियाओं और कार्यों के बीच अंतर महत्वपूर्ण है, तो क्या "कुल प्रक्रियाएं" होनी चाहिए? हम्म ...
  • सामान्य संगणना और प्रोग्रामिंग भाषाओं के शब्दार्थ (जैसे लंबोदर गणना में लैंबडा अमूर्त ) का उपयोग करने के लिए उपयोग की जाने वाली गणनाओं में समान कार्यों का निर्माण ऑपरेशंस पर अलग मूल्यांकन रणनीति हो सकती है।
    • पारंपरिक गणना में शुद्ध कटौती के साथ-साथ शुद्ध कार्यात्मक भाषाओं में अभिव्यक्तियों के मूल्यांकन में , संगणना के परिणामों को बदलने के कोई दुष्प्रभाव नहीं हैं। नतीजतन, ऑपरेंड के कार्यों की तरह निर्माणों (क्योंकि अपरिवर्तनीय परिभाषित करने के लिए "एक ही परिणाम" की तरह गुण के पास रहेगी शरीर से पहले मूल्यांकन किया जाना आवश्यक नहीं हैं β -equivalence द्वारा गारंटी चर्च-Rosser संपत्ति )।
    • हालांकि, अभिव्यक्ति के मूल्यांकन के दौरान कई प्रोग्रामिंग भाषाओं के दुष्प्रभाव हो सकते हैं। की तरह इसका मतलब है कि सख्त मूल्यांकन रणनीतियों अनुप्रयोगी मूल्यांकन की तरह गैर सख्त मूल्यांकन वालों के लिए ही नहीं हैं कॉल-दर-जरूरत । यह महत्वपूर्ण है, क्योंकि भेद के बिना, फ़ंक्शन (जैसे (तर्कों के साथ उपयोग किए जाने वाले) मैक्रो से (पारंपरिक) कार्यों को भेद करने की कोई आवश्यकता नहीं है। लेकिन सिद्धांतों के स्वाद के आधार पर, यह अभी भी एक कलाकृति हो सकता है। उस ने कहा, व्यापक अर्थों में, कार्यात्मक-प्रकार के मैक्रोज़ (esp। स्वच्छ वाले) कुछ अनावश्यक सीमाओं (वाक्यगत चरणों) के साथ गणितीय कार्य हैंसीमाओं के बिना, यह प्रक्रिया के रूप में मैक्रोज़ की तरह (प्रथम श्रेणी) कार्य करने के लिए समझदार हो सकता है ...
    • इस विषय में रुचि रखने वाले पाठकों के लिए, कुछ आधुनिक सार पर विचार करें ।
  • आमतौर पर प्रक्रियाओं को पारंपरिक गणित के दायरे से बाहर माना जाता है। हालांकि, केल्टी में कम्प्यूटेशन और प्रोग्रामिंग लैंग्वेज शब्दार्थ के साथ-साथ समकालीन प्रोग्रामिंग लैंग्वेज के डिजाइन में, "कॉलेबल" प्रकृति को साझा करने वाली संबंधित अवधारणाओं का एक बड़ा परिवार हो सकता है। उनमें से कुछ का उपयोग प्रक्रियाओं / कार्यों को लागू करने / बढ़ाने / बदलने के लिए किया जाता है। और भी अधिक सूक्ष्म भेद हैं।

3

अधिकांश संदर्भों में: एक फ़ंक्शन एक मान देता है, जबकि एक प्रक्रिया नहीं होती है। दोनों समान कार्य करने के लिए एक साथ रखे गए कोड के टुकड़े हैं।

कार्यात्मक प्रोग्रामिंग संदर्भ में (जहां सभी फ़ंक्शन मान लौटाते हैं), एक फ़ंक्शन एक अमूर्त वस्तु है:

f(x)=(1+x)
g(x)=.5*(2+x/2)

यहां, f, g के समान कार्य है, लेकिन एक अलग प्रक्रिया है।


3

प्रक्रिया के अंदर हम डीएमएल (इन्सर्ट / अपडेट / डिलीट) स्टेटमेंट का उपयोग कर सकते हैं, लेकिन इनसाइड फंक्शन में हम डीएमएल स्टेटमेंट का उपयोग नहीं कर सकते हैं।

प्रक्रिया में इनपुट \ आउटपुट पैरामीटर दोनों हो सकते हैं, लेकिन फ़ंक्शन में केवल इनपुट पैरामीटर हो सकते हैं।

हम Stored Procedure में Try-Catch Block का उपयोग कर सकते हैं, लेकिन Function में हम Try-Catch block का उपयोग नहीं कर सकते हैं।

हम चुनिंदा कथन में संग्रहीत प्रक्रिया का उपयोग नहीं कर सकते हैं, लेकिन फ़ंक्शन में हम चयन कथन में उपयोग कर सकते हैं।

संग्रहीत प्रक्रिया 0 या n मान (अधिकतम 1024) वापस कर सकती है, लेकिन फ़ंक्शन केवल 1 मान लौटा सकता है जो अनिवार्य है।

Stored Procedure को Function से कॉल नहीं किया जा सकता है, लेकिन हम Stored Procedure से फ़ंक्शन को कॉल कर सकते हैं।

हम Stored Procedure में लेनदेन का उपयोग कर सकते हैं, लेकिन फ़ंक्शन में हम लेनदेन का उपयोग नहीं कर सकते हैं।

हम Sql स्टेटमेंट में कहीं भी Stored Procedure का उपयोग कहाँ / होने / Select सेक्शन में नहीं कर सकते हैं, लेकिन फ़ंक्शन में हम उपयोग कर सकते हैं।

हम Stored Procedure में शामिल नहीं हो सकते, लेकिन हम फ़ंक्शन से जुड़ सकते हैं।

अधिक जानकारी के लिए ... यहाँ क्लिक करें ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
यह उत्तर बहुत भाषा-विशिष्ट है, जबकि सवाल भाषा-अज्ञेय का था। यहाँ बयान सामान्य मामले में सभी सच नहीं हैं, लेकिन यह उपयोगी होगा यदि आप उस भाषा या वातावरण को स्पष्ट करते हैं जिसे आप उनके लिए मुखर कर रहे हैं।
मोगसाद

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

2

एक फ़ंक्शन एक मान देता है और एक प्रक्रिया सिर्फ कमांड निष्पादित करती है।

नाम फ़ंक्शन गणित से आता है। इसका उपयोग इनपुट के आधार पर मूल्य की गणना करने के लिए किया जाता है।

एक प्रक्रिया कमांड का एक सेट है जिसे क्रम में निष्पादित किया जा सकता है।

अधिकांश प्रोग्रामिंग भाषाओं में, यहां तक ​​कि फ़ंक्शंस में कमांड का एक सेट हो सकता है। इसलिए अंतर केवल एक रिटर्न वाले हिस्से में है।

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


1

फ़ंक्शन का उपयोग एक sql स्टेटमेंट के भीतर किया जा सकता है, जबकि प्रक्रिया का उपयोग sql स्टेटमेंट के भीतर नहीं किया जा सकता है।

सम्मिलित करें, अद्यतन करें और कथन बनाएँ फ़ंक्शन में शामिल नहीं किए जा सकते, लेकिन एक प्रक्रिया में ये कथन हो सकते हैं।

प्रक्रिया लेनदेन का समर्थन करती है लेकिन कार्य लेनदेन का समर्थन नहीं करते हैं।

फ़ंक्शन को एक और केवल एक मान लौटाया जाना चाहिए (दूसरे को OUT चर द्वारा लौटाया जा सकता है) लेकिन प्रक्रिया कई डेटा सेट और मान लौटाती है।

कार्यों और प्रक्रियाओं दोनों की निष्पादन योजनाएं कैश की जाती हैं, इसलिए दोनों मामलों में प्रदर्शन समान है।


1

मैं इनमें से अधिकांश उत्तरों में कुछ ऐसा देखता हूं जिस पर मुझे कोई आपत्ति होती है, जो एक फ़ंक्शन को एक फ़ंक्शन बनाता है वह यह है कि यह एक मान लौटाता है।

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

एक फ़ंक्शन इसलिए नक्शे के लिए अधिक समान है (जैसे जहां x -> x'एक आयामी फ़ंक्शन के लिए)। यह नियमित तरीकों और कार्यों के बीच एक बहुत महत्वपूर्ण अंतर है क्योंकि वास्तविक कार्यों के साथ काम करते समय समय और जिस क्रम में उनका मूल्यांकन किया जाता है वह कभी भी मायने नहीं रखता है, क्योंकि गैर कार्यों के साथ हमेशा ऐसा नहीं होता है।

यहां एक विधि का एक और उदाहरण है जो एक फ़ंक्शन नहीं है, लेकिन अन्यथा अभी भी एक मान लौटाएगा।

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

मैं आगे इस धारणा पर आपत्ति करता हूं कि प्रक्रियाएं मान नहीं लौटाती हैं। एक प्रक्रिया किसी फ़ंक्शन या विधि के बारे में बात करने का एक विशिष्ट तरीका है। तो इसका मतलब यह है कि यदि अंतर्निहित प्रक्रिया जो आपकी प्रक्रिया को परिभाषित करती है या लागू करती है तो एक मान लौटाती है, अनुमान करें कि वह प्रक्रिया क्या मान लौटाती है। उदाहरण के लिए SICP से निम्नलिखित स्निपेट लें :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

क्या आपने हाल ही में पुनरावर्ती प्रक्रियाओं के बारे में सुना है? वे एक पुनरावर्ती कार्य (एक वास्तविक कार्य) के बारे में बात कर रहे हैं और यह एक मान लौटा रहा है और वे "प्रक्रिया" शब्द का उपयोग कर रहे हैं। तो क्या अंतर है, फिर?

किसी फ़ंक्शन के बारे में सोचने का एक और तरीका (ऊपर उल्लिखित अर्थ के अलावा) अंक 1 जैसे आदर्श का एक सार प्रतिनिधित्व है। एक प्रक्रिया उस चीज़ का वास्तविक कार्यान्वयन है। मुझे व्यक्तिगत रूप से लगता है कि वे विनिमेय हैं।

(ध्यान दें, यदि आप उस अध्याय को उस लिंक से पढ़ते हैं जो मैं आपको प्रदान करता हूं, तो आप पा सकते हैं कि समझ में आने वाली कठिन अवधारणा किसी फ़ंक्शन और प्रक्रिया के बीच का अंतर नहीं है, बल्कि एक प्रक्रिया और एक प्रक्रिया है। क्या आप जानते हैं कि एक पुनरावर्ती प्रक्रिया एक हो सकती है। पुनरावृति कार्य?)

प्रक्रियाओं के लिए एक एनालॉग व्यंजनों हैं। उदाहरण के लिए; मान लें कि आपके पास एक मशीन है जिसे make-piesयह मशीन अंदर ले जाती है (fruit, milk, flower, eggs, sugar, heat)और यह मशीन वापस आ जाती है pie

इस मशीन का एक प्रतिनिधित्व की तरह लग सकता है

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

बेशक यह एक पाई बनाने का एकमात्र तरीका नहीं है।

इस मामले में हम देख सकते हैं कि:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

यह सादृश्य ठीक है, लेकिन यह तब टूट जाता है जब आप इस बात को ध्यान में रखते हैं कि जब आप कंप्यूटर प्रोग्राम के साथ काम कर रहे हैं तो सब कुछ एक अमूर्त है। तो एक मशीन के लिए एक नुस्खा के मामले में हम दो चीजों की तुलना कर रहे हैं जो स्वयं अमूर्त हैं; दो चीजें जो एक ही चीज हो सकती हैं। और मैं मानता हूं कि वे (सभी इरादों और उद्देश्यों के लिए) एक ही चीज हैं।


2
एक फ़ंक्शन जो हमेशा दिए गए तर्कों के लिए समान मूल्य लौटाता है, उसे कभी-कभी "शुद्ध फ़ंक्शन" कहा जाता है। अधिकांश भाषाओं में जो प्रक्रियाओं और कार्यों के बीच अंतर करती हैं, कार्यों को शुद्ध होने की आवश्यकता नहीं होती है, और "फ़ंक्शन" शब्द का उपयोग उप-प्रभावों को संदर्भित करने के लिए सही ढंग से किया जाता है जिनके दुष्प्रभाव हो सकते हैं और जो एक ही तर्कों के साथ क्रमिक कॉल पर विभिन्न परिणाम लौटा सकते हैं। (और सी-जैसी भाषाओं में, यहां तक ​​कि सबरूटीन्स जो मूल्यों को वापस नहीं करते हैं उन्हें ठीक से "फ़ंक्शन" कहा जाता है।)
कीथ थॉम्पसन

सहमत, यही कारण है कि मैं अंत में कह रहा हूं कि शब्द विनिमेय हैं।
dkinzer

1
हां, लेकिन आप यह कहकर शुरू करते हैं कि "एक फ़ंक्शन केवल एक पुरानी विधि नहीं है जो एक मान लौटाता है", जबकि कई भाषाओं में यह वास्तव में एक फ़ंक्शन है।
कीथ थॉम्पसन

0

Db के संदर्भ में : संग्रहित प्रक्रिया पूर्व नियोजित निष्पादन योजना है जहाँ कार्य नहीं होते हैं।


0

С # / Java के संदर्भ में, फ़ंक्शन कोड का ब्लॉक है, जो विशेष मान लौटाता है, लेकिन प्रक्रिया कोड का ब्लॉक है जो शून्य (कुछ भी नहीं) लौटाता है । C # / Java में फ़ंक्शंस और प्रक्रियाएँ दोनों को अधिक बार सिर्फ विधि कहा जाता है ।

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

प्रक्रियाएँ: 1. प्रक्रियाएँ ऐसे बयानों का संग्रह है जो पैरामीटरयुक्त संगणना को परिभाषित करता है। 2. प्रक्रियाएं मान नहीं लौटा सकतीं।

3.प्रक्रियाओं को कार्य से नहीं बुलाया जा सकता है।

कार्य 1. कार्य संरचनात्मक रूप से प्रक्रियाओं से मिलते-जुलते हैं, लेकिन गणितीय कार्यों पर आधारित होते हैं। 2. यह मान लौटा सकता है। 3. प्रक्रिया से प्रक्रिया को बुलाया जा सकता है।


3.प्रक्रियाओं को कार्य से नहीं बुलाया जा सकता है। यह किस भाषा में सच है? मेरे पास कोई भी ऐसा अनुभव नहीं है जिसमें यह प्रतिबंध हो।
मोगसाद

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

ओह्ह मैं सिर्फ एक भाषा C ++ के बारे में सोचता था: एक कास्ट विधि एक कॉनस्ट विधि नहीं कह सकती (हालांकि आपको सही कंपाइलर चेक चालू करने की आवश्यकता होगी, और इसके चारों ओर पाने के लिए कड़ी मेहनत करने की कोशिश न करें।)
ctrl-alt-delor

-7

कार्यविधियाँ और कार्य दोनों उप- अंतर हैं उनके बीच एकमात्र अंतर यह है कि एक प्रक्रिया कई (या कम से कम कर सकते हैं) मान लौटाती है जबकि एक फ़ंक्शन केवल एक मान लौटा सकता है (यही कारण है कि फ़ंक्शन नोटेशन का उपयोग गणित में किया जाता है क्योंकि आमतौर पर केवल एक मान मिलता है एक समय पर) हालांकि कुछ प्रोग्रामिंग भाषाएं इन नियमों का पालन नहीं करती हैं लेकिन यह उनकी सही परिभाषा है


उम नहीं। एक प्रक्रिया returnकुछ भी नहीं है। आप दुष्प्रभावों के बारे में बात कर रहे हैं, जो दोनों के साथ संभव है (यदि भाषा द्वारा अनुमति दी गई है)।
मोगसाद

एक प्रक्रिया किसी भी राशि का मान लौटा सकती है, वह राशि शून्य हो सकती है
user2766296

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

मुझे यह उत्तर पसंद है, और कई डाउनवोट वाले लोगों को भी पसंद है क्योंकि किसी तरह थोड़े सही हैं, इसलिए विरोधाभासी रूप से, एसओ में इसे बहुत लोकप्रिय बनाने के लिए मैं इसे डाउनवोट कर दूंगा। SQL सर्वर में एक संग्रहीत कार्यविधि एक परिणाम (जिसे आपने "कई मान" के रूप में संदर्भित किया जाता है) लौटाता है, जबकि एक फ़ंक्शन केवल एक मान लौटा सकता है (जो कि बहुत सटीक नहीं है क्योंकि आप तालिका-मान्यता प्राप्त फ़ंक्शन भी बना सकते हैं)।
इवानजिन्हो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.