मेरी अंडरग्रेजुएट डिग्री कॉग्निटिव साइंस एंड आर्टिफिशियल इंटेलिजेंस में थी। इससे मुझे लिस्प में एक-कोर्स का परिचय मिला। मुझे लगा कि भाषा दिलचस्प थी ("सुरुचिपूर्ण" के रूप में), लेकिन वास्तव में इसके बारे में ज्यादा नहीं सोचा था जब तक कि मैं ग्रीनस्पून के दसवें नियम के बहुत बाद में नहीं आया था:
किसी भी पर्याप्त रूप से जटिल सी या फोरट्रान कार्यक्रम में एक तदर्थ होता है, अनौपचारिक रूप से निर्दिष्ट, बग-ग्रस्त, सामान्य लिस्प के आधे भाग का धीमा कार्यान्वयन।
ग्रीनस्पून का बिंदु था (भाग में) कि कई जटिल कार्यक्रमों में अंतर्निहित दुभाषिया हैं। भाषा में एक दुभाषिया बनाने के बजाय उन्होंने सुझाव दिया कि यह लिस्प जैसी भाषा का उपयोग करने के लिए और अधिक समझदार हो सकता है जिसमें पहले से ही एक दुभाषिया (या संकलक) अंतर्निहित हो।
उस समय मैं एक बड़े ऐप पर काम कर रहा था, जो कस्टम-भाषा के लिए एक कस्टम दुभाषिया का उपयोग करके उपयोगकर्ता-परिभाषित गणना करता था। मैंने एक बड़े पैमाने पर प्रयोग के रूप में लिस्प में इसके मूल को फिर से लिखने की कोशिश करने का फैसला किया।
इसमें लगभग छह सप्ताह का समय लगा। मूल कोड डेल्फी (एक पास्कल संस्करण) की ~ 100,000 लाइनें थी। लिस्प में जो ~ 10,000 लाइनों तक कम हो गया था। हालांकि इससे भी अधिक आश्चर्य की बात यह है कि लिस्प इंजन 3-6 गुना तेज था। और ध्यान रखें कि यह एक लिस्प निओफाइट का काम था! वह पूरा अनुभव मेरे लिए काफी आंखें खोलने वाला था; पहली बार मैंने एक ही भाषा में प्रदर्शन और अभिव्यक्ति के संयोजन की संभावना देखी।
कुछ समय बाद जब मैंने एक वेब-आधारित परियोजना पर काम करना शुरू किया, तो मैंने कई भाषाओं का ऑडिशन लिया। मैंने मिक्स में लिस्प और स्कीम को शामिल किया। अंत में मैंने एक योजना कार्यान्वयन का चयन किया- Chez योजना । मैं परिणामों से बहुत खुश हूं।
वेब-आधारित परियोजना एक उच्च-प्रदर्शन "चयन इंजन" है । हम डेटा को प्रोसेस करने से लेकर पेज जेनरेशन तक कई अलग-अलग तरीकों से स्कीम का उपयोग करते हैं। कई स्थानों पर हम वास्तव में एक अलग भाषा के साथ शुरू करते हैं, लेकिन उन योजनाओं के लिए माइग्रेट करने के लिए समाप्त हो गए हैं, जिनका मैं नीचे संक्षेप में वर्णन करूंगा।
अब मैं आपके प्रश्न का उत्तर दे सकता हूं (कम से कम भाग में)।
ऑडिशन के दौरान हमने कई तरह के लिस्प और स्कीम लागू किए। लिस्प की ओर हमने देखा (मेरा मानना है) एलेग्रो सीएल, सीएमयूसीएल, एसबीसीएल और लिस्पवर्क्स हैं। स्कीम के पक्ष में हमने देखा (मुझे विश्वास है) बिग्लू, चिकन, चेज़, गैम्बिट। (भाषा का चयन बहुत समय पहले हुआ था; इसीलिए मैं थोड़ा हाज़िर हूँ। अगर यह महत्वपूर्ण है तो मैं कुछ नोट्स खोद सकता हूँ।)
बैट से दूर हम एक) देशी धागे और बी) लिनक्स, मैक और विंडोज समर्थन की तलाश कर रहे थे। उन दो स्थितियों ने मिलकर सभी को खटखटाया (लेकिन मुझे लगता है) एलेग्रो और चेज़ बाहर हैं - इसलिए मूल्यांकन जारी रखने के लिए हमें बहु-थ्रेडिंग आवश्यकता को ढीला करना पड़ा।
हमने छोटे कार्यक्रमों का एक साथ रखा और मूल्यांकन और परीक्षण के लिए उनका उपयोग किया। इसने कई मुद्दों का खुलासा किया। उदाहरण के लिए: कुछ कार्यान्वयन में दोष थे जो कुछ परीक्षणों को पूर्ण होने से रोकते थे; कुछ कार्यान्वयन रन-टाइम में कोड संकलित नहीं कर सकते हैं; कुछ कार्यान्वयन आसानी से पूर्व संकलित कोड के साथ रन-टाइम संकलित कोड को एकीकृत नहीं कर सके; कुछ कार्यान्वयन में कचरा संग्रहकर्ता थे जो दूसरों की तुलना में स्पष्ट रूप से बेहतर (या स्पष्ट रूप से बदतर) थे; आदि।
हमारी जरूरतों के लिए केवल तीन वाणिज्यिक कार्यान्वयन - एलेग्रो, चेज़ और लिस्पवर्क्स - ने हमारे प्राथमिक परीक्षणों को पारित किया। तीन में से केवल चेज़ ने उड़ते हुए रंगों के साथ सभी परीक्षण पास किए। उस समय मुझे लगता है कि लिस्पवर्क्स के पास किसी भी मंच पर देशी धागे नहीं थे (मुझे लगता है कि वे अब करते हैं) और मुझे लगता है कि एलीग्रो के पास केवल कुछ प्लेटफार्मों पर देशी धागे थे। इसके अलावा, एलेग्रो के पास "कॉल अस" रन-टाइम लाइसेंसिंग शुल्क था जो मुझे बहुत पसंद नहीं था। मेरा मानना है कि लिस्पवर्क्स का कोई रन-टाइम शुल्क नहीं था और चेज़ के पास एक सीधी (और बहुत ही उचित) व्यवस्था थी (और यह केवल किक करता था यदि आपने रन-टाइम में कंपाइलर का उपयोग किया था)।
लिस्प और स्कीम दोनों में कोड के कुछ महत्वपूर्ण हिस्से का उत्पादन करने के बाद कुछ तुलना और इसके विपरीत बिंदु हैं:
लिस्प वातावरण अधिक परिपक्व हैं। आपको हिरन के लिए बहुत अधिक धमाके मिलते हैं। (कहा जाता है कि, अधिक कोड भी अधिक बग के लिए समान है।)
लिस्प वातावरण सीखने के लिए कहीं अधिक कठिन है। प्रवीण बनने के लिए आपको बहुत अधिक समय चाहिए; आम लिस्प एक बहुत बड़ी भाषा है - और इससे पहले कि आप पुस्तकालयों को प्राप्त करें कि वाणिज्यिक कार्यान्वयन इसके ऊपर जोड़ दें। (कहा जा रहा है कि, स्कीम का सिंटेक्स-केस लिस्प की किसी एक चीज़ से कहीं अधिक सूक्ष्म और जटिल है।)
लिस्प वातावरण में बायनेरिज़ का उत्पादन करने के लिए कुछ और मुश्किल हो सकता है। आपको अनावश्यक बिट्स को हटाने के लिए अपनी छवि को "शेक" करने की आवश्यकता है, और यदि आप उस प्रक्रिया के दौरान अपने प्रोग्राम को सही ढंग से अभ्यास नहीं करते हैं तो आप बाद में रन-टाइम त्रुटियों के साथ समाप्त हो सकते हैं। । इसके विपरीत, चेज़ के साथ हम एक उच्च-स्तरीय फ़ाइल संकलित करते हैं, जिसमें वह सभी अन्य फ़ाइलें शामिल हैं जिनकी उसे आवश्यकता है और हम कर रहे हैं।
मैंने कहा कि इससे पहले कि हम कई जगहों पर स्कीम का उपयोग कर रहे थे, जिनका मूल रूप से इरादा नहीं था। क्यों? मैं अपने सिर के ऊपर से तीन कारणों के बारे में सोच सकता हूं।
सबसे पहले, हमने Chez (और उसके डेवलपर, ताल) पर भरोसा करना सीखा। हमने टूल से बहुत कुछ पूछा, और यह लगातार दिया। उदाहरण के लिए, चेज़ में ऐतिहासिक रूप से छोटी संख्या में दोष थे, और इसकी स्मृति प्रबंधक बहुत, बहुत अच्छी रही है।
दूसरा, हमने Chez से प्राप्त प्रदर्शन से प्यार करना सीखा। हम एक ऐसी चीज़ का उपयोग कर रहे थे जो एक स्क्रिप्टिंग भाषा की तरह महसूस करती थी - और हमें इससे देशी-कोड गति मिल रही थी। कुछ चीजों के लिए जो मायने नहीं रखती थी - लेकिन यह कभी चोट नहीं पहुंचाती थी, और कभी-कभी यह एक भयानक मदद करती थी।
तीसरा, हमने सीखा कि अमूर्त योजना को प्यार देना चाहिए। मेरा मतलब सिर्फ मैक्रोज़ से नहीं है, वैसे; मेरा मतलब है कि क्लोजर, लैम्ब्डा, टेल-कॉल आदि जैसी चीजें। एक बार जब आप उन शब्दों में सोचना शुरू करते हैं तो अन्य भाषाएं तुलनात्मक रूप से सीमित लगती हैं।
क्या स्कीम सही है? नहीं; यह एक व्यापार बंद है। सबसे पहले, यह अलग-अलग डेवलपर्स को अधिक प्रभावी बनाने की अनुमति देता है - लेकिन डेवलपर्स के लिए एक-दूसरे के कोड को ग्रो करना अधिक कठिन होता है क्योंकि स्कीपपोस्ट जो कि अधिकांश भाषाओं में होते हैं (जैसे, लूप के लिए) योजना में गायब हैं (उदाहरण के लिए, एक मिलियन तरीके हैं) for a लूप)। दूसरा, डेवलपर्स से बात करने, किराए पर लेने, उधार लेने आदि के लिए बहुत छोटा पूल है।
इसे योग करने के लिए, मुझे लगता है कि मैं कहूंगा: लिस्प और स्कीम कुछ क्षमताओं की पेशकश करती हैं जो व्यापक रूप से कहीं और उपलब्ध नहीं हैं। यह क्षमता एक व्यापार बंद है, इसलिए यह बेहतर था कि आपके विशेष मामले में समझ में आए। हमारे मामले में, लिस्प या स्कीम के साथ जाने के बीच के निर्धारण संबंधी कारकों का बहुत अधिक मूलभूत सुविधाओं (प्लेटफ़ॉर्म सपोर्ट, प्लेटफ़ॉर्म थ्रेड, रन-टाइम संकलन, रन-टाइम लाइसेंसिंग) के साथ अधिक था जो उन्होंने भाषा या लाइब्रेरी सुविधाओं के साथ किया था। फिर से, हमारे मामले में वह भी एक व्यापार-बंद था: चेज़ के साथ हमें जो मुख्य सुविधाएँ चाहिए थीं, वे मिल गईं लेकिन हमने व्यापक पुस्तकालयों को खो दिया जो वाणिज्यिक लिस्प वातावरण था।
इसके अलावा, सिर्फ दोहराने के लिए: हमने कई लिस्प्स और योजनाओं को बहुत पहले देखा था; वे सब विकसित और सुधार हुआ है।