`
prec
  • 浏览: 64623 次
  • 性别: Icon_minigender_1
  • 来自: 互联网
最近访客 更多访客>>
社区版块
存档分类
最新评论

[tamarin系列之3] ASC编译器命令行基础

阅读更多

    1、ASC编译器简介

     avmshell执行了abc文件,并输出结果,后面跟的具体的参数主要是用于输出管理,而编译AS3文件的重任则落在了asc.jar上。     上一次我们提到如何简单地使用asc编译器编译.as文件生成.abc。然而Hello world永远都是那么的简单。

     那么这一节,我们就来重点看看这个 asc编译器。

     源码:flex-sdk/modules/asc/src

     成品:asc.jar

    主要用法和参数,输入java -jar asc.jar回车即可看到:

     asc {-AS3|-ES|-d|-f|-h|-i|-import <filename>|-in <filename>|-m|-p}* filespec     ……     ……

 

     2、制作asc.exe     当然,我们也可以把它制作成可执行的文件

 

     我们首先作一个asc.as,内容如下:

     package     {     import avmplus.System;     var cmdline = "java -jar asc.jar";

     if( System.argv.length > 0 )

        {

         cmdline += " " + System.argv.join( " " );

         }

     System.exec( cmdline );

    }

 

     然后,我们利用asc编译器:

     java -jar asc.jar asc.as回车

    输出   asc.abc, 205 bytes written

    这样,我们可以./avmshell asc.abc来代替java -jar asc.jar,以后就用avmshell来编译和执行文件了。

 

    当然,这样作还是不方便,那么,我们可以这样:

     java -jar asc.jar -exe asc.exe asc.as

     输出    asc.abc, 205 bytes written

    java.io.FileNotFoundException: asc.exe (No such file or directory)

        at java.io.FileInputStream.open(Native Method)

         at java.io.FileInputStream.<init>(FileInputStream.java:106)

         at macromedia.asc.embedding.Compiler.createProjector(Unknown Source)

         at macromedia.asc.embedding.Compiler.doCompile(Unknown Source)

         at macromedia.asc.embedding.Compiler.doCompile(Unknown Source)

         at macromedia.asc.embedding.Main.handleFile(Unknown Source)

        at macromedia.asc.embedding.Main.main(Unknown Source)

  asc.exe, 0 bytes written

 

      提示没有这个文件asc.exe生成失败。这可能是个BUG,呵呵,不过解决这个问题很简单,建立一个空的asc.exe就可以了:   cat /dev/null > asc.exe   然后java -jar asc.jar -exe asc.exe asc.as 输出

 asc.abc, 205 bytes written asc.exe, 213 bytes written

 

  好了,asc.exe生成完毕。这样,我们就可以使用这个asc.exe来代替java -jar asc.jar 了

  当然,在linux下没这么好的待遇,不过有一个asc.sh,就在flex-sdk/modules/asc/bin下

   至于这个神奇的avmplus.System包,它居然能对命令行操作,它的原型是

     public native static function exec(command:String):int

    也就是说他执行的native的本地代码,它脱离了AVM2的平台去执行了已经设计好的本地代码。大家翻开core目录下的任意.cpp和.as代码发现都有大量的native代码出现。

     其实大家在开发的时候,也会主义到,flex基类里也有很多native代码,比如常用的数字转型:Number(expression)。

     这类的本地代码主要安装在解释器内部,如Flash Player 以本机代码的形式实现。

     当然也可以是你自己的avmshell。或者自己的MyFlash Player或本地定制的AIR运行时环境。听到这很令人激动不是么?

     比如制作public native static function alert(text:String):void 在win下来执行

      MessageBoxW(NULL, text->c_str(), L"我的AIR", MB_ICONEXCLAMATION);

    在linux下执行其他的比如QMessageBox等。

 

       当然我们还能制作一些函数调用本地dll等,我们利用这些native代码,可以实现另一个Yahoo ! Widget桌面小件平台运行时环境。     不过大家别激动,关于这些内容,我们在以后的章节会继续详细讨论。

     性子急的朋友,可以现看看tamarine-tracing/shell/SystemClass.cpp

 

3、更复杂的编译:

     1)      -strict  treat undeclared variable and method access as errors

           意思是把没定义的变量和方法一律视为错误

 

     首先,我们还是以之前的demo为例子,只是这次我们加上参数-strict

     java -jar asc.jar -strict hello.as

     输出

     [Compiler] Error #1180: Call to a possibly undefined method print.

    hello.as, Ln 1, Col 1:

    print ("Hello world");

   ^    1 error found

    在编译hello.as时,我们并没有定义print方法,所以使用strict报错

    平时,在编译as文件的时候,一般asc会包含一些内建的方法,所以我们并不需要包含这些文件,但是如果我们使用-strict选项,则必须引用完全。

 

    2)-import <filename> = make the packages in the  specified file available for import

            意思是在指定的文件的packages包内添加import引用

     所以我们可以这样写上面的例子:

     java -jar asc.jar -strict -import ../../tamarin-tracing/core/builtin_full.abc -import ../../tamarin-tracing/shell/shell_full.abc  hello.as

        每一个要import的对象前都要写-import,路径要写对,在本文里,编译和执行的目录相对于tamarin项目是../../。

        输出        hello.abc, 69 bytes written

 

        还记得第一章编译的输出吗?不用-strict的输出是hello.abc, 84 bytes written,。可见,使用-strict后,尺寸缩小了。

                我们再来一个复杂点的例子, Test.as :

        package {

       public class Test {

              public function Test() {

                   trace("hello World");

             }

       }

   }

      编译 java -jar asc.jar Test.as

      却输出: [Compiler] Error #1017: The definition of base class Object was not found.

   Test.as, Ln 1, Col 1:

   package {

   ^ 1 error found

 

   为什么呢,是因为类声明全写为public class Test extend Object因为继承Object所以省略了,但是Object类编译时没有包含进来。

    我们可以 java -jar  asc.jar -import ../../tamarin-tracing/core/builtin_full.abc Test.as

    输出 Test.abc, 182 bytes written

    这个builtin_full.abc是什么呢,它是怎么构建的,答案是tamarin-tracing/core/builtin.py脚本,关于这个脚本,我们以后再详细讨论。

 

    3) -in  <filename> = include the specified filename        (multiple -in arguments allowed)

 

        编译时包含指定文件。允许多个in选项

       这个-in跟-import差不多,但也不完全一样。-import 等于是在package {} 里写import ,而-in是在编译过程中加入主文件的附属文件,即编译多个文件的意思。

 

      比如,再写一个TestImpl.as:

      package com {

         public class TestImpl {

                 public function TestImpl() : void {

                         var test : Test = new Test();

                }

         }

        new TestImpl();

     }

     然后编译这个文件:

 

     从2) 小节已知的知识我们可能要这样输入命令:

     java -jar asc.jar -import ../../tamarin-tracing/core/builtin_full.as -import Test.as TestImpl.as

     执行成功了,输出

     TestImpl.abc, 201 bytes written

    然而,运行它的时候,就出问题了:

         ./avmshell TestImpl.abc

   输出

         VerifyError: Error #1014: Class Test could not be found.

                at TestImpl$iinit()

                 at global$init()

 

    从输出信息来看,是Test类没有找到,但是,我们的确引入了Test.as了阿。

    原因是因为 -in选项,编译的时候并没有让Test.as加入到此次编译过程中,而只是-import了Test.abc,相当于在TestImpl里加了import  com.TestImpl;但Test.as并没有加入到项目中。

     这时,我们应该使用-in选项:

 

        java -jar asc.jar -import ../../tamarin-tracing/core/builtin_full.as  -in Test.as TestImpl.as

        输出

             TestImpl.abc, 384 bytes written

        字节明显比刚才的201 bytes多。

     现在我们执行它:

     ./avmshell TestImpl.abc

        输出

         hello World

 

 4)   -swf  classname,width,height[,fps] = emit a SWF file

      编译成为swf文件,格式为-swf 类名, 宽, 高, [祯率]

         大家记得,还有个mxmlc吧,这个也能编译swf,有什么区别呢?

         我们制作一个文件来测试一下,MyTest.as:

 

package {

   import flash.display.*;

   import flash.text.*;

  public class MyTest extends Sprite {

     public function MyTest() {

       var test:Test = new Test();

      var text = new TextField();

      text.width = 400;

      text.x = 0;

      text.y = 0;

      text.text = 'This is only a Test';

      addChild(text);

    }

   }

 } 我们编译这个文件mxmlc MyTest.as 输出/home/test/dev/tamarin/build/shell/MySprite.swf (856 bytes) 这样就OK了,我们可以用flashplayer测试结果:flex-sdk/in/player/lnx/flashplayer MySprite.swf回车屏幕显示This is only a test,控制台显示hello World 而我们用asc则是(为了方便,我已经不想用../../tamarin-tracing这类path了,直接把常用abc文件copy到当前目录下)

     java -jar asc.jar -import   -swf MyTest,400,300 -import builtin_full.abc -import playerglobal.abc -in Test.as MyTest.as

 输出 MySprite.swf, 830 bytes written

 

测试结果,除了背景色不同外,结果相同。

 关键是mxmlc读取flex-config.xml,而且更重要的是,它自动会寻找Test.as,而asc是不会的。

 

 6) 其他操作    关于其他操作,还请大家去看flex-sdk的源码和tamarin的avmshell项目代码,过后,我们也有详细的讨论,请大家关注 好了,今天的asc命令行编译工具就介绍到这里,接下来的内容,就让我们更深入tamarin一些吧。

分享到:
评论
1 楼 lidezhao07 2010-09-25  
复杂。。。

相关推荐

    Adobe的ActionScript 3编译器对strict mode中的类型标注的诠释

    文章中所做的测试所需要的东西,包括Tamarin、asc.jar、builtin.abc、toplevel.abc等 博文链接:https://rednaxelafx.iteye.com/blog/196278

    PyPI 官网下载 | tamarin-utils-0.14.5.tar.gz

    **PyPI 官网下载 | tamarin-utils-0.14.5.tar.gz** 这个压缩包文件`tamarin-utils-0.14.5.tar.gz`来源于Python的官方软件仓库PyPI(Python Package Index),它是一个包含众多Python库的地方,方便开发者下载和分享...

    redtamarin, 在 命令行/server 端,运行 AS3.zip

    redtamarin, 在 命令行/server 端,运行 AS3 redtamarin简而言之,redtamarin是基于 Tamarin项目( 例如。 Flash Player 虚拟机),并允许在命令行上运行AS3代码。因为Tamarin只支持,( 对象,array,等等 ),...

    tamarin-prover入门级介绍

    Tamarin Prover是一款强大的工具,专门用于形式化分析和验证安全协议的安全性。它由Simon Meier、...在阅读Tamarin的用户手册之前,先通过入门级介绍文档了解其基本概念和操作方法,将为后续的学习打下坚实基础。

    网络安全协议形式化分析验证工具Tamarin的用户手册

    5. **初始示例**:手册通过一个基础的公钥基础设施(PKI)模型,引导用户了解如何在Tamarin中建模加密原语、协议流程以及安全属性。 6. **协议建模**:用户将学习如何模拟协议交互,包括消息的加解密过程,以及如何...

    tamarin-prover:Tamarin证明程序的主要源代码存储库,用于安全协议验证-Verification code source code

    Tamarin证明者资料库 本自述文件描述了Tamarin证明者用于安全协议验证的存储库的组织。 它的目标受众是Tamarin证明者的感兴趣的用户和将来的开发人员。 有关Tamarin证明器的安装和使用说明,请参见手册的第2章: : ...

    PyPI 官网下载 | tamarin-utils-0.15.1.tar.gz

    在云原生环境中,可能还需要掌握Docker、Kubernetes等相关技术,以便将`tamarin-utils`整合到现有的云基础设施中。 总的来说,`tamarin-utils-0.15.1.tar.gz`是Python开发者在处理分布式系统和云原生环境时的一个...

    基于Tamarin的5G AKA协议形式化分析及其改进方法_.pdf

    基于 Tamarin 的 5G AKA 协议形式化分析及其改进方法 本文主要介绍了基于 Tamarin 的 5G AKA 协议形式化分析及其改进方法。在 5G 移动通信网络中,3GPP 组织标准化了 5G AKA 协议,用以身份认证和密钥协商。文章...

    PyPI 官网下载 | tamarin-utils-0.8.5.tar.gz

    `tamarin-utils`正是针对这样的需求而设计的,它提供了一系列与Zookeeper交互的Python接口,使得开发者可以更方便地在Python代码中使用Zookeeper的服务。这包括但不限于创建、删除、更新Zookeeper节点,以及监视节点...

    Python库 | tamarin-utils-0.15.4.tar.gz

    2. **数据处理**:包含了数据清洗、转换、分析的基础功能,适合于处理各种结构化和非结构化数据,帮助开发者快速预处理数据,为后续的数据分析和建模工作打下基础。 3. **网络通信**:提供了HTTP请求、WebSocket...

    tamarin:小而简单的 Ruby Web 服务器

    gem 'tamarin' 然后执行: $ bundle 或者自己安装: $ gem install tamarin 用法 运行服务器: bundle exec ruby lib / tamarin 然后,在其他终端运行: curl http : //localhost :3030 贡献 分叉它( )...

    EMVerify:Tamarin模型和EMV分析

    EM验证 这是EMV标准的模型,是我们IEEE S&P 2021论文EMV标准:Break,Fix,Verify的补充材料。 有关这项工作的详细信息,请访问 。... :GNU脚本,用于生成目标模型并对其进行Tamarin分析。 *.oracle

    Action Script 虚拟机-AVM2 源码

    5. **运行时库**:包含AS3的标准库函数和类,如Array、Date、Math等,这些是开发人员编写AS3应用的基础。 6. **多线程支持**:虽然Flash Player本身不直接支持多线程,但AVM2的源码可能包含多线程相关的实现,用于...

    EMVerify-PAN-routing:Tamarin模型和EMV非接触式分析

    是GNU脚本,用于生成目标模型并对其进行Tamarin分析。 *.oracle是证明支持的*.oracle 。 包含自动生成的目标模型( .spthy )及其证明( .proof )。 以HTML格式显示分析结果。 包含有用的脚本: 是一个Python...

    Tamarin HD Wallpapers Game Theme-crx插件

    语言:English (United States) 包括Tamarin的HD图像动作冒险视频游戏。 对于Banjo Kazooie Donkey Kong和Mario 64的粉丝! 包括Tamarin的高清图像,动作冒险视频游戏。... 3:没有广告或恼人的弹出窗口

Global site tag (gtag.js) - Google Analytics