स्कीम लिस्प प्रोग्रामिंग भाषा का एक न्यूनतमवादी उपभाषा है, जिसे कार्यात्मक प्रोग्रामिंग शैली को सरल और साफ-सुथरी सिंटैक्स को बढ़ावा देने के लिए डिज़ाइन किया गया है। इसकी विशेषता इसके कोष्ठकों के उपयोग, एक शक्तिशाली मैक्रो प्रणाली, और पुनरावृत्ति और पहले श्रेणी की प्रक्रियाओं पर जोर देने में है। यह भाषा कार्यात्मक प्रोग्रामिंग पैरेडाइम को प्रोत्साहित करती है और कार्यात्मक, अनिवार्य, और तार्किक प्रोग्रामिंग सहित कई प्रोग्रामिंग तकनीकों का समर्थन करती है।
स्कीम का निर्माण 1970 के दशक में जेराल्ड जे. सस्समैन और गाई एल. स्टील जूनियर द्वारा मैसाचुसेट्स इंस्टीट्यूट ऑफ टेक्नोलॉजी (MIT) में किया गया था। इसे मूल लिस्प भाषा को सरल और सुधारने के प्रयास के रूप में विकसित किया गया था, जो समय के साथ जटिल हो गई थी। स्कीम के पीछे की प्रेरणा एक ऐसी भाषा बनाने की थी जो लागू करने और सिखाने में आसान हो, जबकि जटिल विचारों को व्यक्त करने के लिए पर्याप्त शक्तिशाली हो।
वर्षों के दौरान, स्कीम ने विभिन्न संशोधनों और मानकीकरण प्रयासों का सामना किया है। इनमें से सबसे उल्लेखनीय मानक RnRS (संशोधितn रिपोर्ट्स ऑन द एल्गोरिदमिक लैंग्वेज स्कीम) हैं, जिन्होंने भाषा और इसकी विशेषताओं को औपचारिक रूप दिया। स्कीम समुदाय ने तब से भाषा के विकास को जारी रखा है, जिससे नए मानकों जैसे R6RS और R7RS का निर्माण हुआ, जिन्होंने नई विशेषताएँ और सुधार पेश किए।
वर्तमान में, स्कीम शैक्षणिक वातावरण में लोकप्रिय है, विशेष रूप से कंप्यूटर विज्ञान शिक्षा में, इसकी सुंदरता और साफ-सुथरी सिंटैक्स के कारण। इसका प्रभाव कई आधुनिक प्रोग्रामिंग भाषाओं और पैरेडाइम में देखा जा सकता है। स्कीम को अक्सर कार्यात्मक प्रोग्रामिंग समुदाय के साथ जोड़ा जाता है और इसने क्लोजर और रैकेट जैसी भाषाओं को प्रेरित किया है, जिन्होंने इसके सिद्धांतों पर निर्माण किया और इसकी क्षमताओं का विस्तार किया।
स्कीम एक पूरी तरह से कोष्ठक सिंटैक्स का उपयोग करता है जहाँ कोड को प्रीफिक्स नोटेशन में लिखा जाता है; उदाहरण के लिए, एक जोड़ने का ऑपरेशन (+ 1 2)
के रूप में लिखा जाता है।
स्कीम में फ़ंक्शन पहले श्रेणी के नागरिक होते हैं, जिसका अर्थ है कि उन्हें तर्क के रूप में पास किया जा सकता है या अन्य फ़ंक्शनों से लौटाया जा सकता है। उदाहरण:
(define (make-adder x)
(lambda (y) (+ x y)))
(define add5 (make-adder 5))
(add5 10) ; 15 लौटाता है
स्कीम टेल कॉल ऑप्टिमाइजेशन का समर्थन करता है, जिससे फ़ंक्शनों को पुनरावृत्त कॉल के लिए वर्तमान स्टैक फ्रेम का पुन: उपयोग करने की अनुमति मिलती है, जो स्टैक ओवरफ्लो को रोकता है।
स्कीम कंटिन्यूएशनों का उपयोग करने की अनुमति देता है, जिससे प्रोग्रामर वर्तमान गणना की स्थिति को कैप्चर कर सकते हैं और नियंत्रण प्रवाह को संशोधित कर सकते हैं:
(call-with-current-continuation
(lambda (exit)
(exit 'done)))
स्कीम में एक शक्तिशाली मैक्रो प्रणाली है जो प्रोग्रामरों को सिंटैक्स एक्सटेंशन बनाने की अनुमति देती है। एक सरल मैक्रो को निम्नलिखित रूप में परिभाषित किया जा सकता है:
(define-syntax my-if
(syntax-rules ()
((_ test then else)
(if test then else))))
स्कीम डेटा अमूर्तता का समर्थन करता है जैसे कि सूचियाँ, जोड़े, और उच्च-क्रम फ़ंक्शन, जो डेटा के कुशल प्रबंधन को सक्षम बनाते हैं।
स्कीम लेक्सिकल स्कोपिंग का उपयोग करता है, जहाँ एक चर का स्कोप उसके स्रोत कोड में भौतिक स्थान द्वारा निर्धारित होता है। यह चर बाइंडिंग के संबंध में पूर्वानुमानित व्यवहार की ओर ले जाता है।
स्कीम डायनामिकली टाइप किया गया है, जिससे चर किसी भी प्रकार के मान को धारण कर सकते हैं बिना स्पष्ट प्रकार की घोषणाओं की आवश्यकता के।
एक लिस्प उपभाषा के रूप में, स्कीम सूची प्रसंस्करण के लिए अनुकूलित है, जिससे सूचियों पर संचालन करना आसान हो जाता है:
(define my-list (list 1 2 3 4))
(car my-list) ; 1 लौटाता है
(cdr my-list) ; (2 3 4) लौटाता है
स्कीम फ़ंक्शनों को टेल स्थिति के साथ पुनरावृत्त रूप से परिभाषित किया जा सकता है ताकि मेमोरी उपयोग और प्रदर्शन को अनुकूलित किया जा सके। उदाहरण के लिए:
(define (factorial n)
(define (fact-helper n acc)
(if (zero? n)
acc
(fact-helper (- n 1) (* n acc))))
(fact-helper n 1))
स्कीम अनुप्रयोगों को आमतौर पर चुने गए कार्यान्वयन के रनटाइम वातावरण का उपयोग करके बनाया जा सकता है। उदाहरण के लिए, रैकेट में, आप .rkt
फ़ाइलों को चलाने या उन्हें निष्पादन योग्य में संकलित करने के लिए कमांड-लाइन उपकरण racket
का उपयोग कर सकते हैं।
स्कीम के लिए कई संकलक और व्याख्याकार उपलब्ध हैं, जिनमें शामिल हैं:
स्कीम का व्यापक रूप से अकादमी में प्रोग्रामिंग सिद्धांतों को सिखाने और कंप्यूटर विज्ञान में अनुसंधान के उपकरण के रूप में उपयोग किया जाता है। इसके अनुप्रयोग कृत्रिम बुद्धिमत्ता, भाषा डिज़ाइन, और स्क्रिप्टिंग में हैं, साथ ही विभिन्न क्षेत्रों में प्रतीकात्मक गणना या जटिल डेटा प्रबंधन की आवश्यकता होती है।
दोनों भाषाएँ कार्यात्मक प्रोग्रामिंग शैली का समर्थन करती हैं, लेकिन पायथन पठनीयता और सरलता पर जोर देता है, जबकि स्कीम शक्तिशाली और संक्षिप्त अभिव्यक्तियों पर ध्यान केंद्रित करता है। स्कीम की कोष्ठक-भारी सिंटैक्स को शुरुआती लोगों के लिए एक बाधा के रूप में देखा जा सकता है, जबकि पायथन की इंडेंटेशन-आधारित सिंटैक्स सामान्यतः अधिक सुलभ होती है।
जावास्क्रिप्ट भी कार्यात्मक प्रोग्रामिंग का समर्थन करता है और इसमें पहले श्रेणी के फ़ंक्शन होते हैं। हालाँकि, जावास्क्रिप्ट में प्रोटोटाइप-आधारित ऑब्जेक्ट सिस्टम है, जबकि स्कीम कार्यात्मक पैरेडाइम पर निर्भर करता है। स्कीम की मैक्रो प्रणाली ऐसी क्षमताएँ प्रदान करती है जो जावास्क्रिप्ट में नहीं होती हैं।
C एक निम्न-स्तरीय, स्थिर रूप से टाइप की गई भाषा है जिसे सिस्टम प्रोग्रामिंग के लिए डिज़ाइन किया गया है, जबकि स्कीम उच्च-स्तरीय और डायनामिकली टाइप की गई है। C प्रदर्शन और हार्डवेयर-स्तरीय हेरफेर पर ध्यान केंद्रित करता है, जबकि स्कीम अमूर्तता और गणना के सैद्धांतिक पहलुओं पर जोर देता है।
दोनों भाषाएँ कार्यात्मक प्रोग्रामिंग में निहित हैं। हैस्केल एक अधिक कठोर प्रकार प्रणाली का उपयोग करता है और आलसी मूल्यांकन का समर्थन करता है, जबकि स्कीम की डायनामिक टाइपिंग और उत्सुक मूल्यांकन अधिक लचीले प्रोग्रामिंग की अनुमति देते हैं, हालांकि कुछ प्रदर्शन की कीमत पर।
रूबी एक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा है जो कार्यात्मक प्रोग्रामिंग सुविधाओं को मिलाती है, जबकि स्कीम पूरी तरह से कार्यात्मक है। रूबी की सिंटैक्स अधिक विस्तृत है, जबकि स्कीम की सरलता इसके न्यूनतमवादी डिज़ाइन से आती है।
स्कीम कोड का अन्य भाषाओं में अनुवाद उन उपकरणों द्वारा सुगम बनाया जा सकता है जो स्कीम सिंटैक्स और लक्षित भाषा दोनों को समझते हैं। कुछ उपयोगी स्रोत से स्रोत कोड अनुवाद उपकरणों में शामिल हैं:
चिकन स्कीम एक संकलक प्रदान करता है जो स्कीम कोड को C में अनुवाद कर सकता है, जिससे C पुस्तकालयों का लाभ उठाना और कुशल निष्पादन योग्य बनाना संभव हो जाता है।
रैकेट, जो स्कीम का एक व्युत्पन्न है, कोड को जावास्क्रिप्ट में परिवर्तित और संकलित करने की अंतर्निहित क्षमताएँ रखता है, जिससे वेब अनुप्रयोगों को तैनात करना आसान हो जाता है।
गैंबिट स्कीम स्कीम कोड को C और स्थानीय निष्पादन योग्य में संकलित कर सकता है, प्रदर्शन-क्रिटिकल अनुप्रयोगों के लिए कुशल अनुवाद विकल्प प्रदान करता है।