zoukankan      html  css  js  c++  java
  • Moscrif(Mobile SCRipting Framework)技术概览

    Moscrif是一种针对移动应用程序开发的跨平台解决方案。它让你可以为智能手机、平板电脑和桌面电脑创建本地的应用和游戏。

    现在,它已经支持iPhone、iPad、Android智能手机和平板电脑,并且还会不断增加对新设备的支持。不久之后也会支持桌面操作系统,像 Windows和Mac OS,这样即便是最古老的学校中的PC用户也可以运行Moscrif应用程序。因为Moscrif让开发者可以只使用一种代码库,所以就不需要为所有需要 的移动操作系统迁移应用程序。一旦开发完成,你的应用就会像在本地编写的那样执行和表现。

    Moscrif基于强大的JavaScript引擎构建,它让你可以快速开发,同时保持高质量和高性能。你不需要针对每种平台分别使用C、C++、 Objective C和Java来编写本地代码。只要了解流行的JavaScript就足够了,其他工作交给Moscrif就好。

    收益

    使用Moscrif编程只需要一位程序员,他会自动覆盖所有支持的平台。这意味着一位程序员能够在很短的时间内生成更多的应用程序,而不会降低质 量。这会在人力资源、资金和时间上都会节省很多,因为和支持多个平台相比,只维护一套代码会节省很多成本。有了当前的支持,你可以接触到80%的移动市 场,这让你可以接触到相当多移动用户。

    Moscrif可以用于构建交互性的2D游戏,而对业务应用的支持也在日程上了。框架提供了对图形、音频和音乐、网络、加密、本地数据库、访问文件系统、使用传感器的支持,并且带有成熟的2D游戏程序库(Box2D)。

    Moscrif SDK包含了独立的集成环境(IDE),不需要像针对Eclipse的Android开发工具那样需要安装额外的框架或者SDK,或者任何第三方的工具。 Moscrif让开发者可以专注于开发,而不需要迁移和维护很多分支,这有助于让我们的开发更有效、更有生产力,并且可以部署在所有移动操作系统上。

    Moscrif核心

    Moscrif包含编译器、解析器、解释器和虚拟机。编译器和解析器都使用C和C++从头编写。编译器会编译输入的源代码,生成比特码。比特码和虚 拟机被设计为运行在性能不太高的移动设备上。在发布过程中只会编译一次。虚拟机主要包括带有垃圾回收器的解释器。在Moscrif中没有JIT编译,原因 之一是iOS中禁用了可写和可执行的内存区。Moscrif的垃圾回收器使用了停止并复制(stop-and-copy)技术。解释器和虚拟机是针对每种 要支持的平台使用C/C++编写的。

    用来编码的语言是JavaScript,针对对象编程做了一些修改,并扩展了一些额外的特性,比方说:

          ●    带有继承的类
               class Parent {
                     // 构造程序
                     function this(defaultVal = “default”) {
                             this._prop1 = defaultVal;
                     }
                     // 方法
                     function reset() {
                             this._prop1 = “”;
                     }
                     // 属性
                     property prop1(v) {
                             get { return this._prop1; }
                             set { this._prop1 = v; }
                     }
               }
               class Child : Parent {
                    // 你可以重写成员
                    function this() {
                             super(“childDefaultVal”);
                             this._prop2 = “test”;
                    }
                    function reset() {
                             super.reset();
                             this._prop2 = “”;
                    }
                    // 等等…
               }
          ●    构造器类
               class GameMenu : Scene {
                    function this() {
                    }
               }
          ●    读/写、只读、只写类属性(getter和setter)
               class Foo {
                    function this() {
                             this._prop1 = 123;
                    }
                    // 读/写属性
                    property prop1(v) {
                             get { return this._prop1; }
                             set { this._prop1 = v; }
                    }
                    // 只读
                    property prop2(v) {
                             get return (this._prop1|| “”) + “.postfix”;
                    }
                    // 只写属性
                    property prop3(v) {
                             set {
                                   if (v !== null)
                                            this._prop1 = v;
                             }
                    }
               }
          ●    Lambda函数
               function doOperation(operation, arg1, arg2) {
                  return operation(arg1, arg2);
               }
    
               // 一般函数
               var add = function(a, b) {
                  return a + b;
               }
               console << doOperation(add, 10, 20) << "\n";
               // 输出: 30
    
               // 匿名lambda
               console << doOperation(function(a, b) { return a - b; }, 100, 10) << "\n";                  
               // 输出: 90
    
               // lambda函数块
               console << doOperation(:a, b { return a * b; }, 10, 10) << "\n";
               // 输出: 100
    
               // lambda声明函数块
               console << doOperation(: a, b : a / b, 33, 3) << "\n";
               // 输出: 11
    
          ●    命名空间
          ●对整数和实数的的支持
          var r1 = 10 / 3;
          console << "type=" << typeof(r1) << ", value=" << r1 << "\n";
          // 输出 type=integer, value=3
    
          var r2 = 10 % 3;
          console << "type=" << typeof(r2) << ", value=" << r2 << "\n";
          // 输出 type=integer, value=3
    
          var r3 = 10 / 3.;
          console << "type=" << typeof(r3) << ", value=" << r3 << "\n";
          // 输出 type=integer, value=3
    
          ●    可选函数参数
               function func(arg, arg2 = "abc", arg3 = 123)
               {
                 console << arg << ", " << arg2 << ", " << arg3 << "\n";
               }
    
               //func();
               // 输出: 错误: 参数数量错误
    
               func("param1");
               // 输出: param1, abc, 123
    
               func("param1");
               // 输出: param1, def, 123
    
               func("param1");
               // 输出: param1, def, 456
          ●    迭代器和装饰器
               // 装饰器 '@returns' —— 对函数返回值的验证
               function @returns(func, return_type)
               {
                 return function(params..)
               {
                  var rv = func.apply(this,params);
                  if( typeof rv != return_type )
                      throw String.printf("expected to return %s but got %s\n", return_type, typeof rv);
                  return rv;
                }
               }
    
               @returns #integer
               function add(a, b)
               {
                 return a + b;
               }
    
               console << add(10, 20) << "\n";
               // 输出: 30
    
               console << add(10, "20") << "\n";
               // 输出(异常): 期望返回整型但得到了字符串
          ●    其他内容请见 Moscrif Basics

    Moscrif使用经过修改的JavaScript,它更方便进行移动开发。之所以选用JavaScript,是因为它非常易于学习,并且大多数开 发者(特别是web开发者)已经很熟悉。为了让我们使用先进的OOP方法,他们对JavaScript做出扩展,增加了基本的面向对象特性,像第一层级类 (first tier classes)等。

    IDE和发布工具

    Moscrif SDK还包含了集成开发环境和用于发布本地应用程序安装文件的工具,它可以在各种应用程序市场或者业务环境中上传。我们多次听说过: 你为什么决定开发自定义的IDE? 为什么不使用Eclipse、NetBeans或者Visual Studio呢? 我们认为对很多开发者有很多IDE。很多开发者喜欢Eclipse,但是还有很多喜欢Visual Studio而不喜欢Eclipse,这使得这样的工具很难被所有开发者所接受。我们还认为移动开发应该更快,并被简化,所以我们决定开发一种专注于移动 开发的简单IDE。这个IDE的设置面板看起来会是这样:

    (点击图像可以放大)

    Moscrif的IDE使用.NET和Gtk#从头开发。这让你可以在所有主要的桌面操作系统(Windows、Mac和Linux)上运行这个 IDE。在Mac OS和Linux上需要安装Mono。IDE继承了所有基本特性,从创建项目、文本编辑,一直到发布过程。在项目设置之后,发布安装包很简单,不需要安装 任何其他开发工具(像Android开发工具),也不需要把项目发送到构建服务器。

    发布工具大部分是使用Moscrif编写的,使用了移动平台SDK的一些核心二进制代码。为了成功地把应用程序发布到iOS设备商,需要Mac OS以及Xcode中的Organizer。

    发布工具会调用编译器,从而把源代码编译成相应的比特码。除了比特码之外,最终的发布包还会包含额外的应用程序资源,像图像、声音、音乐、文本等, 以及虚拟机和解释器的二进制文件。当要把包放在移动商店中的时候,发布工具会创建并签署包含一系列打包文件的单一文件,并把它发布到构建服务器来签名。代 码和资源不会发送到服务器,它会保留在开发者的计算机上。只有在开发者想要把应用程序发布到Google play、Apple应用商店、三星应用商店等的时候,才需要这个在Moscrif服务器上签名的过程。

    本地类和框架

    基础类和设备特性类都是使用C/C++/Objective-c/Java本地编写的。它们被称为“本地类”,但是作为脚本类暴露给了开发者。所以,当开发者创建Sensor类的时候,它实际上是创建并使用本地类Sensor。有以下几种本地的基础和高级类:

    • 类似JavaScript的类(Math、Array、Strings等)
    • 系统、文件系统、流
    • SQLite、Crypto、Web、Facebook
    • 渲染(OpenGL)和高级图形(Paints、Shaders、Vectores等)
    • 媒体、传感器
    • AdMob、iAd、InApp (针对Apple应用商店和Google Play)
    • 基于视图的一系列类,用于应用程序开发(View、ScrollView、TextView等)
    • 等等…

    所有这些类都是本地编写的。脚本开发者会像一般的脚本类那样使用它们。它不需要了解低级语言,像C、C++或者Objective-C。本地类是 Moscrif脚本编写的类的基础。这组类被叫做框架。例如,Game2D框架是用Moscrif的JavaScript编写的,是用内建的本地类,像 Windows(主应用程序窗口)、Bitmap、Canvas、Paint、Shader(用于Sprite类和高级绘图)等等。大多数Game2D类 都使用脚本编写。动画、变换、粒子系统完全是是用Moscrif's脚本编写的。不需要本地开发。

    例如: Bitmap是一种本地编写的类。脚本程序员可以像通常那样使用它:

    var bitmap = Bitmap.fromFile(“path_to_bitmap”);

    框架会使用一系列本地和(或)其他框架类来定义新的和高级的类。例如:

    include "lib://core/log.ms"
    include "lib://game2d/game.ms"
    
    // 自定义脚本类
    class FrameworkSprite
    {
      // Bitmap是本地类
      var box = Bitmap.fromFile("app://gfx/sprite.png");
      function this(x, y)
      {
         this._x = x;
         this._y = y;
      }
      function draw(canvas)
      {
         canvas.drawBitmap(box, this._x, this._y);
      }
    }
    class TestGame : Game
    {
      function start()
      {
         super.start();
         this._sprite = new FrameworkSprite(100, 100);
      }
      function draw(canvas)
      {
         super.draw(canvas);
         this._sprite.draw(canvas);
      }
    }
    
    // 创建实例并运行游戏
    new TestGame().run();

    应用程序框架使用了一系列与游戏框架不同的本地类,这个框架目前还处于beta阶段。因为并非所有本地组件都已经实现,所以框架使用皮肤和主题来模 拟本地行为。这意味着我们可以拥有看起来像Windows Phone App的应用(Metro UI或者Modern UI),而运行在Android和iOS上。这种方式也非常适合高度商标化的业务应用。

    他们计划允许对Moscrif进行扩展,增加自定义的本地编写的类,这意味着开发者有可能会创建自己的本地类。他们将可以扩展预定义的本地类,并 (或者)创建新的类。另外,他们也可能会创建完整的本地应用程序或者游戏,只在某些部分使用Moscrif: 例如,创建带有本地UI控件(分别针对Android和苹果的设备)的本地应用,但是把业务逻辑放在脚本中(来支持跨平台)。这会通过NDK(本地开发工 具)完成,计划会在不久的将来实现(2013年的第一季度)。NDK还会为脚本程序员提供本地控件,让应用程序的开发集成底层系统,但需要付出跨平台的代 价。

    关于作者

    Jozef Pridavok是Moscrif的CEO,该家公司创建了Moscrif SDK——当前市场上针对移动开发最有效的解决方案。Jozef拥有10年的软件开发经验。在创立Mothiva之前,Jozef创建了叫做 Inlogic软件的公司——专注于创建移动应用程序和游戏的开发工作室。

    Jozef对移动技术和软件开发都有独到的眼光和极大的热情,相信为智能手机和平板电脑构建软件可以比现在更加吸引人、更简单、更有趣、更享受。

    查看英文原文:A Technical Overview of Moscrif – MObile SCRipting Framework

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/daly2008/p/2844022.html
Copyright © 2011-2022 走看看