लिस्प को अलग क्या बनाता है?
Originalदिसम्बर 2001 (संशोधित मई 2002)
(यह लेख एलएल1 मेलिंग सूची पर कुछ प्रश्नों के उत्तर में आया है। अब इसे रिवेंज ऑफ द नर्ड्स में शामिल कर लिया गया है।)
जब मैकार्थी ने 1950 के दशक के अंत में लिस्प को डिजाइन किया, तो यह मौजूदा भाषाओं से एक क्रांतिकारी बदलाव था, जिनमें से सबसे महत्वपूर्ण फोर्ट्रान थी।
लिस्प ने नौ नये विचारों को मूर्त रूप दिया:
1. सशर्त। सशर्त एक अगर-तो-अन्यथा निर्माण है। हम अब इन्हें हल्के में लेते हैं। इनका आविष्कार मैकार्थी ने लिस्प के विकास के दौरान किया था। (उस समय फोरट्रान में केवल एक सशर्त गोटो था, जो अंतर्निहित हार्डवेयर में शाखा निर्देश पर आधारित था।) मैकार्थी, जो अल्गोल समिति में थे, ने अल्गोल में सशर्तों को शामिल किया, जहाँ से वे अधिकांश अन्य भाषाओं में फैल गए।
2. फ़ंक्शन प्रकार। लिस्प में, फ़ंक्शन प्रथम श्रेणी के ऑब्जेक्ट होते हैं
- वे पूर्णांक, स्ट्रिंग आदि की तरह ही डेटा प्रकार होते हैं, और उनका शाब्दिक प्रतिनिधित्व होता है, उन्हें चर में संग्रहीत किया जा सकता है, तर्क के रूप में पारित किया जा सकता है, इत्यादि।
3. रिकर्सन। रिकर्सन निश्चित रूप से लिस्प से पहले एक गणितीय अवधारणा के रूप में अस्तित्व में था, लेकिन लिस्प इसका समर्थन करने वाली पहली प्रोग्रामिंग भाषा थी। (यह यकीनन फंक्शन को प्रथम श्रेणी की वस्तु बनाने में निहित है।)
4. चरों की एक नई अवधारणा। लिस्प में, सभी चर प्रभावी रूप से पॉइंटर्स हैं। मान वे होते हैं जिनके प्रकार होते हैं, चर नहीं, और चरों को असाइन या बाइंड करने का मतलब पॉइंटर्स की प्रतिलिपि बनाना है, न कि वे किस ओर इशारा करते हैं।
5. कचरा संग्रहण.
6. अभिव्यक्तियों से बने प्रोग्राम। लिस्प प्रोग्राम अभिव्यक्तियों के वृक्ष हैं, जिनमें से प्रत्येक एक मान लौटाता है। (कुछ लिस्प में अभिव्यक्तियाँ कई मान लौटा सकती हैं।) यह फोर्ट्रान और अधिकांश बाद की भाषाओं के विपरीत है, जो अभिव्यक्तियों और कथनों के बीच अंतर करती हैं।
फोरट्रान में यह अंतर होना स्वाभाविक था क्योंकि (आश्चर्य की बात नहीं है कि ऐसी भाषा में जहां इनपुट प्रारूप पंच कार्ड था) भाषा लाइन-ओरिएंटेड थी। आप कथनों को नेस्ट नहीं कर सकते थे। और इसलिए जब आपको गणित के काम करने के लिए अभिव्यक्तियों की आवश्यकता होती है, तो किसी और चीज को मान लौटाने का कोई मतलब नहीं था, क्योंकि इसके लिए कुछ भी प्रतीक्षा नहीं कर सकता था।
ब्लॉक-स्ट्रक्चर्ड भाषाओं के आने के साथ ही यह सीमा समाप्त हो गई, लेकिन तब तक बहुत देर हो चुकी थी। अभिव्यक्ति और कथन के बीच का अंतर गहरा हो चुका था। यह फोरट्रान से एल्गोल में और फिर उनके दोनों वंशजों में फैल गया।
जब कोई भाषा पूरी तरह से अभिव्यक्तियों से बनी होती है, तो आप अपनी इच्छानुसार अभिव्यक्तियाँ बना सकते हैं। आप या तो कह सकते हैं ( आर्क सिंटैक्स का उपयोग करके)
(यदि फू (= x 1) (= x 2))
या
(= x (यदि foo 1 2))
7. एक प्रतीक प्रकार। प्रतीक स्ट्रिंग से इस मायने में भिन्न होते हैं कि आप पॉइंटर की तुलना करके समानता का परीक्षण कर सकते हैं।
8. प्रतीकों के वृक्षों का उपयोग करके कोड के लिए एक संकेतन ।
9. पूरी भाषा हमेशा उपलब्ध रहती है। रीड-टाइम, कंपाइल-टाइम और रनटाइम के बीच कोई वास्तविक अंतर नहीं है। आप पढ़ते समय कोड को कंपाइल या रन कर सकते हैं, कंपाइल करते समय कोड को पढ़ या रन कर सकते हैं और रनटाइम पर कोड को पढ़ या कंपाइल कर सकते हैं।
पढ़ने के समय कोड चलाने से उपयोगकर्ता लिस्प के सिंटैक्स को पुनः प्रोग्राम कर सकते हैं; संकलन के समय कोड चलाना मैक्रोज़ का आधार है; रनटाइम पर संकलन करना, Emacs जैसे प्रोग्रामों में विस्तार भाषा के रूप में लिस्प के उपयोग का आधार है; तथा रनटाइम पर पढ़ना प्रोग्रामों को एस-एक्सप्रेशन का उपयोग करके संचार करने में सक्षम बनाता है, एक विचार जिसे हाल ही में XML के रूप में पुनः आविष्कृत किया गया है।
जब लिस्प का पहली बार आविष्कार हुआ था, तब ये सभी विचार सामान्य प्रोग्रामिंग अभ्यास से बहुत दूर थे, जो कि 1950 के दशक के अंत में उपलब्ध हार्डवेयर द्वारा काफी हद तक निर्धारित किया गया था।
समय के साथ, लोकप्रिय भाषाओं के अनुक्रम में सन्निहित डिफ़ॉल्ट भाषा, धीरे-धीरे लिस्प की ओर विकसित हुई है। 1-5 अब व्यापक हैं। 6 मुख्यधारा में दिखाई देने लगा है। पायथन में 7 का एक रूप है, हालांकि इसके लिए कोई वाक्यविन्यास नहीं लगता है। 8, जो (9 के साथ) लिस्प मैक्रोज़ को संभव बनाता है, अभी तक लिस्प के लिए अद्वितीय है, शायद इसलिए कि (ए) इसके लिए उन पैरेंस की आवश्यकता होती है, या कुछ ऐसा ही बुरा, और (बी) यदि आप शक्ति की अंतिम वृद्धि जोड़ते हैं, तो आप अब एक नई भाषा का आविष्कार करने का दावा नहीं कर सकते हैं, बल्कि केवल लिस्प की एक नई बोली को डिज़ाइन करने का दावा कर सकते हैं; -)
हालाँकि यह आज के प्रोग्रामर के लिए उपयोगी है, लेकिन लिस्प को अन्य भाषाओं द्वारा अपनाए गए यादृच्छिक उपायों से इसकी भिन्नता के संदर्भ में वर्णित करना अजीब है। संभवतः, मैकार्थी ने इसके बारे में ऐसा नहीं सोचा था। लिस्प को फोरट्रान में गलतियों को ठीक करने के लिए डिज़ाइन नहीं किया गया था; यह गणना को स्वयंसिद्ध बनाने के प्रयास के उपोत्पाद के रूप में आया था।