Flash/stage3D到HTML5/WebGL的无损转换机制的实现

时间:2022-08-02 01:43:17

摘 要 网络3D化是当前互联网发展的一个新趋势,各种Web前端技术如雨后春笋般涌现。为了应对这种趋势,网络3D霸主Flash推出了Stage3D,WebGL作为新一代的网络3D标准,正在高速的发展道路上。本论文研究和实现了一种Flash/Stage3D到HTML5/WebGL的无损转换机制。

关键词 Web3D;Flash3D;WebGL;编译

中图分类号TP39 文献标识码A 文章编号 1674-6708(2013)102-0199-02

0引言

网络3D化是当前互联网发展的一个新趋势,尤其是近几年来移动互联网的迅猛发展,推动了Web3D技术的革新。当前,在网络上最流行和最被广泛使用的3D技术是Flash3D技术。网上有很多流行的基于Flash的3D引擎,既有商用非开源的,也有免费开源的,没有统一的标准。随着网络3D的发展,Flash适时地推出了新的3D技术——Stage3D。Stage3D不仅采用了最新的渲染技术——可编程渲染管线,而且支持GPU硬件加速技术。然而,Stage3D依然无法改变插件化这个事实。HTML5的出现,让网络3D去插件化得以实现。基于HTML5的WebGL技术,真正做到了无插件,只需浏览器,就可以展示3D模型,甚至是运行大型3D在线游戏。WebGL有望取代Flash的Web3D霸主地位,成为新一代的Web3D标准。

1 WebGL的优势

WebGL是一项新兴的Web前端技术,它是OpenGL和JavaScript的组合,在HTML5的canvas标签上绘制和渲染3D模型。WebGL最大的优势在于它无需插件,依靠浏览器,就能够虚拟出三维世界。WebGL是开源免费的,并且是跨平台,在开源社区的大力支持下,WebGL充满着活力。WebGL是Web上的OpenGL,支持GPU硬件加速技术和可编程Shader,能够高效轻松地渲染和展示3D高级特效。WebGL使用HTML5的canvas标签作为内容的展示舞台,能够方便地嵌入网页,实现了逻辑和UI的剥离。

2无损转换器的设计与实现

Flash/Stage3D的编程实现语言是ActionScript3.0语言,而HTML5/WebGL的编程实现语言是JavaScript语言。这两种编程语言都是基于ECMAScript的编程语言。ECMAScript是一种ECMA-262标准化的脚本程序设计语言,在万维网上被广泛使用。因而,ActionScript3.0和JavaScript是同宗同源的,ActionScript3.0翻译转换成JavaScript是完全可行的。图1是本转换器的基本架构图。

2.1文法分析

2.2 LL(1)分析器

我们采用自上而下的语法分析方法,对任何输入串,试图用一切可能的方法,从文法开始符号出发,自上而下地为输入串建立一颗语法树。

LL (1) 分析器的核心成员将包含产生式,扫描器,终结符,非终结符。一个标准的BNF产生式,其形式如:rule::=expression ,其中rule为产生式的名称,而expression则是这个产生式的具体表现,Rule表示产生式的名称,Expression中存储着具体表现的所有单词。终结符是任意单词串(即不包含空格的)的集合,在一个文法中,终结符只可能出现在任意产生式的右侧,即Expression中。而非终结符为所有在文法产生式左边出现的符号,即所有的可能的Rule。在分析过程中,若遇到非终结符,则意味着将进行新的规约。扫描器为特殊的产生式,它的Rule必定是一个终结符,而它的Expression则为一个正则表达式。扫描器的作用则是当分析器在规约到一个终结符时,为了判断这个字符串是否匹配,那么通过扫描器就可以完成,任意字符串都会通过正则表达式来判断是否匹配。

通过LL(1)分析器的分析,将产生三个符号集合:First集合、Follow集合、Select集合。First集合是任意一个记号最后代表的串中可能在第一个出现的终结符,或者是空串ε。Follow集合是为任意一个记号最后代表的串之后第一个出现的可能的终结符,或者是开始符号。Select集合是一个表格,用来在任意符号遇到任意终结符的时选择不同的产生式。这些符号将在接下来的上下文处理中得到进一步的分析处理,为最终的翻译映射做铺垫。

2.3 上下文相关分析

在文法构造过程,ActionScript3.0的文法包括包文法、类文法、块文法3种。这里的上下文处理指的就是ActionScript3.0文件结构的上下文,我们设计了一个类ASContext来表示这个上下文。ASContext有四个主要的属性:Imports、Predefs、CurrentClass、CurrentFunc。其中,Imports用来保存当前正在分析的Import引用,Predefs用来保存当前分析的预定义,CurrentClass表示当前正在分析的类,而CurrentFunc表示当前正在分析的方法。

上下文相关处理的具体分析如下:

在文件块中,若遇到包块文法的开始,ASContext记录下包块的信息。若遇到包外类的定义,则将CurrentClass设置为此外部类,同时将包外类加入包外类的集合。同时,将所有的Imports和Predefs保存到CurrentClass,并清空这两个集合。

在包块中,若遇到类定义,则将CurrentClass定义为此类,并将包内类设置为此类。同时,将所有的Imports和Predefs保存到当前类,并清空这两个集合。

在上述两者中,若遇到引用和预定义,则在Imports和Predefs中加入匹配得到的引用和预定义。

在类块中,遇到任意方法定义,则根据前方的限定修饰符将方法的公开性设置,设置方法同属性定义。而静态方法的处理方式也与属性一样。只是此时将CurrentFunc设置为当前函数,可以将所有的函数内定义变量进行处理。

由于函数内变量的提升,在进行块级分析的时候,会将读到所有的变量定义加入一个特殊的序列,此序列存储当前函数的所有临时变量。其他的语句则会被按正常序列加入当前的函数。

当分析完成后,上下文对象ASContext保存了一个ActionScript3.0文件的所用信息了。接下来就要进行真正的映射翻译,得到目标代码的中间代码。

2.4 映射翻译

由于ActionScript3.0语言是面向对象(OO)的语言,而JavaScript是解释型语言,非OO语言。然而,JavaScript是函数型语言,简单的说,它的函数即可作为对象来使用,像Java语言一样,它的根对象是Object对象,所有的对象都继承自Object。所以,JavaScript完全可以模拟面向对象。Flash程序需要用到Stage3D库,然而由于Stage3D库是采用自然语言编写的,本转换器无法转换。我们必须对Stage3D库进行对应的JavaScript面向对象模拟化实现。最后,将中间代码生成目标代码。至此,ActionScript3.0语言就被成功翻译成了JavaScript语言了。

4 结论与展望

本论文设计实现了将一门高级语言翻译成另一门高级语言的计算机语言转换器。本转换器已经实现基本的转换功能,然而要将Flash项目完整地转换成WebGL项目,目前还无法成功做到。并且,由于flash内置函数库过于庞大,因而翻译的JavaScript文件通常会遇到一些JavaScript所没有的类型或者函数,这将使得翻译完成的代码终止运行。要避免这样的情况发生,就必须对原有flash的所有库函数进行JavaScript化,这是未来需要完成的任务之一。

WebGL是一项正在发展的新技术,如果能将现有的Flash代码无损地转换成WebGL代码,必将推动WebGL的发展前景。

参考文献

[1]Bar-Hillel Y., Kashier A., and Shamir E.“Machine Translation, chapter Measures of syntactic complexity”[J].John Wiley & Sons,Inc.New York., 1967.

[2]Upadhyaya, M.Engg, J.“Simple calculator compiler using Lex and YACC”.[J] Electronics Computer Technology (ICECT) on International Conference 2011 3rd. v(6) p182-187.

[3]丁文魁,杜淑敏.编译原理和技术.电子工业出版社,2008(1).

[4]朱赵霞.编译器词法分析程序实现探讨.长春工程学院学报:自然科学版,2011(12).

上一篇:Matlab在计算管式反应器最优温度分布中的应用 下一篇:采用NGN技术促进油田通信网络的发展