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