बाइट कोड बुनाई लिस्प मैक्रोज़


11

मैं उन पुस्तकालयों के बारे में पढ़ रहा हूं, जिन्हें लोगों ने जावा और सी # जैसी भाषाओं के लिए लिखा है, जो बाइट कोड बुनाई का उपयोग इंटरसेप्ट फंक्शन कॉल्स, इंसर्ट लॉगिंग कोड, इत्यादि जैसे काम करने के लिए करते हैं। उन्हें कैसे उपयोग किया जाए, यह बेहतर ढंग से समझने का प्रयास। जितना मैं मैक्रोज़ के बारे में पढ़ता हूं, उतना ही ऐसा लगता है कि वे बाइट कोड बुनाई पुस्तकालयों के समान कार्यक्षमता प्रदान करते हैं। कार्यक्षमता के द्वारा, मेरा मतलब है कि संकलन समय पर कोड में हेरफेर करने की क्षमता।

मेरे द्वारा देखे जा रहे पुस्तकालयों के उदाहरण AspectJ, PostSharp और Cecil होंगे।

क्या ऐसा कुछ है जो एक के साथ किया जा सकता है और दूसरे के साथ नहीं? क्या वे वास्तव में समान समस्याओं को हल करते हैं या मैं सेब और संतरे की तुलना कर रहा हूं?


2
बाइट कोड बुनाई एक काम के आसपास है जब आपको एक गतिशील भाषा की आवश्यकता होती है, लेकिन एक सांख्यिकीय रूप से टाइप की गई भाषा के साथ अटक जाते हैं
केविन क्लाइन

2
@kevincline क्या आप गंभीरता से इस पुरानी लड़ाई को शुरू करने की कोशिश कर रहे हैं?
जोनाथन हेंसन

जवाबों:


10

बाइट कोड बुनाई और मैक्रोज़ दो अलग-अलग चीजें हैं।

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

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


+1 उल्लेख करने के लिए कि यह AOP को लागू करने का एक महत्वपूर्ण तरीका है।
जोनाथन हेंसन

और लेन-देन ... हमें लेनदेन को नहीं भूलना चाहिए।
जोनाथन हेंसन

3
LISP मैक्रोज़ 'कीस्ट्रोक्स रिकॉर्ड करने का एक तरीका' जैसा कुछ नहीं हैं।
केविन क्लाइन

1
खैर कुछ मौलिक अवधारणाएं IMO के उत्तर से गायब हैं, वे हो सकते हैं: एएसटी, प्रतिबिंब, मेटासेकुलरिटी।
एंड्रियाशेचेर्ट

2
@AndreasScheinert: ओपी ने उन चीजों के बारे में नहीं पूछा। यह एक शोध प्रबंध नहीं है; यह सिर्फ ओपी के सवाल का जवाब है।
रॉबर्ट हार्वे

5

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

जावा बाइट-कोड बुनाई प्लग इन JVM स्तर पर काम करते हैं। जबकि कई जावा प्रोग्रामर दूसरों द्वारा लिखे गए बाइट-कोड बुनाई प्लगइन्स का उपयोग कर सकते हैं, बहुत कम जावा प्रोग्रामर अपने स्वयं के बाइट-कोड बुनाई प्लगइन्स लिखते हैं।

जावा कंपाइलर प्लगइन्स द्वारा किए गए कुछ काम बहुत आसानी से गतिशील भाषाओं में किए जाते हैं। फंक्शन-कॉल इंटरसेप्शन विशेष रूप से सरल है।


मैं दोनों के बीच तकनीकी अंतर को समझता हूं। मैं प्रश्न को एक उच्च स्तर के दृष्टिकोण से देखने का प्रयास कर रहा था। क्या दोनों उपकरण समान लक्ष्यों को प्राप्त करने के लिए कोड में हेरफेर कर सकते हैं? क्या ऐसी कोई समस्याएँ हैं जो मैक्रोज़ नहीं सुलझा सकते हैं कि बायटेकोड हेरफेर कर सकते हैं (एक समझदार और लागत कुशल तरीके से)? यह वही है जो मैं लिए जा रहा था।
मोर्टलापमैन

@mortalapeman: बाइट-कोड संशोधन के माध्यम से जावा और सी # में संभव जोड़तोड़ सभी को सीधे लिस्प, रूबी, पायथन, लुआ, जावास्क्रिप्ट जैसी भाषाओं में किया जा सकता है ... यह संभवत: वह सब कुछ करना संभव है जो एक LISP मैक्रो बाइट के माध्यम से कर सकता है -कोड हेरफेर, लेकिन व्यवहार में ऐसा नहीं होता है।
केविन क्लाइन

4

लिस्प मैक्रो स्रोत कोड स्तर पर काम कर रहे हैं। यदि आप कुछ मैक्रो को कोड के टुकड़े के चारों ओर लपेटते हैं, तो आप बहुत सारी चीजें कर सकते हैं। जिसमें सोर्स कोड को पार्स करना, कोड डालना, कोड लिखना, आदि शामिल हैं।

यदि आप फ़ंक्शन कॉल को संशोधित करना चाहते हैं, तो लिस्प आमतौर पर दो तंत्रों का उपयोग करता है:

  • देर से बाध्यकारी प्रतीकों। आप एक प्रतीक से जुड़े फ़ंक्शन को संशोधित कर सकते हैं। प्रत्येक फ़ंक्शन कॉलिंग जो एक प्रतीक के माध्यम से जाता है, फिर नए फ़ंक्शन का उपयोग करता है।

  • लिस्प कार्यान्वयन कभी-कभी 'सलाह' नामक एक सुविधा प्रदान करते हैं। इससे कॉल के पहले या बाद में कोड निष्पादित करने की अनुमति मिलती है। लिस्पवर्क्स में उदाहरण के लिए: सलाह

इस प्रकार आप निम्न-स्तरीय कोड हेरफेर के बिना कॉल को रोक सकते हैं।

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