文档介绍:优秀设计
JavaScript程序的动态行为分析
摘要
JavaScript编程语言是广泛用于web编程的语言,也越来越多地用于特定目的的计算。因此,如何提高正确性、安全性和JavaScript应用程序的性能就成为了推动类型系统分析,静态分析和编译技术研究等领域发展的动力之一。许多这些技术都旨在研究在一些最具有动态特性的语言,然而很少人会清楚的知道程序员是如何利用语言的这些特性。在本文中,我们将研究一些广泛使用JavaScript程序的动态行为,并分析如何以及为什么使用这些动态特性。我们将根据这些JavaScript程序得出具体的动态程度,并与目前参考文献中使用的假定数据和通用工业标准中的数据进行比较。
关键词:动态行为;执行跟踪;动态指标;程序分析;JavaScript
1、介绍
JavaScript是一种面向对象的语言,它可以通过客户端的可执行代码让用户实现和网站的交互,scape公司的Brendan Eich设计出的。它不同于Java、C#或Smalltalk这些传统语言,它不具有类,也不鼓励封装,甚至是结构化编程。与之对应的是,JavaScript十分强调编程语言的灵活性。JavaScript的成功是不可否认的。据相关数据显示,,JavaScript语言还成为了许多办公应用、浏览器应用以及开发环境等的通用计算平台。它一直被誉为互联网界的“汇编语言”,和Java以及Scheme语言类似,JavaScript需要代码生成工具的解释。由于这种成功,JavaScript的已经赢得了学术界的重视和尊重,而研究人员也开始将目光都集中在三个主要问题:安全性,正确性和性能。安全性可以说是JavaScript所要解决的最紧迫的问题:到目前为止,已经发生了一些利用语言的动态性能进行恶意攻击的案例(主要是能够利用JavaScript访问和修改共享文件的特点,通过eval函数植入恶意代码)。研究人员已经提出一些解决方法,比如将静态分析和实时监控结合起来,以防御一些已知的攻击。另一个研究方向则致力于提供更好的检测工具,以帮助开发者尽早的发现程序中的漏洞。作为一种弱类型语言,JavaScript没有类型声明,并且只有再被访问和调用时才进行实时监控,因此为JavaScript提供静态类型的系统也就成为了很自然的事情。最后,在被忽视了很长时间以后,JavaScript实现很大的进步,目前最先进的即时编译技术得到了应用。
2、动机及相关工作
我们最初研究JavaScript的动力在于评估一个静态类型的系统是否能成功的验证现有的JavaScript程序。其他动态语言,如Scheme语言就成功的逐步应用到了类型系统中,但是其他方面的进展就相对有些停滞,比如缺乏有关面向对象的扩展的类型检查(Scheme中用宏来实现)。对于JavaScript,Anderson等人提出了一种具有明确类型和潜在类型的类型系统,而Heidegger和Thiemann等人则把他们之前的工作向前推进了一步,加入了一些最新的类型,Furr等人则为DRuby提出了一种相关的系统。所有这些类型系统都可以接受目标语言的一些简单的简化,但是他们要依靠相当类似假设。举例来说,Thiemann写道:“通常情况下,在初始化后几不会再定义其他的类型了,而且对象的类型也基本不会发生变化。”
常见的关于JavaScript的动态行为的假设。我们将在下文中继续列举一些被公开发表或约定俗成的假设,这些假设已经在参考文献和具体程序中得到了广泛的应用。
。在创建一个新对象时,Prototype层次的结构不会改变的假设对于一个类型系统的运行是非常重要的,因此我们甚至不会选择给出prototype对象的模型。关于静态分析的研究很典型,通常它们不涉及到prototype的更新或变化,然而,任何关于prototype层次结构的改变都有可能影响到应用程序的控制流程,而那些受到影响的对象的类型也会出现变数。
。大家一般都认为,对于动态语言来说,存在一个类似于“初始化阶段”的时段,大部分的动态行为在这个时段发生,而在这个时段后应用程序大多都是静态的。那么具体到JavaScript的情形,就是假设作用域和对象方法的大部分变化都是在初始化阶段完成的,因此在创建对象时就已经确定类型的大部分,只留有一小部分属性待定这样的方法就显得合情合理了。
。在一个类型系统中删除方法或作用域是很难的,因为这样一来就等于它允许了类型的发展非单调,这会破坏现代类型语言中默认执行的子类型化保证。如果删除的是一个特殊的情况(一个可以预测的情况),人们可以对这些未来可能被删除的属性使用一些潜在的类