如何在python中实现的语言中添加回溯/调试功能



我正在使用python来实现另一种名为"foo"的编程语言。foo的所有代码都将被翻译成python,并且也将在同一个python解释器中运行,因此它将JIT翻译成python。

以下是foo的一小段代码:

function bar(arg1, arg2) {
    while (arg1 > arg2) {
        arg2 += 5;
    }
    return arg2 - arg1;
}

将转换为:

def _bar(arg1, arg2):
    while arg1 > arg2:
        arg2 += 5
        watchdog.switch()
    watchdog.switch()
    return arg2 - arg1

"看门狗"是一个greenlet(生成的代码也在greenlet上下文中运行),它将监视/限制资源使用,因为该语言将运行不受信任的代码。

从示例中可以看出,在生成python代码之前,将对解析树进行小的更改,以便添加看门狗开关并对函数标识符进行小的修改。

为了满足所有的要求,我还必须为该语言添加回溯/调试功能,这样当python运行时抛出异常时,用户将看到的是foo的代码回溯(与显示生成的python代码回溯相反)。

假设用户创建了一个名为"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

有简单的方法吗?我更喜欢一个不涉及检测python字节码的解决方案,因为它是解释器实现的内部,但如果没有其他东西,那么检测字节码也可以。

您可以用一个装饰器来装饰每个生成的Python函数,该装饰器将上下文(文件名、函数、行号等)记录到全局堆栈中。然后,您可以派生自己的Exception类,并在解释器的顶级捕获它。最后,使用全局调试堆栈中的信息打印出您喜欢的内容。

最新更新