लिस्प में एक लिस्प दुभाषिया का अध्ययन इतना महत्वपूर्ण क्यों है?


30

मैंने नए प्रोग्रामरों के लिए कई सीएस पाठ्यचर्या और सीखने के सुझाव देखे हैं, जो कि इच्छुक प्रोग्रामर को एक लिस्प दुभाषिया का अध्ययन करने के लिए कहते हैं जो विशेष रूप से लिस्प में लिखा गया है। ये सभी साइटें, "इसके एक बौद्धिक रहस्योद्घाटन" के समान बातें कहती हैं, "यह एक प्रबुद्धता का अनुभव है जो प्रत्येक गंभीर प्रोग्रामर के पास होना चाहिए," या "यह आपको हार्डवेयर / सॉफ्टवेयर संबंधों को दिखाता है," और अन्य अस्पष्ट कथन, विशेष रूप से इस लेख से लिया गया है। यह कैसे सम्मानित करने के लिए

मेरे प्रश्न की सामान्य भावना यह है कि लिस्प उपरोक्त लक्ष्यों को कैसे प्राप्त करता है और लिस्प क्यों करता है? कुछ और भाषा क्यों नहीं?

मैं यह इसलिए पूछ रहा हूं क्योंकि मैंने स्कीम में एक स्कीम दुभाषिया (SICP http://mitpress.mit.edu/sicp/ से ली गई ) लिखना समाप्त कर दिया है और अब मैं इस योजना में एक अजगर दुभाषिया लिख ​​रहा हूं और मैं इस महान महाकाव्य का उल्लेख करने के लिए संघर्ष कर रहा हूं यह पूर्व से विशेष रूप से आने वाला है। मैं उन दो भाषाओं के बीच विशिष्ट तकनीकी विवरणों की तलाश कर रहा हूं जो प्रोग्राम कैसे काम करते हैं, इसके बारे में समझने के लिए मैं उनकी योजना दुभाषियों में शोषण कर सकता हूं।

अधिक विशेष रूप से:

एक दुभाषिया का अध्ययन क्यों किया जाता है, यह उस भाषा में लिखा जाता है जिसकी व्याख्या इतनी जोर से की जाती है - क्या यह केवल मूल भाषा और निर्मित भाषा को सीधे रखने के लिए एक महान मानसिक व्यायाम है या ऐसी विशिष्ट समस्याएं हैं जिनके समाधान केवल प्रकृति में ही मिल सकते हैं। वास्तविक भाषा?

लिस्प व्याख्याकर्ता किसी के भविष्य के सॉफ़्टवेयर डिज़ाइन के लिए अच्छी वास्तुकला अवधारणाओं को कैसे प्रदर्शित करते हैं?

अगर मैं इस अभ्यास को C ++ या Java जैसी किसी अन्य भाषा में करता तो मुझे क्या याद आता?

इस अभ्यास से सबसे अधिक इस्तेमाल किया जाने वाला टेकअवे या "मानसिक उपकरण" क्या है ? **

** मैं इस सवाल का जवाब क्योंकि मैं मैंने किया था चयनित है देखा है कि मैं इस अभ्यास अधिक कौशल से प्राप्त की है किसी भी अन्य एकल उपकरण से मेरे सिर में पार्स करने उपकरणों को डिजाइन करने में और मैं पार्स करने कि योजना बेहतर कार्य कर सकता के विभिन्न तरीकों को खोजने के लिए चाहते हैं अजगर दुभाषिया की तुलना में दुभाषिया।



4
@gnat करियर सलाह नहीं, "लिस्प के बारे में क्या बहुत बढ़िया" सवाल है।
रॉबर्ट हार्वे

1
@RobertHarvey कि लिंक न केवल करियर के लिए, बल्कि शिक्षा सलाह के लिए भी है , मेरा मतलब यही था। लेकिन, ठीक है, लिस्प-इस-तो-ग्रेट शायद एक अच्छा फिट भी है
gnat

1
आप पूछ रहे हैं कि आप एक विशेष अभ्यास से क्या सीखेंगे। आपका मितव्ययता आलस्य का संकेत है, किसी भी अच्छे प्रोग्रामर के लिए महत्वपूर्ण है, लेकिन यह जानने का एकमात्र तरीका है कि आप एक व्यायाम से क्या सीखेंगे, इसे करना और देखना है। कोई भी आपको यह नहीं बता सकता है कि आप ऐसा करने से क्या सीखेंगे, आपको बस करना होगा।
जिमी हॉफ

2
हालांकि यह प्रश्न समग्र रूप से शिक्षा से संबंधित है, मैं इसे "शिक्षा सलाह" के रूप में वर्गीकृत नहीं करूंगा "मुझे किस भाषा में सीखना चाहिए?" है। यही है, यह एक निश्चित प्रकार के पाठ्यक्रम या नौकरी के लिए विशिष्ट नहीं है। वास्तव में, यदि आप कुछ शिक्षा buzzwords को हटा देते हैं, तो यह समग्र रूप से प्रोग्रामिंग भाषाओं के बारे में एक प्रश्न है, जिनके उत्तर भाषा सुविधाओं पर चर्चा करते हैं। यह वास्तव में लिस्प के लिए विशिष्ट नहीं है, या तो, लेकिन xslt जैसी अन्य होमोसेक्सुअल भाषाओं पर लागू किया जा सकता है। तो मैंने ऐसा नहीं होगा यह एक आदर्श सवाल यह है कि, सिर्फ इतना है कि यह नहीं है बस "कैरियर सलाह"।
TheRubberDuck

जवाबों:


17

"मुझे भी" उत्तर देने के जोखिम पर, यदि आप इसे आजमाते हैं तो आप देखेंगे ...

यदि आप कंप्यूटर भाषाओं का अध्ययन करते हैं, तो आपको यह आभास होने की संभावना है कि यह पार्सिंग के बारे में कम से कम आधा है। यदि आप लिस्प सीखते हैं, तो आपको एहसास होगा कि सतह के सिंटैक्स को पार्स करना लोगों (हम जैसे अधिकांश) के लिए एक सुविधा से ज्यादा कुछ नहीं है, जो बहुत सारे सिंगल पेरेंटेस को चिढ़ाते हुए पसंद नहीं करते हैं।

तब आप महसूस कर सकते हैं कि उस सुविधा के लिए एक बड़ी कीमत चुकाई गई थी। लिस्प में यह एक प्रोग्राम के लिए दूसरे प्रोग्राम बनाने और उस पर अमल करने के लिए तुच्छ है। अन्य भाषाओं में यह एक उन्नत तकनीक है, जैसे रोमन अंकों में गुणा करना।

बेशक, लगभग हर कोई पूछता है कि "ऐसा करने की आवश्यकता है?" ठीक है, आप बहुत अच्छी तरह से देख सकते हैं कि यह उन चीजों का एक पूरा विस्टा खोलता है जिन्हें आपने कभी महसूस नहीं किया था कि आप पहले नहीं कर सकते थे। आप इसे अन्य भाषाओं में कर सकते हैं, लेकिन लगभग इतनी आसानी से नहीं।

इज़कट टिप्पणी का जवाब देने के लिए सम्मिलित:

  • SHRDLU प्राकृतिक-भाषा-समझ कार्यक्रम ने एक अंग्रेजी कथन या प्रश्न को एक कार्यक्रम में माइक्रो-प्लानर नामक एक लिस्प बोली में अनुवाद करके और इसे निष्पादित करके काम किया।
  • ऐसे कार्यक्रम जो कार्यक्रमों में हेरफेर करते हैं, उदाहरण के लिए उन्हें सरल बनाने या उन्हें सही साबित करने के लिए स्वाभाविक रूप से लिस्प में लिखा जाता है।
  • मैंने दृश्य दृश्यों को समझने के लिए एक कार्यक्रम में कार्यक्रम पीढ़ी का उपयोग किया, जहां इसे 3-आयामी वस्तुओं में सक्षम सभी समरूपताओं से निपटना था, कोड को गुणा किए बिना।
  • तार्किक अभिव्यक्तियों में हेरफेर करने के लिए तर्क और प्रमेय सिद्ध करने वाले कुछ भी, जो कार्यक्रम का एक रूप हैं।
  • प्रतीकात्मक गणित, जैसे प्रतीकात्मक अभिन्न या अंतर पथरी, गणित के भावों में हेरफेर करना शामिल है, जो लघु कार्यक्रमों की तरह हैं।
  • किसी भी समस्या को कोड पीढ़ी, या अधिक हाइब्रिड शब्द "आंशिक मूल्यांकन" से जोड़ा जाता है, लिस्प में स्वाभाविक है। मैंने बहुत समय पहले एक डेटाबेस ब्रिज प्रोग्राम के लिए ऐसा किया था। मैंने इसे सी में किया, जो लिस्प के रूप में आसान नहीं था, लेकिन मुझे लिस्प से विचार मिला। इसे एक ऐसी तकनीक के रूप में माना जाता था जो उस समय (विशेष रूप से COBOL- प्रमुख) लगभग कोई भी नहीं कर सकता था। शायद अब और उम्मीद है।

... वह बस कुछ ही है ...

फिर आपको कुछ ऐसी चीजों का एहसास होता है जिन्हें आज "आधुनिक" माना जाता है, लिस्प में 40-कुछ वर्षों से पुरानी-टोपी है। कार्यात्मक प्रोग्रामिंग की तरह। जैसे कचरा संग्रह। बंदों की तरह।

यह कहना है कि आधुनिक भाषाओं में नए अच्छे विचार नहीं हैं, जैसे OOP, आदि। लेकिन अगर आप लिस्प सीखते हैं तो यह आपके दृष्टिकोण को व्यापक बनाएगा।


You can do it in other languages, but not nearly so easily.- पसंद? (मेरे लिए सवाल इसलिए लगता है क्योंकि इस तरह के बयान अक्सर दिए जाते हैं, लेकिन लगभग कभी भी अधिक विशिष्ट नहीं होते हैं)
इज़काता

मैंने पहली बार सोचा था कि दुनिया में क्रांति हुई थी जब मुझे एहसास हुआ कि जावास्क्रिप्ट यह अपने स्वयं के स्रोत कोड को प्रिंट कर सकता है और ऑब्जेक्ट को शाब्दिक रूप से स्ट्रिंग शाब्दिक प्राप्त करने के लिए ट्रेस किया जा सकता है जो ऑब्जेक्ट शाब्दिक रूप से विकसित हो सकता है। तब मुझे एहसास हुआ कि पर्ल के पास यह सब $ डाटा के साथ है :: डम्पर :: डिपार्स, और तब मुझे एहसास हुआ कि लिस्प का यह हमेशा के लिए था। व्याख्याकारों को समझना इस शक्ति को अनलॉक करता है जिसमें हमेशा रहने वाले मॉड्यूल का निर्माण होता है, और लिस्प में यह किसी भी अन्य भाषा की तुलना में अधिक सुलभ है।
दिमित्री

मजेदार बात यह है कि लिस्प के आंतरिक लोगों के बारे में एक लिस्प प्रोग्रामर हमेशा किसी भी डायनेमिक भाषा में जावास्क्रिप्ट से बैश या पर्ल या पाइथन के लिए अपनी खुद की लिस्प फ्रंट बना सकता है; उपलब्ध वातावरण से लिस्पली अच्छी तरह से बूटस्ट्रैप करें।
दिमित्री

19

आपके प्रश्न का सरल उत्तर लिस्प की कोशिश करना है, अधिमानतः एसआईसीपी के साथ संयोजन के रूप में । तब तुम प्रबुद्ध हो जाओगे।

ने कहा कि...

कोड डेटा है
अधिकांश भाषाएं कोड और डेटा के बीच एक तेज अंतर बनाती हैं; लिस्प नहीं करता है। उदाहरण के लिए, लिस्प में एक लिस्प पार्सर लिखना और लिस्प के साथ लिस्प कोड में हेरफेर करना संभव है। इस ज्ञान का सबसे अच्छा वर्णन जो मुझे मिला है वह द नेचर ऑफ लिस्प है

यह भाग में सच है क्योंकि भाषा के लिए वाक्य रचना इतनी सरल है। यह लिस्प में संभावित चीजों को बनाता है (जैसे मेटाप्रोग्रामिंग) जो अन्य भाषाओं में अव्यावहारिक है क्योंकि सिंटैक्स रास्ते में मिलता है।

इसके अलावा पढ़ना
पिटाई


3
2 पैरा का मतलब यह नहीं है: समरूपता! = सरल वाक्यविन्यास; सरल वाक्य रचना आसान एक लिस्प पार्सर लिखने के लिए बनाता है किसी भी भाषा में (देखें इस )। तीसरा पैराग्राफ अस्पष्ट है, उदाहरण की आवश्यकता है।

@MattFenwick यह सच है कि समरूपता को जटिल वाक्य रचना के साथ किया जा सकता है, लेकिन यह अत्यधिक कठिन होगा। यह मान लेना उचित है कि यदि आप एक होमियोसोनिक सिंटैक्स के साथ काम कर रहे हैं, तो यह सरल होने जा रहा है, अगर किसी अन्य कारण से इसकी निरंतरता की मांग न हो, जो गैर-होमोसेक्सुअल सिंटैक्स की तुलना में इसका पालन करना आसान बना देगा। यद्यपि आपका दूसरा बिंदु एक अच्छा है, LISP को पार्स करना आसान है, क्योंकि यह सरल वाक्यविन्यास है, न कि समरूपता के कारण (भले ही समरूपता उस सादगी का कारण हो)
जिमी हॉफ

1
किसी भी मामले में, डेटा मूल्य लेने और इसे एक कार्यक्रम के रूप में व्याख्या करने के लिए बहुत कम ओवरहेड है। यह अच्छी बात है। कॉन्फ़िगरेशन द्वारा प्रोग्रामिंग सीधे-आगे होती है जब आपको बस इतना करना होता है कि कॉन्फ़िगरेशन डेटा के लिए एक दुभाषिया लिखना है। उन्नत गणितीय रूपांतर (जो कि राज्य-योग्य भाषाओं में लागू करना मुश्किल है) अक्सर लिस्प के शुद्ध टुकड़े के वाक्य-विन्यास में मात्र "कम" होते हैं।
नौ

1
@MattFenwick: मैंने अपने जवाब से "होमोइकॉनिकिटी" शब्द हटा दिया है।
रॉबर्ट हार्वे

1
काश मैं लिस्प की प्रकृति के लिए एक +1 से अधिक दे सकता; मैंने कभी इतनी बढ़िया व्याख्या नहीं देखी।
डोभाल

9

एक दुभाषिया का अध्ययन क्यों किया जाता है जिस भाषा में यह व्याख्या की जाती है वह इतनी जोर देती है?

सामान्य तौर पर, दुभाषिया का अध्ययन आपको इसकी भाषा और विशेषताओं के बारे में जानकारी देता है। सामान्य तौर पर, प्रोग्रामिंग भाषा में कोड का अध्ययन सुनने और पढ़ने के द्वारा बोली जाने वाली भाषा का अभ्यास करने जैसा होता है: यह आपको परिचित करता है कि भाषा क्या कर सकती है, इसका उपयोग कैसे किया जाता है, और सामान्य "मुहावरे"। विशेष रूप से, लिस्प एक होमोसेक्सुअल भाषा है, जिसका अर्थ है कि अभिव्यक्तियों के लिए इसका सिंटैक्स डेटा के लिए इसका सिंटैक्स है। लिस्प में लेखन कोड अजीब तरह से दिखता है जैसे आप एक सूची लिख रहे हैं, और इसके विपरीत। इस प्रकार, लिस्प कोड के साथ लिस्प कोड की व्याख्या करना उतना ही सरल है जितना कि सूची के साथ carऔर cdr

मुझे इस अभ्यास से कैसे फायदा उठाना चाहिए, ताकि इसका लाभ उठाया जा सके।

इस बारे में सोचें कि दुभाषिया खुद की व्याख्या कैसे करेगा - कई मेटा-सर्कुलर दुभाषिया कार्यान्वयन (जहां एक होमोसेक्सुअल भाषा खुद की व्याख्या करता है) में केवल "फ़ंक्शन से गुजर सकता है"। उदाहरण के लिए, लागू करने के लिए car, बस carतर्क का सहारा लें। यह डेटा स्टोरेज मैकेनिज्म से जोर हटाता है और कार्यक्षमता पर ध्यान केंद्रित करता है।

लिस्प व्याख्याकर्ता किसी के भविष्य के सॉफ़्टवेयर डिज़ाइन के लिए अच्छी वास्तुकला अवधारणाओं को कैसे प्रदर्शित करते हैं?

दुभाषिए बहुत जटिल हो सकते हैं, जो उन्हें डिजाइन करने में अच्छी वास्तुकला को प्रोत्साहित करते हैं। यह ध्यान में रखते हुए, यह एक व्यक्ति दुभाषिया पर अधिक निर्भर है।

अगर मैं इस अभ्यास को C ++ या Java जैसी किसी अन्य भाषा में करता तो मुझे क्या याद आता?

ये भाषाएं होमोसेक्सुअल नहीं हैं, इसलिए वे मेटा-सर्कुलर लिस्प इंटरप्रेटर की कृपा और सरलता से लाभ नहीं उठाती हैं। यह व्यायाम को कठिन बनाता है, और शायद कम आम है, लेकिन मैं यह नहीं कहूंगा कि यह वास्तव में कम फायदेमंद है।

इस अभ्यास से सबसे अधिक उपयोग किया जाने वाला टेकअवे या "मानसिक उपकरण" क्या है?

मुझे यकीन नहीं है कि मेरे पास इसके लिए एक अच्छा जवाब है; बस इतना है कि यह देखने में मदद करता है कि दुभाषिया कैसे काम करता है और, शायद इससे भी महत्वपूर्ण बात यह है कि इसके साथ छेड़छाड़ यह देखने के लिए कि भाषा में मामूली बदलाव आसानी से कैसे लागू किया जा सकता है।


5

LISP को एक तरह से संरचित किया जाता है, जिससे इसे पार्स करना बेहद आसान हो जाता है। यदि आप एक संकलक लिखने की कोशिश करते हैं, तो आप देखेंगे कि यह बहुत आसान है अगर आपकी भाषा में सब कुछ एक अभिव्यक्ति है और इसमें निम्न स्तर की अस्पष्टता है। LISP अस्पष्टता को खत्म करने के लिए हर जगह कोष्ठक को बाध्य करता है और कोई वक्तव्य नहीं है, केवल अभिव्यक्ति है।

यह तथ्य कि LISP को पार्स करना बहुत आसान है, उपयोगकर्ताओं को अपने स्वयं के स्रोत कोड को पार्स करने और इसके साथ जादू करने के लिए प्रोत्साहित करता है। डेटा और कोड के बीच की रेखा धुंधली हो जाती है और आप उन चीजों को आसानी से कर सकते हैं, जिनके लिए सामान्य रूप से कुछ प्रयासों की आवश्यकता होती है, जैसे प्रतिबिंब, गतिशील कोड फिर से लिखना, प्लगइन्स और क्रमांकन।

यही इसका सार है। अभ्यास संभवतः आपको कुछ अंतर्दृष्टि प्रदान करने के लिए होता है जब कोड आसानी से अपने आप से पार्स करने योग्य होता है।


यह लिस्प नहीं है कि पार्स करना आसान है। एस-एक्सप्रेशन को पार्स करना आसान है। उसके ऊपर आपको लिस्प को पार्स करने की आवश्यकता है।
रेनर जोसविग

@ रेनर: यह सिर्फ नाइटपैकिंग नहीं है? मेरी दुनिया में पार्सिंग का मतलब टेक्स्ट से एएसटी तक जाना है, जो कहता है कि कमांड की व्याख्या करने के बारे में कुछ भी नहीं है।
अलेक्जेंडर टॉर्टलिंग

C ++ में Parser एक वाक्यात्मक गलत फ़ंक्शन घोषणा का पता लगाएगा। लिस्प में नहीं। पाठक को प्रोग्रामिंग भाषा लिस्प के बारे में कुछ भी पता नहीं है। C ++ पार्सर पूर्ण C ++ सिंटैक्स जानता है। लिस्प पाठक केवल एस-एक्सप्रेशन जानता है।
रेनर जोसविग

आह, तो मैं समझ गया कि आपका क्या मतलब है। यह सच है, हालांकि मुझे अभी भी लगता है कि एक साधारण लिस्प मूल्यांकनकर्ता सरल सी + + की तुलना में सरल होगा। यह वही है जो वे एसआईसीपी में करते हैं, क्या यह नहीं है (जब से मैंने इसे पढ़ा है) थोड़ी देर हो गई है?
अलेक्जेंडर टॉर्टलिंग

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

4

मुझे यकीन नहीं है कि यह वास्तव में सभी के लिए महत्वपूर्ण है। आप एक सफल डेवलपर हो सकते हैं बिना यह जाने कि लिस्प इंटरप्रेटर कैसे काम करता है। कंप्यूटर विज्ञान का अध्ययन करते समय, लिस्प के मूल विचारों को हालांकि सीखा जाना चाहिए।

लिस्प प्रोग्रामर्स के लिए लिस्प व्याख्याकर्ता महत्वपूर्ण हैं। उन्हें समझने की आवश्यकता है कि एक दुभाषिया ([और संकलक] 1 ) कैसे काम करता है, पूरी तरह से समझने के लिए कि भाषा का उपयोग कैसे किया जाए।

एक लिस्प दुभाषिया अक्सर छात्रों को कुछ चीजें सिखाने के लिए कंप्यूटर विज्ञान में एक उपकरण के रूप में उपयोग किया जाता है:

एक शिक्षण उपकरण के रूप में, एक लिस्प दुभाषिया सहायक होता है, क्योंकि इसे छोटे समय में सीखा और समझा जा सकता है। चूंकि कुछ छात्रों को पहले से ही लिस्प के बारे में पता है, इसलिए जब यह अवधारणाओं से ऊपर सीखने की बात आती है, तो छात्र एक स्तर के क्षेत्र में होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.