基于html5的移动端宝石碰碰游戏的设计与实现外文翻译资料

 2022-05-15 10:05

英语原文共 18 页,剩余内容已隐藏,支付完成后下载完整资料


摘要. JavaScript是Web浏览器的主要脚本语言,对于现在Web应用程序看来说,它是必不可少的。程序员已经开始使用它来编写复杂的应用程序,但在开发过程中仍然没有可用的工具支持。

我们提供了一个静态的程序分析基础设施,可以使用抽象解释来推断JavaScript程序详细和健全的类型信息。该分析旨在支持ECMAScript标准中定义的完整语言,包括其特有的对象模型和所有内置函数。该分析结果可以用来检测常见的编程错误,或者说,证明他们不存在,并且用于产生用于程序理解的类型信息。

在真实JavaScript代码上进行的初步实验表明,该方法在构成大部分JavaScript应用程序的中小型程序的分析精度方面很有前途。有了进一步改进的潜力,我们建议将分析作为构建可帮助JavaScript程序员的工具的基础。

1.介绍

1995年,Netscape宣布JavaScript为“易于使用的对象脚本语言,旨在创建链接对象的实时在线应用程序和客服端和服务器端的资源”[25]。从那时起,它已经成为在Web浏览器客户端脚本的标准,但许多其他应用程序也还包括一个JavaScript引擎。这种普遍性导致开发人员用为脚本设想的语言编写大型程序,但是JavaScript不适合大型编程。因此,急需一种工具支持来调试和维护这些程序。

声音编程工具的发展不仅仅是检查单纯的语法属性,还需要某种程序分析。特别是,类型分析对于捕捉表示错误是至关重要的,例如,在工程开发的早期阶段,用字符串或者布尔函数混淆数字。类型分析对于程序员来说是一个有价值的工具,因为它完全排除了这类编程错误。

将类型分析用于JavaScript是一件微妙的事情,因为像大多数其他脚本语言一样,JavaScript有一个弱的,动态的输入规则,通过静默类型转换解决了许多表示不匹配问题。如JavaScript支持对象,头等函数和异常,跟踪数据流和控制流是很重要的。而且,JavaScript的特性带来了许多挑战,使它与大多数其他编程语言不同:

-JavaScript是一种基于对象的语言,它使用原型对象来建模继承。几乎所有预定义的操作都是通过原型来访问对象,分析必须精确地模拟这些对象。

-对象是从字符串(属性名称)到值的映射。通常,可以在执行过程中添加和删除属性,并可以动态计算属性名称。

-未定义的结果,如访问某个对象的不存在属性,由未定义的特定值undefined表示,但缺少某个属性的对象和一个拥有此属性,但赋值为undefined的对象存在细微的区别。

-除去少数例外情况,值可以自由地由一种类型转换为另一种类型。事实上,只有少数的几种情况下自动转换不可使用:null和undefined不能转换为对象,只有函数值可以作为函数调用。一些自动转换不直观,程序员应该注意它们。

-JavaScript区分原始值和包装过的原始值,在某些情况下,它们会表现出微妙的差异。

-变量可以通过简单的复制来创建,不需要显示声明,但是尝试读取缺少的变量会导致运行时错误,JavaScript的with语法打破了普通的词法作用域柜子,所以即使解析变量名也是一项重要的任务。

-对象的属性可以具有自己的属性,比如ReadOnly。这些属性不能被程序改变,但必须在分析时考虑到这些属性以保持稳定性和精确性。

-可以使用可变数量的参数创建和调用函数。

- 函数对象用作具有细微差异行为的头等函数,方法和构造函数。 分析必须将这些用途分开并检测初始化模式。

-使用eval函数,动态构造的字符串可以解释为程序片段并在当前作用域内执行。

-该语言包含在运行时系统的实现中规定特定结构(全局对象,激活对象,参数对象)的功能。 这些结构必须在分析中建模以获得足够的精度。

本文报告了用于整个JavaScript语言的程序分析器的设计和实现。原则上,该分析器的设计是使用单调框架的抽象解释的应用[9,21]。然而,前文介绍的挑战导致了一个复杂的晶格结构,这构成了我们分析的基础,从一个简单的类型网格开始,网格在由小的测试用例观察到缺少精度驱动的多个步骤中演变而来。由于晶格包含精确的单态值,分析器复制了JavaScript解释器的大量功能,包括实现预定义的功能,高校的对晶格的元素进行操作是另一个重要的挑战,

分析仪针对由几千行代码组成的手写程序。我们猜想大多数现有的JavaScript程序都适用于该类别。

分析的一个关键要求是健全性。虽然最近其他语言的几个错误查找工具牺牲了健全性已获得更少的报错,但是健全性使我们的分析能够保证不存在某些错误。而且,分析是完全自动的,它既不需要程序注释也不需要正式的说明。

虽然一些编程错误会导致抛出异常,但其他错误会被动态类型转换和未定义的值所覆盖。其中一些转换看起来不直观,但在某些情况下是有意义的,一些程序员可能故意利用这种行为,所以没有明确定义构成“错误”的是什么。不过,我们选择吸引程序员注意这种潜在的错误。 这些情况包括:

1.调用非函数值(例如未定义)作为函数,

2.读取不存在的变量,

3.访问null或undefined的属性,

4.读取对象不存在的属性,

5.写入永远不会读取的变量或对象属性,

6.将原始值隐式转换为对象(例如,原始值false可以转换为布尔对象,然后将其转换为原始值导致true,这对于许多JavaScript程序员来说是意外的),

7.隐式地将undefined转换为一个数字(这会产生NaN,这在算术运算中经常触发不希望的行为),

8.将函数对象既作为函数又作为构造函数(即可能忘记新的)或者传递具有不同类型的函数参数(例如在一个地方传递一个数字而另一个地方传递一个字符串或没有值),

9.调用带有无效参数数量的内置函数(这可能会导致运行时错误,与用户定义函数的情况不同)或使用意外类型的参数(例如,apply函数的第二个参数必须是数组)。

如果上面列表中前三个所关注的操作被执行,会导致运行时错误(异常),因此这些警告的优先级高于其他警告。在许多情况下,分析器会将警告报告为一个明确的错误而不是潜在的错误。例如,分析器可能会检测到属性读取操作始终会导致undefined,因为给定的属性从不存在,在这种情况下,该特定警告会获得高优先级。由于分析是合理的,没有错误和警告可以保证相关操作不会失败。分析其还可以检测死代码。

下面的小而复杂的程序展示了一种使用JavaScript的原型机制来建模继承的方法:

function Person(n) {
this.setName(n);
Person.prototype.count ;
}
Person.prototype.count = 0;
Person.prototype.setName = function(n) { this.name = n; }
function Student(n,s) {
this.b = Person;
this.b(n);
delete this.b;
this.studentid = s.toString();
}
Student.prototype = new Person;

这段代码使用构造函数Person和Student定义了两个类,Person有一个静态字段count和一个方法setName。Student继承了count属性和setName方法并定义了一个额外的studentid字段。在Student中定义b并调用超类构造函数Person,然后删除b。一个小的测试用例说明了它的的行为:

var t = 100026.0;

var x = new Student('Joe Average', t );

var y = new Student('John Doe', t);

y.setName('John Q. Doe');

assert(x.name === 'Joe Average');

assert(y.name === 'John Q. Doe');

assert(y.studentid === '100027');

assert(x.count == 3);

即使是像这样的小程序,很多事情都可能出错 - 记住上面讨论的不同错误 - 但我们的分析能够证明这里没有错误发生。 由于JavaScript的宽容特性,错误可能仅表现为神秘的未定义值。 简单的错误,如在一个地方拼错原型或名称,或者写入toString而不是toString(),都会被静态类型分析检测到,而不会在运行时导致失败。 通过分析产生的警告信息可以帮助程序员不仅及早发现错误,而且能够明确原因。

贡献

这项工作是迈向成熟的JavaScript程序分析器的第一步,该分析器可以集成到IDE中,以提供即时错误检测以及支持自动完成和文档提示。它着重于JavaScript版本1.5,与ECMAScript第3版[11]相对应,该版本是目前使用最广泛的该语言版本,并且是即将到来的JavaScript语言版本的子集。总之,本文的贡献是下列:

- 我们基于抽象解释为JavaScript定义了一种类型分析[9]。它的主要贡献是设计了一种符合语言特性的复杂晶格结构。我们根据现有技术设计分析,特别是新近抽象[3]。

- 我们描述了我们的分析原型实现,该实现涵盖了ECMAScript标准[11]中指定的完整JavaScript语言,并且报告了关于实际基准程序的初步实验,并测量了所使用的各种分析技术的有效性。

- 我们确定进一步提高分析精度和速度的机会,并讨论分析技术的其他应用潜力。

有关该项目的更多信息可在此线获取

http://www.brics.dk/TAJS

2.相关工作

目前的工作建立在大量的抽象解释工作和经验之上,并从软编码系统和动态编码系统的工作中获得灵感。 主要新颖之处在于它结合了已知技术的方式,从而构建了第一个全面实施高精度JavaScript程序分析器的方法。 因此它构成了进一步研究这一新领域技术适用性的基础。

杜比[10]解释了脚本语言的程序分析需求,以支持IDE的交互式完成和错误检测功能。 他勾画了WALA框架的设计[13],这是一个适用于各种语言(包括Java,JavaScript,Python和PHP)的适应性程序分析框架。 虽然我们的第一个原型是基于WALA框架的一部分,但我们发现JavaScript语言的特性需要比WALA设计中预期的更为激进的变化。

Eclipse包含JSDT [7],主要侧重于提供即时文档,并提供常用编程和文档模式以及一些重构操作的许多快捷方式。 它还具有一些未指定类型的原型感知流分析功能,可预测对象类型,从而实现对属性名称的原始完成。 JSEclipse [1]是另一个Eclipse插件,其中包含有关一些流行JavaScript框架的内置知识,并使用Rhino JavaScript引擎运行部分代码以改进对代码完成的支持。 这些插件都不能针对意外转换或上面讨论的其他错误生成警告。

脚本语言的程序分析已经从早期的动态类型语言类型分析(如Scheme和Smalltalk)开始发展[6,31,16]。 这些作品已经阐明了需要一个涉及联合类型和递归类型的类型结构。 他们发出警告并在无法进行类型检查的程序中插入动态测试。 MrSpidey [14]是一个基于流程的实现这些想法与关于在编程环境中的检查位置的视觉反馈。 相比之下,我们的分析仅报告警告,因为检查的有用性在弱类型设置中不明确。

Thiemann的JavaScript程序的编码框架[30]激发了目前工作的抽象领域的设计。 这项工作专注于设计和健全性证明,但不提供编码算法。 在后来的工作中,Heidegger和Thiemann [17]提出了一种基于新近型的JavaScript核心语言类型系统,展示了它的可靠性证明,绘制了推理算法,并论证了这个概念的有用性。

Anderson等人[2]基于一个确定存在的概念和对象中潜在的缺乏属性,给出了一个带有JavaScript原语子集的推理算法的类型系统。 他们的系统不能模拟类型的变化,而且在新近性系统中,属性的存在与不存在之间的转换比较难以预测。

urr等[15]开发了一种类型化的Ruby语言,这是一种脚本语言,其功能与JavaScript非常相似。 他们的方法要求程序员为库函数提供类型注释。 然后他们采用标准约束求解技术来推断用户定义函数的类型。 支持通用类型和交集类型(用于模型重载),但这些类型只能被声明,而不能被推断。 他们的目的是为了简化,以保持精确性,以保持类型语言的可管理性,而我们的设计旨在提高精度。 他们的论文很好地概述了为Ruby和Python等脚本语言编码的更加实用的方法。

类似的技术已被Marlow和Wadler [24]以及Nystruml;om[27]应用于Erlang语言。 这些想法已被Lindahl和Sagonas的一个实用工具扩展和实施[23]。 他们的工作建立在成功典型上,这一概念似乎与抽象解释密切相关。

一个专门为JavaScript开发的程序分析器是指向分析[20]。 分析的目标不是程序理解,而是启用程序优化。 本文表明,分析结果可以消除部分冗余。 分析是流程和上下

全文共20799字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[12369],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。