An 文章名为《Perl 无法解析,形式化证明》正在巡视。那么,Perl 是否在“运行时”或“编译时”决定其解析代码的含义?
在我读过的一些讨论中,我的印象是这些论点源于不精确的术语,所以请尝试在答案中定义您的技术术语。我故意没有定义“运行时”、“静态”或“解析”,以便我可以从那些对这些术语的定义可能与我不同的人那里获得观点。
Edit:
这与静态分析无关。这是一个关于 Perl 行为的理论问题。
Perl 有一个明确定义的“编译时”阶段,随后是一个明确定义的“运行时”阶段。然而,有一些方法可以从一种过渡到另一种。许多动态语言都有eval
允许在运行时阶段编译新代码的构造;在 Perl 中,相反的情况也是可能的——而且很常见。BEGIN
块(以及隐式的BEGIN
阻塞引起的use
) 调用临时运行时阶段during编译时。 ABEGIN
块在编译后立即执行,而不是等待编译单元的其余部分(即当前文件或当前eval
) 编译。自从BEGIN
在编译它们后面的代码之前运行,它们几乎可以以任何方式影响后续代码的编译(尽管实际上它们所做的主要事情是导入或定义子例程,或者启用严格性或警告)。
A use Foo;
基本上相当于BEGIN { require foo; foo->import(); }
,要求存在(例如eval STRING
)从运行时调用编译时的方法之一,这意味着我们现在在编译时内的运行时内的编译时内,并且整个事情是递归的。
无论如何,解析 Perl 的可判定性归结为,由于一位代码的编译可能会受到以下因素的影响:执行前面的一段代码(理论上可以做anything),我们遇到了停机问题类型的情况;正确解析给定 Perl 文件的唯一方法一般来说是通过执行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)