मैं 'foo' नामक एक और प्रोग्रामिंग भाषा को लागू करने के लिए अजगर का उपयोग कर रहा हूं। फू के सभी कोड का अनुवाद पायथन में किया जाएगा, और उसी पायथन दुभाषिया में भी चलाया जाएगा, इसलिए यह जेआईटी पाइथन में अनुवाद करेगा।पायथन में लागू भाषा में ट्रेसबैक/डीबगिंग क्षमताओं को कैसे जोड़ा जाए?
function bar(arg1, arg2) {
while (arg1 > arg2) {
arg2 += 5;
}
return arg2 - arg1;
}
जो अनुवाद कर देगा करने के लिए:
यहाँ foo के कोड का एक छोटा सा टुकड़ा है
def _bar(arg1, arg2):
while arg1 > arg2:
arg2 += 5
watchdog.switch()
watchdog.switch()
return arg2 - arg1
'प्रहरी' एक greenlet है (उत्पन्न कोड भी एक greenlet संदर्भ में चल रहा है) जो संसाधन उपयोग की निगरानी/सीमा को सीमित करेगा, क्योंकि भाषा अविश्वसनीय कोड चलाएगी।
उदाहरण में देखा जा सकता है कि पाइथन कोड उत्पन्न होने से पहले, वॉचडॉग स्विच जोड़ने और फ़ंक्शन आइडेंटिफ़ायर में छोटे बदलाव करने के लिए पार्स पेड़ में छोटे बदलाव किए जाएंगे।
सभी requeriments को पूरा करने के लिए, मैं भी भाषा को ट्रैस बैक/डिबगिंग क्षमताओं को जोड़ना होगा ताकि जब अजगर क्रम एक अपवाद है, क्या उपयोगकर्ता देखेंगे foo के कोड ट्रैस बैक (के रूप में उत्पन्न अजगर कोड प्रदर्शित करने के लिए oposed है फेंकता वापस ट्रेस करें)।
पर विचार करें उपयोगकर्ता निम्न सामग्री के साथ 'program.foo' नाम की एक फ़ाइल बनाता है कि:
1 function bar() {
2 throw Exception('Some exception message');
3 }
4
5 function foo() {
6 output('invoking function bar');
7 bar();
8 }
9
10 foo();
जो अनुवाद कर देगा करने के लिए:
def _bar():
watchdog.switch()
raise Exception('Some exception message')
def _foo():
print 'invoking function bar'
watchdog.switch()
_bar()
watchdog.switch()
_foo()
फिर, 'program.foo के उत्पादन 'कुछ ऐसा होना चाहिए:
invoking function bar
Traceback (most recent call last):
File "program.foo", line 10
foo();
File "program.foo", line 7, inside function 'foo'
bar();
File "program.foo", line 2, inside function 'bar'
throw Exception('Some exception message');
Exception: Some exception message
क्या ऐसा करने का कोई आसान तरीका है? मैं ऐसे समाधान को पसंद करूंगा जिसमें पायथन बाइटकोड को शामिल नहीं किया जायेगा, क्योंकि यह दुभाषिया कार्यान्वयन के लिए आंतरिक है, लेकिन यदि कुछ और नहीं है, तो बाइटकोड का वाद्य यंत्र भी ऐसा करेगा।
क्या आपका अनुवाद पाइथन कोड और फू कोड की रेखाओं के बीच किसी भी प्रकार का मैपिंग स्टोर करता है? आप निश्चित रूप से एक ट्रेसबैक को कस्टमाइज़ कर सकते हैं: आईपीथॉन के लिए [ultratb] (https://github.com/ipython/ipython/blob/master/IPython/core/ultratb.py) नामक एक मॉड्यूल है, हालांकि यह काफी लंबा और संकलित है, और कुछ सफाई के साथ कर सकता है। –
अभी तक यह केवल अनुवाद करता है। लेकिन अगर यह एक समाधान का हिस्सा है तो मैं निश्चित रूप से foo की रेखाओं के लिए अजगर की रेखाओं को मैप कर सकता हूं। –