1

引用这篇学术论文:动态语言中的句法和语义预测

IntelliSense 实际上是基于变量类型的知识。因此,描述变量的符号必须包含它们的类型,如果它是已知的并且可以解析的话。此外,在动态语言中,一个变量可以在代码的不同部分和不同的程序执行中携带不同的类型实例。变量也可以动态启动,其类型只能在运行时知道。因此,符号应该包含一些在语义分析中解析的可能类型列表。但总的来说,动态语言无法明确解决即使是单个程序执行也无济于事。

我在哪里可以找到更多这方面的资源,我特别感兴趣的是上面引用中强调的陈述,最后是一些关于代码静态分析预测率的统计数据。

4

1 回答 1

2

这实质上是著名的图灵不可计算性结果:通常,您无法知道计算的作用(或作为类型生成)的答案。

虽然这在一般情况下是正确的,但它并没有说明具体情况。稍加思考就会让你相信,如果程序员不知道某个标识符的类型是什么,他们可能无法编写任何使用它的代码。所以原始编码人员知道(除非他们编写了错误的代码)。但是他们通过对系统的其余部分做出假设,然后强制执行这些假设(通常在其他地方)来知道。

静态分析器不知道程序员做了什么假设,所以它不能那么精确。但在许多特定情况下,静态分析可以推断出类型。问题是,它有多少代码,它能否使用构成代码背后语言的深层语义来解释该代码?

我总是被“分析器不能(像人类一样)好”的概念所困扰。如果分析人员可以访问与人类相同的信息,它应该至少一样好,而且通常更好;它可以以人们无法做到的方式跟踪交互。更重要的是,如果静态分析器无法访问您代码背后的关键假设,您怎么能指望其他程序员处理该代码?存在什么理由坚持他们知道某些代码块中使用的所有背景/假设?

所以我认为静态分析器的大部分限制,甚至适用于动态语言,都是由于我们不愿意或无法写下我们在编写代码时使用的假设造成的。(在那之后,设计一个适当强大的分析仪的能量问题)。

于 2012-11-25T21:13:23.230 回答