An Analysis of the Dynamic Behavior of JavaScript Programs
Abstract:
The JavaScript programming language is widely used for web programming and, increasingly, for general purpose computing.As such, improving the correctness, security and performance of JavaScript applications has been the driving force for research in type systems, static analysis and compiler techniques for this language. Many of these techniques aim to reign in some of the most dynamic features of the language, yet little seems to be known about how programmers actually utilize the language or these features. In this paper we perform an empirical study of the dynamic behavior of a corpus of widely-used JavaScript programs, and analyze how and why the dynamic features are used. We report on the degree of dynamism that is exhibited by these JavaScript programs and compare that with assumptions commonly made in the literature and accepted industry benchmark suites.
Keywords: Dynamic Behavior, Execution Tracing, Dynamic Metrics, Program Analysis, JavaScript
1. Introduction
JavaScript is an object-oriented language designed in 1995 by Brendan Eich at Netscape to allow non-programmers to extend web sites with client-side executable code. Unlike more traditional languages such as Java, C# or even Smalltalk, it does not have classes, and does not encourage encapsulation or even structured programming. Instead JavaScript strives to maximize flexibility. JavaScript^ success is undeniable.
As a data point, it is used by 97 out of the web?s 100 most popular sites.2 The language is also becoming a general purpose computing platform with office applications, browsers and development environments being developed in JavaScript. It has been dubbed the “assembly language” of the Internet and is targeted by code generators from the likes of Java and Scheme. In response to this success, JavaScript has started to gamer academic attention and respect. Researchers have focused on three main problems: security, correctness and performance. Security is arguably JavaScript^ most pressing problem: a number of attacks have been discovered that exploit the languagersquo;s dynamism (mostly the ability to access and modify shared objects and to inject code via eval). Researchers have proposed approaches that marry static analysis and runtime monitoring to prevent a subset of known attacks. Another strand of research has tried to investigate how to provide better tools for developers for catching errors early. Being a weakly typed language with no type declarations and only run-time checking of calls and field accesses, it is natural to try to provide a static type system for JavaScript. Finally, after many years of neglect, modern implementations of JavaScript have started to appear which use state of the art just-in-time compilation techniques.
2. Motivation and Related Work
The original impetus for our interest in JavaScript was to assess the feasibility of a static type system able to successfully and meaningfully type check existing JavaScript programs. Other dynamic languages such as Scheme have had recent success introducing gradual typing systems, but they have stopped short of type checking object-oriented extensions (implemented by macros in Scheme). For JavaScript, Anderson et al. proposed a type system with definite and potential types, while Heidegger and Thiemann following up on some of their earlier workpropose recency types in, and Furr et al. proposed a related system for DRuby. While all of these type systems acknowledge some minor simplifications to the target language, they rely on fairly similar assumptions. For instance, Thiemann writes: “Usually, no further properties are defined after the initialization and the type of the properties rarely changes”
Common Assumptions about the dynamic behavior of JavaScript.We
proceed to enumerate the explicit and implicit assumptions that are commonly found in the literature and in implementations.
1. The prototype hierarchy is invariant. The assumption that the prototype hierarchy does not change after an object is created is so central to the type system work that chose to not even model prototypes. Research on static analysis typically does not mention prototype updates. Yet, any modification to the prototype hierarchy can potentially impact the control flow graph of the application just as well as the types of affected objects.
2. Properties are added at object initialization. Folklore holds that there is something akin to an “initialization phase” in dynamic languages where most of the dynamic activity occurs and after which the application is mostly static. For JavaScript this is embodied by the assumption that most changes to the fields and methods of objects occur at initialization, and thus that it is reasonable to assign an almost complete type to objects at creation, leaving a small number of properties as potential.
3. Properties are rarely deleted. Removal ofmethods or fields is difficult to ccommodate in a type system as it permits nonmonotonic evolution of types that breaks subtyping guarantees usually enforced in modern typed languages. If deletion is an exceptional occurrence (and one that can be predicted), one could use potential types for properties that may be deleted in the future. But, this would reduce the benefits of having a type.
system in the first place, which is probably why related work chooses to forbid it. Static analysis approaches are usually a bit more tolerant to imprecision and can handle deletes, but we have not found any explanation of its handling in existing data flow analysis techniques.
4. The use of eyal is infrequent and does not affect semantics.The use of eval on arbitrary strings has the potential of invalidating any results obtained by static analysis or static type checking. Thus many works simply ignore
全文共29072字,剩余内容已隐藏,支付完成后下载完整资料
JavaScript程序的动态行为分析外文翻译
摘要
JavaScript编程语言是广泛用于web编程的语言,也越来越多地用于特定目 的的计算。因此,如何提高正确性、安全性和JavaScript应用程序的性能就成为 了推动类型系统分析,静态分析和编译技术研究等领域发展的动力之一。许多g 些技术都旨在研究在一些最具有动态特性的语言,然而很少人会清楚的知道程序 员是如何利用语言的这些特性。在本文中,我们将研究一些广泛使用JavaScript 程序的动态行为,并分析如何以及为什么使用这些动态特性。我们将根据这些 JavaScript程序得出具体的动态程度,并与目前参考文献中使用的假定数据和通 用工业标准中的数据进行比较。
关键词:动态行为;执行跟踪;动态指标;程序分析;JavaScript
1、介绍
JavaScript是一种面向对象的语言,它可以通过客户端的可执行代码让用户 实现和网站的交互,它是在1995年由Netscape公司的Brendan Eich设计出的。 它不同于Java、C#或Smalltalk这些传统语言,它不具有类,也不鼓励封装,甚 至是结构化编程。与之对应的是,JavaScript十分强调编程语言的灵活性。 JavaScript的成功是不可否认的。据相关数据显示,当前最流行的100个网站中 有97个都使用了它.同时,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的更新或变化,然而,任何关于prototype层次结构的改变都有 可能影响到应用程序的控制流程,而那些受到影响的对象的类型也会出现变数。
在对象初始化时属性被添加。大家一般都认为,对于动态语言来说,存在 一个类似于“初始化阶段”的时段,大部分的动态行为在这个时段发生,而在这 个时段后应用程序大多都是静态的。那么具体到JavaScript的情形,就是假设作 用域和对象方法的大部分变化都是在初始化阶段完成的,因此在创建对象时就已 经确定类型的大部分,只留有一小部分属性待定这样的方法就显得合情合理了。
属性很少被删除。在一个类型系统中删除方法或作用域是很难的,因为这 样一来就等于它允许了类型的发展非单调,这会破坏现代类型语言中默认执行的 子类型化保证。如果删除的是一个特殊的情况(一个可以预测的情况),人们可 以对这些未来可能被删除的属性使用一些潜在的类型。但是,这样做会减少我们 使用类型系统所带来的好处,这可能是为什么一些相关的研究禁止这种做法的原 因。静态分析方法通常更能接受这种不严密的做法,也可以对删除做出处理,但 我们到目前还没有发现任何关于现有数据流分析技术的解释。
使用eval函数是罕见的而且不影响语义。Eval函数通常被用来计算任意 字符串,它有可能使静态分析或静态类型检查得到结果是无效的。因此,很多文 献就直接忽视了它,而另一些文献则假定这些使用的影响是微不足道的,或者使 用这些参考了 JSON反序列化协议。
已声明函数的特征能够说明其类型。JavaScript里的类型系统已经声明的 函数的元数能够说明它在调用时所使用的方法,当然这种情况不是必须的,因为 JavaScript允许不同元数的调用。
程序的大小是合适的。很多论文都花费大量笔墨明确指出,他们假定所研 究的JavaScript程序是一些小型的程序,而且另一些则暗示了这一点,因为他们 向大家介绍说现有的理论分析不能扩展到大型系统中去。
调用现场的动态行为很少。一些出色的JavaScript程序的完善和优化,如 谷歌的V8,需要依赖一些已经成名的实现技术,比如对象创建类(就像Java 一样)和内联缓存。如果JavaScript的行为大致类似于其它面向对象的语言,这 些技术会带来良好的性能和使用效果。
执行时间主要由循环决定。一些基于跟踪的即时编译器,比如TraceMonkey 等,它们工作的基础就建立在程序的执行时间主要由小循环决定这个传统的假设 上。
行业基准能够反映JavaScript的工作负荷。如SunSpider,Dromaeo和V8
这样的基准测试平台是用来评价和比较JavaScript的实现性能和计算静态分析技 术的准确性的。但是,从使用这些基准测试平台得到的结论只有在一种情况下是 有意义的,那就是它们能够准确地反映出在现实世界中运行的JavaScript程序的 工作负荷区间。
本文的目的是提供支持或否定以上假设的证据。我们不是要质疑以前的研究 成果的准确性,即使上述假设的一部分是被证明毫无依据的,以前的研究成果仍 然可以为我们研究JavaScript提供一个有用的基础和出发点。但是我们想要强调
这些已经广泛采用的现有技术的限制,并且指出在今后的研究中要面临的挑战。
相关工作。到目前为止,据我们所知,还没有可以在深度和广度上具有相当 规模的JavaScript程序的动态行为的研究。Ratanaworabhan等人已经进行过和我 们类似的研究,其最终结果也是和我们相似的。以前在javascript应用到安全领 域时也确实有一些关于其动态行为的研究,但是那些研究只侧重于和安全性紧密 相关的部分。我们也曾进行过一些小规模的JavaScript研究,并得出了一些初步 结果Harland,这些结果与这里提出的最新研究结果也是相吻合的。Holkner和也 曾就Python语言动态特性的应用进行过研究(添加和删除作用域和方法),它们 的研究重点集中在一系列小的程序上面,并得出了它们之间存在明确区别的结论。他们的研究表明,动态特性中的大部分都出现在程序的初始化阶段,而在程序的主要运算阶段,动态行为就逐渐减少了。我们的研究结果表明,在应用方面, JavaScript比Python更加动态化。关于面向对象语言在实时运行中的特性研究也有很多,比如Garret等人研究了 Self语言中信息发送的动态程度,Calder等人则分析了 C和C 程序运行中的差异,Tempore等人研究了 Java中继承的应用等。之前的这些研究都对某种特定语言的某个特殊方面进行了非常详尽的研究,收到他们的鼓舞,我们决定争取为JavaScript也做出一个类似的概述,并为未来的研 究留下一些详细的数据以供参考。最后,我们的工作得到了 Dufour等人的启发, 他们就Java的运行指标进行了严格的框架讨论。
3、跟踪和分析技术基础
本文对基础结构和跟踪的研究是基于WebKit的网页浏览器引擎的一个可以 测量数据的版本,这个引擎现在被应用到了 Apple的Safari浏览器上。虽然有可 用的独立解释程序,他们却无法处理目前在大部分支持JavaScript的网站常见的
DOM和AJAX技术。为了提高实验的灵活性,我们的分析是在离线状态下进行 的。我们的浏览器记录下由解释程序带来的大部分操作(读,写,删除,调用, 定义等),同样作为垃圾收集和源文件加载的事件也会被跟踪。Eval函数触发一 个特定事件的情形和源文件加载的情形是相似的,而经过计算的字符串也将被保 存,并像程序执行时的其他部分一样被追踪分析。已经追踪到的痕迹被压缩并存 储到磁盘中。虽然它在执行时有一些额外的开销,但是我们用来测试的工具在运行交互应用时的速度并没有受到影响,并且我们的用户也没有对性能有任何的抱怨。然后我们在离线状态下分析了这些数据,并将结果存储在一个数据库中进行数据挖掘。离线痕迹分析组件实质上是对抽象流的解释。它是能够重现这些痕迹 的,并为相应的JavaScript程序得出一个关于堆状态的抽象解释。痕迹分析仪中把包括了关于程序动态行为的丰富的和可定制的历史信息,比如访问每个对象的 历史,调用现场和分配网站等等。最后,一些静态分析(EVAL分类,代码大小 的度量)是基于被恢复的源文件运行的,它使用了 Rhino的JavaScript编译器的 框架解析技术。
4、结论
本文提供了第一个大规模的研究JavaScript程序在运行时的行为。我们已经 识别出一组字节代表实际的程序,这组字节的大小范围为数百千字节到兆字节, 我们对每个网站都记录了很多痕迹,然后使用相应的编译仪器与离线分析工具从 痕迹中提取了行为信息。我们使用此信息来评估清单中的9个关于JavaScript程 序的常用假设。
MySQL数据库管理中心外文翻译
数据库(有时拼成database)也称为电子数据库,是指由计算机特别组织的快速查 找和检索的任意的数据或信息集合。数据库与其它数据处理操作协同工作,其结构要有 助于数据的存储、检索、修改和删除。数据库可存储在磁盘或磁带、光盘或某些辅助存 储设备上。
一个数据库由一个文件或文件集合组成。这些文件中的信息可分解成一个个记录, 每个记录有一个或多个域。域是数据库存储的基本单位,每个域一般含有由数据库描述 的属于实体的一个方面或一个特性的信息。用户使用关键字和各种排序命令,能够快速 查找、重排、分组并在查找的许多记录中选择相应的域,获得或建立特定集上的报表。
数据库记录和文件的组织必须确保能对信息进行检索。早期的系统是顺序组织的 (如:字母顺序、数字顺序或时间顺序);直接访问存储设备的研制成功使得通过索引随 机访问数据成为可能。用户检索数据库信息的主要方法是query (查询)。通常情况下, 用户提供一个字符串,计算机在数据库中寻找相应的字符序列,并且给出字符串在何处 出现。比如,用户可以请求所有姓的字段内容中带有Smith的全部记录。
在非结构化的数据库中,按照实体的一个简单列表组织记录;很多个人计算机的简 易数据库是非结构的。层次型数据库按树型组织记录,每一层的记录分解成更小的属性 集。层次型数据库在不同层的记录集之间提供一个单一链接。与此不同,网络型数据库 在不同记录集之间提供多个链接,这是通过设置指向其它记录集的链或指针来实现的。 网络型数据库的速度及多样性使其在企业中得到广泛应用。当文件或记录间的关系不能 用链表达时,使用关系型数据库。一个表或一个“关系”,就是一个简单的非结构列表。 多个关系可通过数学关系提供所需信息。面向对象的数据库存储并处理更复杂的称为对 象的数据结构,可组织成有层次的类,其中的每个类可以继承层次链中更高一级类的特 性,这种数据库结构最灵活,最具适应性。
很多数据库包含自然语言文本信息;小型的数据库可由个人在家中使用。小型及稍 大的数据库在商业领域中占有越来越重要的地位。典型的商业应用包括航班预订、产品 管理、医院的医疗记录以及保险公司的合法记录。最大型的数据库通常用于政府部门、 企业、大专院校等。这些数据库存有诸如摘要、报表、成文的法规、通讯录、报纸、杂 志、百科全书、各式目录等资料。索引数据库包含参考书目或用于找到相关书籍、期刊 及其它参考文献的索引。S前有上万种可公开访问的数据库,内容包罗万象,从法律、 医学、工程到新闻、时事、游戏、分类广告、指南等。科学家、医生、律师、财经分析 师、股票经纪人等专家和各类研究者越来越依赖这些数据库,因为可以利用它从大量的 信息中做快速的查找访问。
数据库管理系统的组织技术
顺序的、直接的以及其他的文件处理方式常用于单
全文共9919字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[14645],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。