2013-10-30 4 views
5

मैं एक लिस्प पाठ्यपुस्तक में इस पढ़ रहा हूँ:लिस्प को उत्कृष्ट गणित प्रदर्शन क्या देता है?

लिस्प, संख्या के साथ कुछ अद्भुत कारनामों प्रदर्शन कर सकते हैं, खासकर जब सबसे अन्य भाषाओं के साथ तुलना में। उदाहरण के लिए, यहाँ हम 53 के पचास-तीसरी शक्ति गणना करने के लिए समारोह expt उपयोग कर रहे हैं:

CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373 

अधिकांश भाषाओं इतनी बड़ी संख्या को शामिल गणना पर गला घोंटना होगा।

हां, यह अच्छा है, लेकिन लेखक की व्याख्या करने क्यों लिस्प इस अधिक आसानी से और अन्य भाषाओं तुलना में अधिक तेजी से कर सकते हैं विफल रहता है।

निश्चित रूप से एक साधारण कारण है, क्या कोई समझा सकता है?

+8

दिन की कई भाषाओं ने हार्डवेयर-निर्भर मॉड्यूलो अंकगणित से अंकगणित करने की कोशिश नहीं की। कई लोकप्रिय भाषाएं अभी भी ऐसा नहीं करती हैं (जावा या सी ++)। हालांकि कई लोगों के पास "बिग्नम" या "बिगिनटेगर" पुस्तकालय हैं। द्वितीय श्रेणी के नागरिक होने के नाते, इन पुस्तकालयों में प्रायः एक ओवरहेड होता है, जैसे कि जावा में मुक्केबाजी। –

उत्तर

12

यह एक अच्छा उदाहरण है कि "worse is not always better"

न्यू जर्सी दृष्टिकोण

"पारंपरिक" भाषाओं, C/C++/जावा की तरह, हार्डवेयर क्षमताओं, जैसे के आधार पर सीमा पूर्णांक arithmetics सीमित है, int32_t - पर हस्ताक्षर किए 32-बिट नंबर जो चुपचाप अतिप्रवाह जब परिणाम 32 बिट्स में फिट नहीं है। यह बहुत तेज़ है और अक्सर व्यावहारिक उद्देश्यों के लिए पर्याप्त अच्छा लगता है, लेकिन बग खोजने के लिए सूक्ष्म कठोर कारण बनता है।

एमआईटी/स्टैनफोर्ड शैली

लिस्प ने एक अलग दृष्टिकोण लिया।

यह एक "छोटे" अनबॉक्स्ड पूर्णांक प्रकार fixnum, और जब fixnum arithmetics का परिणाम एक fixnum में फिट नहीं करता है, यह स्वचालित रूप से और पारदर्शी रूप से, एक मनमाना आकार bignum करने के लिए प्रोत्साहित किया जाता है, ताकि आप हमेशा गणितीय सही परिणाम प्राप्त है। इसका मतलब है कि, जब तक संकलक साबित कर सकता है कि परिणाम fixnum है, तो उसे कोड जोड़ना होगा जो जांच करेगा कि bignum आवंटित किया जाना है या नहीं। वास्तव में, आधुनिक वास्तुकला पर 0 लागत होनी चाहिए, लेकिन 4+ दशकों पहले इसे एक गैर-मामूली निर्णय था।

"पारंपरिक" भाषाओं, जब वे bignum arithmetics प्रस्तुत करते हैं, ऐसा एक "पुस्तकालय" में जिस तरह से, जैसे कि,

  • यह स्पष्ट उपयोगकर्ता द्वारा अनुरोध किया हो गया है;
  • बिग्नम्स एक बेकार तरीके से संचालित होते हैं: BigInteger.add(a,b)a+b के बजाय;
  • वास्तविक संख्या छोटी होने पर भी लागत होती है और मशीन int में फिट होगी।

ध्यान दें कि लिस्प दृष्टिकोण कुछ अतिरिक्त जटिलता की संभावित लागत पर doing the right thing की लिस्प परंपरा के अनुरूप है। यह स्वचालित स्मृति प्रबंधन में भी प्रकट होता है, जो अब मुख्यधारा है, लेकिन अतीत में दुष्कर्म पर हमला किया गया था।पूर्णांक अंकगणित के लिए लापरवाही दृष्टिकोण अब कुछ अन्य भाषाओं (उदाहरण के लिए, पायथन) में उपयोग किया गया है, इसलिए प्रगति हो रहा है!

+1

ग्रेट हेडलाइंस! –

2

जो wvxvw लिखा था, जोड़ने के लिए, लिस्प में यह आसान है क्योंकि भाषा में बिग्नम बनाए जाते हैं। आप सी या जावा में इन्सट्स के बारे में कहें, जैसे बड़ी संख्या में उलझ सकते हैं।

संबंधित मुद्दे