[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 |-in |-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.(FileInputStream.java: 106)
  at macromedia.asc.embedding.Compiler.createProjector( Unknown Source)
  at macromedia.asc.embedding.Compiler.doCompile(Unknow n Source)
  at macromedia.asc.embedding.Compiler.doCompile(Unknow n 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 = 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 = 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一些吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值