gpt4 book ai didi

python - 如何向用 python 实现的语言添加回溯/调试功能?

转载 作者:太空狗 更新时间:2023-10-30 01:30:06 25 4
gpt4 key购买 nike

我正在使用 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 类并在解释器的顶层捕获它。最后,您使用全局调试堆栈中的信息打印出您喜欢的内容。

关于python - 如何向用 python 实现的语言添加回溯/调试功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com