JavaScript中英文资料对照外文翻译文献综述

萌到你眼炸
681次浏览
2021年02月21日 23:20
最佳经验
本文由作者推荐

-

2021年2月21日发(作者:冬至吃饺子的寓意)



中英文资料对照外文翻译文献综述




JavaScript


程序的动态行 为分析



摘要



JavaScript


编程语言是广泛用于


web

< p>
编程的语言,也越来越多地用于特定目


的的计算。因此,如何提高正确性、 安全性和


JavaScript


应用程序的性能就成为


了推动类型系统分析,


静态分析和编译技术研究等领域发展的动力之一。


许多这


些技术都旨在研究在一些最具有动态特性的语言,


然而很少人会清楚的知道程序


员是如何利用语言的这些特性。在本文中 ,我们将研究一些广泛使用


JavaScript


程序的动态行 为,并分析如何以及为什么使用这些动态特性。我们将根据这些


JavaScript< /p>


程序得出具体的动态程度,并与目前参考文献中使用的假定数据和通


用工业标准中的数据进行比较。



关键词:

< br>动态行为;执行跟踪;动态指标;程序分析;


JavaScript


1


、介绍






JavaScript

< p>
是一种面向对象的语言,它可以通过客户端的可执行代码让用户


实现和网站 的交互,它是在


1995


年由


Nets cape


公司的


Brendan Eich

设计出的。


它不同于


Java


、< /p>


C


#或


Smalltalk


这些传统语言,它不具有类,也不鼓励封装,甚


至是结构化编程。与之对应的 是,


JavaScript


十分强调编程语言的灵活性。


JavaScript


的成功是不可否认的。据相关数据显示,当前最 流行的


100


个网站中


有


97


个都使用了它


.


同时,


JavaScript


语言还成为了许多办公应用、浏览器应用


以及开发环境等的通用计算平台。


它一直被誉为互联网界的


“汇编语言”


,


和


Java


以及


Scheme


语言类似,


JavaScript


需要代码生成工具的解释。由于这种成功 ,



JavaScript


的已经赢得 了学术界的重视和尊重,而研究人员也开始将目光都集中


在三个主要问题:安全性,正确 性和性能。安全性可以说是


JavaScript


所要解决


的最紧迫的问题:


到目前为止,


已经发生了 一些利用语言的动态性能进行恶意攻


击的案例(主要是能够利用


JavaScript


访问和修改共享文件的特点,通过


eva l


函


数植入恶意代码)


。研究人员已经 提出一些解决方法,比如将静态分析和实时监


控结合起来,


以防 御一些已知的攻击。


另一个研究方向则致力于提供更好的检测


工 具,


以帮助开发者尽早的发现程序中的漏洞。


作为一种弱类型语 言,


JavaScript


没有类型声明,并且只有再被访问和 调用时才进行实时监控,因此为


JavaScript


提供静态 类型的系统也就成为了很自然的事情。


最后,


在被忽视了很长时 间以后,


JavaScript


实现很大的进步,目前最先进的 即时编译技术得到了应用。



2


、动机及相关工作



我们最初研究


JavaScript


的动力在于评估一 个静态类型的系统是否能成功的


验证现有的


JavaScrip t


程序。其他动态语言,如


Scheme


语言就成功的逐步应用


到了类型系统中,


但是其他方面的进展 就相对有些停滞,


比如缺乏有关面向对象


的扩展的类型检查(< /p>


Scheme


中用宏来实现)


。对于


JavaScript


,


Anderson


等人提


出了一种具有明确类型和潜在类型的类型系统,而


Heidegger


和


Thiemann


等人


则把他们之前的工作向前推进了一步,加入了一些最新的类型,


Furr


等人则为


DRuby


提出了一种相关的系统。所有这些类型系统都可以接受目标语言的一些


简 单的简化,但是他们要依靠相当类似假设。举例来说,


Thiemann


写道:


“通常


情况下,


在初始 化后几不会再定义其他的类型了,


而且对象的类型也基本不会发


生变化。


”



常见的关于


JavaScript


的动态行为的假设。


我们将在 下文中继续列举一些



被公开发表或约定俗成的假设,


这些假设已经在参考文献和具体程序中得到了广


泛的应用。



ype


对象的层次结构是不变的。


在创建一个新对象时,


Prototype


层


次的结构不会改变的假设对于一个类型系统的运行是非常重要的,


因此我 们甚至


不会选择给出


prototype


对象的模型。关于静态分析的研究很典型,通常它们不


涉及到


prototype


的更新或变化,然而,任何关于


proto type


层次结构的改变都有


可能影响到应用程序的控制流程, 而那些受到影响的对象的类型也会出现变数。



2.

< p>
在对象初始化时属性被添加。


大家一般都认为,对于动态语言来说,存在< /p>


一个类似于“初始化阶段”的时段,大部分的动态行为在这个时段发生,而在这

< p>
个时段后应用程序大多都是静态的。那么具体到


JavaScript


的情形,就是假设作


用域和对象方法的大部分变化都是在初始化阶段 完成的,


因此在创建对象时就已


经确定类型的大部分,只留有一 小部分属性待定这样的方法就显得合情合理了。



3.


属性很少被删除。


在一个类型系统中删除方法或作用域是很难的,因为这


样一来就等于它允许了类型的发展非单调,


这会破坏现代类型语 言中默认执行的


子类型化保证。如果删除的是一个特殊的情况(一个可以预测的情况)< /p>


,人们可


以对这些未来可能被删除的属性使用一些潜在的类型。< /p>


但是,


这样做会减少我们


使用类型系统所 带来的好处,


这可能是为什么一些相关的研究禁止这种做法的原


因。


静态分析方法通常更能接受这种不严密的做法,


也可以对删 除做出处理,


但


我们到目前还没有发现任何关于现有数据流分析 技术的解释。



4.


使用


eval


函数是罕见的而且不影响语义。


Eval< /p>


函数通常被用来计算任意


字符串,


它有可 能使静态分析或静态类型检查得到结果是无效的。


因此,


很多文


献就直接忽视了它,


而另一些文献则假定这些使用的影响是微不 足道的,


或者使



用这些参考了


JSON


反序列化协议。


< br>5.


已声明函数的特征能够说明其类型。


JavaScr ipt


里的类型系统已经声明的


函数的元数能够说明它在调用 时所使用的方法,


当然这种情况不是必须的,


因为


JavaScript


允许不同元数的调用。



6.


程序的大小是合适的。


很多论文都花费 大量笔墨明确指出,他们假定所研


究的


JavaScript< /p>


程序是一些小型的程序,而且另一些则暗示了这一点,因为他们


向 大家介绍说现有的理论分析不能扩展到大型系统中去。



7.< /p>


调用现场的动态行为很少。


一些出色的


J avaScript


程序的完善和优化,如


谷歌的


V8


,需要依赖一些已经成名的实现技术,比如对象创建类(就像


Java


一样)和内联缓存。如果


JavaSc ript


的行为大致类似于其它面向对象的语言,这


些技术会带 来良好的性能和使用效果。



8.


执行 时间主要由循环决定。


一些基于跟踪的即时编译器,


比如


TraceMonkey


等,


它们工作的基础 就建立在程序的执行时间主要由小循环决定这个传统的假设


上。



9.


行业基准能够反映


JavaScr ipt


的工作负荷。


如


SunSpid er


,


Dromaeo


和


V8


这样的基准测试平台是用来评价和比较


Java Script


的实现性能和计算静态分析技


术的准确性的。


但是,


从使用这些基准测试平台得到的结论只有在一种情况下是


有意义的,那就是它们能够准确地反映出在现实世界中运行的


Jav aScript


程序的


工作负荷区间。



本文的目的是提供支持或否定以上假设的证据。


我们不是要质疑 以前的研究


成果的准确性,


即使上述假设的一部分是被证明毫无 依据的,


以前的研究成果仍


然可以为我们研究

< br>JavaScript


提供一个有用的基础和出发点。但是我们想要强调



这些已经广泛采用的现有技术的限制,并且指出在今后的研究中要面临 的挑战。



相关工作。


到目前为止,< /p>


据我们所知,


还没有可以在深度和广度上具有相当


规模的


JavaScript


程序的动态行为的研究。


Ratanaworabhan


等人已经进行过和我

< p>
们类似的研究,其最终结果也是和我们相似的。以前在


javascrip t


应用到安全领


域时也确实有一些关于其动态行为的研究,


但是那些研究只侧重于和安全性紧密


相关的部分。我们也曾进行过一 些小规模的


JavaScript


研究,并得出了一些初步


结果


Harland


,

这些结果与这里提出的最新研究结果也是相吻合的。


Holkner


和也


曾就


Python


语言动 态特性的应用进行过研究(添加和删除作用域和方法)


,它们


的 研究重点集中在一系列小的程序上面,并得出了它们之间存在明确区别的结


论。


他们的研究表明,


动态特性中的大部分都出现在程序的初始化阶段,


而在程


序的主要运算阶段,


动态行为就逐渐 减少了。


我们的研究结果表明,


在应用方面,

< br>JavaScript


比


Python

< br>更加动态化。


关于面向对象语言在实时运行中的特性研究也


有很多,


比如


Garret


等人研究 了


Self


语言中信息发送的动态程度,


Calder


等人则


分析了


C


和


C++


程序运行中的差异,


Temporo


等人研究了


Java

< br>中继承的应用等。


之前的这些研究都对某种特定语言的某个特殊方面进行了非常详 尽的研究,


收到


他们的鼓舞,我们决定争取为

< br>JavaScript


也做出一个类似的概述,并为未来的研

究留下一些详细的数据以供参考。


最后,


我们的工作得到了


Dufour


等人的启发,


他们就


Java


的运行指标进行了严格的框架讨论。



3


、跟踪和分析技术基础



本文对基础结构和跟踪的研究是基于


WebKit

的网页浏览器引擎的一个可以


测量数据的版本,这个引擎现在被应用到了

< p>
Apple


的


Safari


浏览器上。虽然有可


用的独立解释程序,他们却无法处理目前在大部分支持

< p>
JavaScript


的网站常见的


< p>
DOM


和


AJAX


技术。 为了提高实验的灵活性,我们的分析是在离线状态下进行


的。我们的浏览器记录下由解释 程序带来的大部分操作(读,写,删除,调用,


定义等)


,同样 作为垃圾收集和源文件加载的事件也会被跟踪。


Eval


函数触 发一


个特定事件的情形和源文件加载的情形是相似的,


而经过计 算的字符串也将被保


存,


并像程序执行时的其他部分一样被追踪 分析。


已经追踪到的痕迹被压缩并存


储到磁盘中。


虽然它在执行时有一些额外的开销,


但是我们用来测试的工具在运

< p>
行交互应用时的速度并没有受到影响,


并且我们的用户也没有对性能有任何 的抱


怨。


然后我们在离线状态下分析了这些数据,


并将结果存储在一个数据库中进行


数据挖掘。


离线痕 迹分析组件实质上是对抽象流的解释。


它是能够重现这些痕迹


的 ,并为相应的


JavaScript


程序得出一个关于堆状态的 抽象解释。痕迹分析仪中


把包括了关于程序动态行为的丰富的和可定制的历史信息,


比如访问每个对象的


历史,调用现场和分配网站等等。最后,一些静 态分析(


EV


AL


分类,代码大小


的度量)是基于被恢复的源文件运行的,它使用了


Rhino


的


JavaScript


编译器的

< p>
框架解析技术。



4


、结论



本 文提供了第一个大规模的研究


JavaScript


程序在运行 时的行为。我们已经


识别出一组字节代表实际的程序


,


这组字节的大小范围为数百千字节到兆字节,


我们对每个网站都记录了很 多痕迹


,


然后使用相应的编译仪器与离线分析工具从

< p>
痕迹中提取了行为信息。我们使用此信息来评估清单中的


9


个关于


JavaScript


程


序的常用假设。




-


-


-


-


-


-


-


-