Thi*_*uda 5 python jit language-implementation
我正在使用python来实现另一种名为'foo'的编程语言.所有foo的代码都将被转换为python,并且也将在同一个python解释器中运行,因此它将JIT转换为python.
这是一小段foo的代码:
function bar(arg1, arg2) {
while (arg1 > arg2) {
arg2 += 5;
}
return arg2 - arg1;
}
Run Code Online (Sandbox Code Playgroud)
这将转化为:
def _bar(arg1, arg2):
while arg1 > arg2:
arg2 += 5
watchdog.switch()
watchdog.switch()
return arg2 - arg1
Run Code Online (Sandbox Code Playgroud)
'watchdog'是一个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();
Run Code Online (Sandbox Code Playgroud)
这将转化为:
def _bar():
watchdog.switch()
raise Exception('Some exception message')
def _foo():
print 'invoking function bar'
watchdog.switch()
_bar()
watchdog.switch()
_foo()
Run Code Online (Sandbox Code Playgroud)
然后,'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
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法吗?我更喜欢一种不涉及检测python字节码的解决方案,因为它是解释器实现的内部,但如果没有别的,那么检测字节码也会这样做.
您可以使用装饰器来装饰每个生成的 Python 函数,该装饰器将上下文(文件名、函数、行号等)记录到全局堆栈中。然后,您可以派生自己的 Exception 类并在解释器的顶层捕获它。最后,您可以使用全局调试堆栈中的信息打印出您喜欢的内容。
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |