2012-03-09 9 views
5

मैं '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 

क्या ऐसा करने का कोई आसान तरीका है? मैं ऐसे समाधान को पसंद करूंगा जिसमें पायथन बाइटकोड को शामिल नहीं किया जायेगा, क्योंकि यह दुभाषिया कार्यान्वयन के लिए आंतरिक है, लेकिन यदि कुछ और नहीं है, तो बाइटकोड का वाद्य यंत्र भी ऐसा करेगा।

+0

क्या आपका अनुवाद पाइथन कोड और फू कोड की रेखाओं के बीच किसी भी प्रकार का मैपिंग स्टोर करता है? आप निश्चित रूप से एक ट्रेसबैक को कस्टमाइज़ कर सकते हैं: आईपीथॉन के लिए [ultratb] (https://github.com/ipython/ipython/blob/master/IPython/core/ultratb.py) नामक एक मॉड्यूल है, हालांकि यह काफी लंबा और संकलित है, और कुछ सफाई के साथ कर सकता है। –

+0

अभी तक यह केवल अनुवाद करता है। लेकिन अगर यह एक समाधान का हिस्सा है तो मैं निश्चित रूप से foo की रेखाओं के लिए अजगर की रेखाओं को मैप कर सकता हूं। –

उत्तर

2

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

+0

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

+0

बेशक आप कर सकते हैं। लेकिन अपनी अपवाद कक्षा घोषित करने से आप अपनी समस्या के लिए अपवाद में कुछ कस्टम जानकारी रिकॉर्ड कर सकते हैं। –

+0

ठीक है, अब तक यह सबसे अच्छा समाधान है, धन्यवाद। –

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