JavaScript中英文资料对照外文翻译文献综述
-
中英文资料对照外文翻译文献综述
JavaScript
程序的动态行
为分析
摘要
JavaScript
编程语言是广泛用于
web
编程的语言,也越来越多地用于特定目
的的计算。因此,如何提高正确性、
安全性和
JavaScript
应用程序的性能就成为
了推动类型系统分析,
静态分析和编译技术研究等领域发展的动力之一。
许多这
些技术都旨在研究在一些最具有动态特性的语言,
然而很少人会清楚的知道程序
员是如何利用语言的这些特性。在本文中
,我们将研究一些广泛使用
JavaScript
程序的动态行
为,并分析如何以及为什么使用这些动态特性。我们将根据这些
JavaScript<
/p>
程序得出具体的动态程度,并与目前参考文献中使用的假定数据和通
用工业标准中的数据进行比较。
关键词:
< br>动态行为;执行跟踪;动态指标;程序分析;
JavaScript
1
、介绍
JavaScript
是一种面向对象的语言,它可以通过客户端的可执行代码让用户
实现和网站
的交互,它是在
1995
年由
Nets
cape
公司的
Brendan Eich
设计出的。
它不同于
Java
、<
/p>
C
#或
Smalltalk
这些传统语言,它不具有类,也不鼓励封装,甚
至是结构化编程。与之对应的
是,
JavaScript
十分强调编程语言的灵活性。
JavaScript
的成功是不可否认的。据相关数据显示,当前最
流行的
100
个网站中
有
97
个都使用了它
.
同时,
JavaScript
语言还成为了许多办公应用、浏览器应用
以及开发环境等的通用计算平台。
它一直被誉为互联网界的
p>
“汇编语言”
,
和
Java
以及
Scheme
语言类似,
JavaScript
需要代码生成工具的解释。由于这种成功
,
JavaScript
的已经赢得
了学术界的重视和尊重,而研究人员也开始将目光都集中
在三个主要问题:安全性,正确
性和性能。安全性可以说是
JavaScript
所要解决
p>
的最紧迫的问题:
到目前为止,
已经发生了
一些利用语言的动态性能进行恶意攻
击的案例(主要是能够利用
JavaScript
访问和修改共享文件的特点,通过
eva
l
函
数植入恶意代码)
。研究人员已经
提出一些解决方法,比如将静态分析和实时监
控结合起来,
以防
御一些已知的攻击。
另一个研究方向则致力于提供更好的检测
工
具,
以帮助开发者尽早的发现程序中的漏洞。
作为一种弱类型语
言,
JavaScript
没有类型声明,并且只有再被访问和
调用时才进行实时监控,因此为
JavaScript
提供静态
类型的系统也就成为了很自然的事情。
最后,
在被忽视了很长时
间以后,
JavaScript
实现很大的进步,目前最先进的
即时编译技术得到了应用。
2
、动机及相关工作
我们最初研究
JavaScript
的动力在于评估一
个静态类型的系统是否能成功的
验证现有的
JavaScrip
t
程序。其他动态语言,如
Scheme
语言就成功的逐步应用
到了类型系统中,
但是其他方面的进展
就相对有些停滞,
比如缺乏有关面向对象
的扩展的类型检查(<
/p>
Scheme
中用宏来实现)
。对于
p>
JavaScript
,
Anderson
等人提
出了一种具有明确类型和潜在类型的类型系统,而
Heidegger
和
Thiemann
p>
等人
则把他们之前的工作向前推进了一步,加入了一些最新的类型,
Furr
等人则为
DRuby
提出了一种相关的系统。所有这些类型系统都可以接受目标语言的一些
简
单的简化,但是他们要依靠相当类似假设。举例来说,
Thiemann
写道:
“通常
情况下,
在初始
化后几不会再定义其他的类型了,
而且对象的类型也基本不会发
生变化。
”
常见的关于
JavaScript
的动态行为的假设。
我们将在
下文中继续列举一些
被公开发表或约定俗成的假设,
这些假设已经在参考文献和具体程序中得到了广
泛的应用。
ype
对象的层次结构是不变的。
在创建一个新对象时,
Prototype
层
次的结构不会改变的假设对于一个类型系统的运行是非常重要的,
因此我
们甚至
不会选择给出
prototype
对象的模型。关于静态分析的研究很典型,通常它们不
涉及到
prototype
的更新或变化,然而,任何关于
proto
type
层次结构的改变都有
可能影响到应用程序的控制流程,
而那些受到影响的对象的类型也会出现变数。
2.
在对象初始化时属性被添加。
大家一般都认为,对于动态语言来说,存在<
/p>
一个类似于“初始化阶段”的时段,大部分的动态行为在这个时段发生,而在这
个时段后应用程序大多都是静态的。那么具体到
JavaScript
p>
的情形,就是假设作
用域和对象方法的大部分变化都是在初始化阶段
完成的,
因此在创建对象时就已
经确定类型的大部分,只留有一
小部分属性待定这样的方法就显得合情合理了。
3.
属性很少被删除。
在一个类型系统中删除方法或作用域是很难的,因为这
样一来就等于它允许了类型的发展非单调,
这会破坏现代类型语
言中默认执行的
子类型化保证。如果删除的是一个特殊的情况(一个可以预测的情况)<
/p>
,人们可
以对这些未来可能被删除的属性使用一些潜在的类型。<
/p>
但是,
这样做会减少我们
使用类型系统所
带来的好处,
这可能是为什么一些相关的研究禁止这种做法的原
因。
静态分析方法通常更能接受这种不严密的做法,
也可以对删
除做出处理,
但
我们到目前还没有发现任何关于现有数据流分析
技术的解释。
4.
使用
eval
函数是罕见的而且不影响语义。
Eval<
/p>
函数通常被用来计算任意
字符串,
它有可
能使静态分析或静态类型检查得到结果是无效的。
因此,
很多文
献就直接忽视了它,
而另一些文献则假定这些使用的影响是微不
足道的,
或者使
用这些参考了
JSON
反序列化协议。
< br>5.
已声明函数的特征能够说明其类型。
JavaScr
ipt
里的类型系统已经声明的
函数的元数能够说明它在调用
时所使用的方法,
当然这种情况不是必须的,
因为
JavaScript
允许不同元数的调用。
p>
6.
程序的大小是合适的。
很多论文都花费
大量笔墨明确指出,他们假定所研
究的
JavaScript<
/p>
程序是一些小型的程序,而且另一些则暗示了这一点,因为他们
向
大家介绍说现有的理论分析不能扩展到大型系统中去。
7.<
/p>
调用现场的动态行为很少。
一些出色的
J
avaScript
程序的完善和优化,如
谷歌的
V8
,需要依赖一些已经成名的实现技术,比如对象创建类(就像
Java
一样)和内联缓存。如果
JavaSc
ript
的行为大致类似于其它面向对象的语言,这
些技术会带
来良好的性能和使用效果。
8.
执行
时间主要由循环决定。
一些基于跟踪的即时编译器,
比如
TraceMonkey
等,
它们工作的基础
就建立在程序的执行时间主要由小循环决定这个传统的假设
上。
9.
行业基准能够反映
JavaScr
ipt
的工作负荷。
如
SunSpid
er
,
Dromaeo
和
V8
这样的基准测试平台是用来评价和比较
Java
Script
的实现性能和计算静态分析技
术的准确性的。
p>
但是,
从使用这些基准测试平台得到的结论只有在一种情况下是
p>
有意义的,那就是它们能够准确地反映出在现实世界中运行的
Jav
aScript
程序的
工作负荷区间。
本文的目的是提供支持或否定以上假设的证据。
我们不是要质疑
以前的研究
成果的准确性,
即使上述假设的一部分是被证明毫无
依据的,
以前的研究成果仍
然可以为我们研究
< br>JavaScript
提供一个有用的基础和出发点。但是我们想要强调
这些已经广泛采用的现有技术的限制,并且指出在今后的研究中要面临
的挑战。
相关工作。
到目前为止,<
/p>
据我们所知,
还没有可以在深度和广度上具有相当
规模的
JavaScript
程序的动态行为的研究。
Ratanaworabhan
等人已经进行过和我
们类似的研究,其最终结果也是和我们相似的。以前在
javascrip
t
应用到安全领
域时也确实有一些关于其动态行为的研究,
p>
但是那些研究只侧重于和安全性紧密
相关的部分。我们也曾进行过一
些小规模的
JavaScript
研究,并得出了一些初步
p>
结果
Harland
,
这些结果与这里提出的最新研究结果也是相吻合的。
Holkner
和也
曾就
Python
语言动
态特性的应用进行过研究(添加和删除作用域和方法)
,它们
的
研究重点集中在一系列小的程序上面,并得出了它们之间存在明确区别的结
论。
他们的研究表明,
动态特性中的大部分都出现在程序的初始化阶段,
p>
而在程
序的主要运算阶段,
动态行为就逐渐
减少了。
我们的研究结果表明,
在应用方面,
< br>JavaScript
比
Python
< br>更加动态化。
关于面向对象语言在实时运行中的特性研究也
有很多,
比如
Garret
等人研究
了
Self
语言中信息发送的动态程度,
Calder
等人则
分析了
C
和
C++
程序运行中的差异,
Temporo
等人研究了
Java
< br>中继承的应用等。
之前的这些研究都对某种特定语言的某个特殊方面进行了非常详
尽的研究,
收到
他们的鼓舞,我们决定争取为
< br>JavaScript
也做出一个类似的概述,并为未来的研
究留下一些详细的数据以供参考。
最后,
我们的工作得到了
Dufour
等人的启发,
他们就
p>
Java
的运行指标进行了严格的框架讨论。
3
、跟踪和分析技术基础
本文对基础结构和跟踪的研究是基于
WebKit
的网页浏览器引擎的一个可以
测量数据的版本,这个引擎现在被应用到了
Apple
的
Safari
浏览器上。虽然有可
用的独立解释程序,他们却无法处理目前在大部分支持
JavaScript
的网站常见的
DOM
和
AJAX
技术。
为了提高实验的灵活性,我们的分析是在离线状态下进行
的。我们的浏览器记录下由解释
程序带来的大部分操作(读,写,删除,调用,
定义等)
,同样
作为垃圾收集和源文件加载的事件也会被跟踪。
Eval
函数触
发一
个特定事件的情形和源文件加载的情形是相似的,
而经过计
算的字符串也将被保
存,
并像程序执行时的其他部分一样被追踪
分析。
已经追踪到的痕迹被压缩并存
储到磁盘中。
虽然它在执行时有一些额外的开销,
但是我们用来测试的工具在运
行交互应用时的速度并没有受到影响,
并且我们的用户也没有对性能有任何
的抱
怨。
然后我们在离线状态下分析了这些数据,
并将结果存储在一个数据库中进行
数据挖掘。
离线痕
迹分析组件实质上是对抽象流的解释。
它是能够重现这些痕迹
的
,并为相应的
JavaScript
程序得出一个关于堆状态的
抽象解释。痕迹分析仪中
把包括了关于程序动态行为的丰富的和可定制的历史信息,
p>
比如访问每个对象的
历史,调用现场和分配网站等等。最后,一些静
态分析(
EV
AL
分类,代码大小
p>
的度量)是基于被恢复的源文件运行的,它使用了
Rhino
的
JavaScript
编译器的
框架解析技术。
4
、结论
本
文提供了第一个大规模的研究
JavaScript
程序在运行
时的行为。我们已经
识别出一组字节代表实际的程序
,
这组字节的大小范围为数百千字节到兆字节,
我们对每个网站都记录了很
多痕迹
,
然后使用相应的编译仪器与离线分析工具从
痕迹中提取了行为信息。我们使用此信息来评估清单中的
9
个关于
JavaScript
程
序的常用假设。