在larva的语义和流程分析上,我偷了很大的懒,基本等于没做,因为觉得做起来太麻烦了
流程分析可以在一段语法上完全没有问题的代码中,找出可能有问题的代码,这个不同编译器支持程度也不同,其实在绝大多数情况下,不做这个问题也不大,不过larva面对了一个相关的不可逃避的问题,因为它和python一样有一个特性:若一个函数或方法最后没有return,则自动return一个空对象,larva中是nil,python中则是None,比如:
根据实现的不同,这个问题也有各种程度的解决办法
最简单的就是编译器不做任何处理,采用解释器执行,无论是解释ast还是字节码,若一个函数执行到最后还没有return,虚拟机就自动return nil
另一个简单方法是,无论何种情况,给函数后面加一个return nil即可,虽然会造成下面这种情况:
不过larva并不能用上述这两种方式,原因有两点:
1 larva的实现可能是(也是目前唯一的方式)转换为其它代码,而其它语言的编译器可能很严格&#
流程分析可以在一段语法上完全没有问题的代码中,找出可能有问题的代码,这个不同编译器支持程度也不同,其实在绝大多数情况下,不做这个问题也不大,不过larva面对了一个相关的不可逃避的问题,因为它和python一样有一个特性:若一个函数或方法最后没有return,则自动return一个空对象,larva中是nil,python中则是None,比如:
func f():
print "hello world"
f最后应该隐式return nil
根据实现的不同,这个问题也有各种程度的解决办法
最简单的就是编译器不做任何处理,采用解释器执行,无论是解释ast还是字节码,若一个函数执行到最后还没有return,虚拟机就自动return nil
另一个简单方法是,无论何种情况,给函数后面加一个return nil即可,虽然会造成下面这种情况:
func f():
return 0
return nil
但这在语法上是正确的,执行也没有问题,只是最后的return永远执行不到而已,就是占用代码空间
不过larva并不能用上述这两种方式,原因有两点:
1 larva的实现可能是(也是目前唯一的方式)转换为其它代码,而其它语言的编译器可能很严格&#