Ryan, go ahead...

宠辱不惊,静观庭前花开花落;去留无意,漫随天外云卷云舒。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

X++语言参考(2)

Posted on 2008-09-08 18:02  Ryanwhang  阅读(2700)  评论(1编辑  收藏  举报

3.2 MorphX 

Axapta有一个叫作MorphX的内建的集成开发环境(IDE). 该IDE存在于系统中是为了方便开发新的部分和扩展已有的应用程序. MorphX有一个编辑器, 可以处理X++代码. MorphX的核心部分是前面提到的应用程序对象树(AOT). 下面的截图展示应用程序对象的树结构:

应用程序对象树

 

AOT是Axapta环境中用于当前用户的各种对象的表征.. AOT不包含对象实例. 新的类和方法是通过AOT定义的. 类的声明和方法并不是定义在同一单元里, 这和Java不一样. 在这种情况下, 类和成员字段定义在一个节点里(父节点), 方法定义在其他节点里(子节点).

 

3.3 X++ 

在Axapta系统中, X++语言被开发者用来实现商业应用程序. X++在扩展应用程序语言(XAL)中有它的根源. XAL是集成在Concorde System中. 它们分别演化成X++和Axapta系统. 不要将X++和SuperX++混为一谈, 尽管SuperX++有时也称为X++.

3.4 X++编译器

这部分的目标是提供一个编译过程的简介和编译器的概况.

程序由一系列包含待编译的源代码的编译单元组成. 对于X++来说, 这些编译单元不是像Java和C++那样的源文件,而是存储在AOD中的文本文件. 编译器将编译单元转换成中间字节码, 这些字节码会在Axapta系统里的虚拟机里执行. 在Axapta系统里, 执行X++字节码的虚拟机专门为X++语言而设计. X++编译器是Axapta系统的集成部分之一, 它不能用作独立的应用程序, 比如说, 命令行编译器. 编译过程是在MorphX中进行的.

 

解析器(Parser), 静态语义检查(Static Semantic Checker)和代码生成器(Code Generator)之间并没有明显界限. 这些功能都并在单一的连贯单元里. 扫描器(Scanner)不是编译器的前端, 萃取器(Extractor)提取字符, 然后送入扫描器. 由于编译器和Axapta系统紧密集成在一起, 传统的符号表(Symbol Table)就不需要在解析器中维护了. 取而代之的是, 使用的信息来自于AOD和AOT. 确切的实现不便展示.

3.5 Runtime Environment 

 

为了理解X++语言, 抽象理解运行时环境是必要的. X++运行时并没有具体文档. 下面将简单描述一下X++运行时环境的几个方面.

 

在Axapta系统3层拓扑架构中, AOSserver维护多个客户端. 由此推断, 运行时环境执行多个线程. 然而, 据应用程序程序员觉察, 只有一个线程在执行. 运行时环境为每一个登录的用户分配一个线程. 因此, 对于应用程序程序员不需要线程同步. 客户端不会调用同步方法.

 

X++解释器(AOS)为每个线程分配一个固定大小为100的调用栈. 这是从XAL环境集成下来的. 如果调用深度超过100, 运行时环境将会以栈溢出而崩溃.

 

创建持久类实例是不可能的, 它们只有当Axapta系统运行是才存在. Axapta系统依赖于从SQL数据库查询或更新而来的数据. 运行时环境为数据库事务提供内部支持. 有一个系统称作事务跟踪系统(TTS), 它用来支持数据库事务这个概念. 根据以前的统计, 在Axapta系统中, 80%的等待时间开销是等待数据库服务的. 因此, 运行时性能被认为足够快了.

 

第4章 程序框图和语法结构

 

首先, 直观上, X++非常像Java或C#. 它是面向对象的, 并且句法上, 语句以分号结尾. 然而, 它们还是有很大的不同. 除开面向对象语言外, X++直接支持关系查询. 它可以对似SQL结构的语句进行编译并做类型检查. 语法和语义大体类似Java和C#, 但也有很多方面不同.

 

4.1 语法

语法定义X++的句法结构. 解析器生成器使用语法来创建一个解析器. 解析器生成器专门为X++而设计. (语法参见附录). 语法仅仅在句法上表达一个正确的程序的外形,并不定义语义上的正确性. 该语法被规范设计, 并且有很多特性, 这些特性, 特别是和关系数据库交互的select语句, 在当前流行的编程语言中找不到, 像C++, Java, C#等.

 

该语法的大部分定义大概类似于合法程序的集合, 像Java或C#的语法. 然而, 在语义上有很大不同. 例如, i++结构就在X++和Java里不同.

Java  x++   // 表达式

X++  i++   // 语句

例 4-1

这就暗示了X++语义不想象的大相径庭. 后面我们会在讨论一些不同点. 

 

该语法通过了测试, 是专门为解释器生成器说设计. 因此, 对于读者来说有点琐碎. 基于这个原因, 本报告中的语法被重写, 以提高可读性. 本报告中语法是以正规式表示的. 每个正规式是一个非终端符号或终端符号, 其中, 非终端符号又可展开成一系列正规式. 在语法正规式中, 非终端符号以斜体自出现, 而终端符号以等宽字体表示. 此外, 脚注"opt"用来暗示可选符号.

 

4.2 注释

编译单元由2部分组成: 在编译器中生成合适的字节码的源代码和对源代码进行说明的注释. X++注释有2中方式, 跟C#和Java一样, 称为单行注释和多行注释. 多行注释在X++中可嵌套.

// 这是单行注释 

/* 第一行注释 

   第二行注释 

    /* 

     嵌套多行注释 

    */ 

   第三行注释 

*/ 

 

注释会在词法分析中过滤掉而不会被编译, 因此它们不会对程序执行造成影响.

 

4.3 Hello world 

要介绍编程语言, 当然是"hello world"程序了. 学习新的编程语言, 打印一个简单字符串到屏幕, 这对于程序员来说再熟悉不过了. 这里有一个用X++写的"hello world"程序. 首先, 启动MorphX环境, 打开AOT, 右键点击Classes, 然后创建一个新的定义

class HelloWorld 
{ 

 4-2 "hello world"程序的类定义

当创建完一个类定义, 右键点击该类, 创建一个新的方法如下

void HelloWorld() 

    print "Hello World"; 

    pause; 

 4-3 "hello world"程序的方法定义

创建一个新的"job" -- 找到"Jobs"结点, 右键点击"Jobs", 创建新"job", 定义如下:

static void HelloWorldJob (Args _args) 

HelloWorld hw = new HelloWorld(); 

hw.HelloWorld(); 

 4-4 "hello world" job程序

由此, "hello world"程序有3部分组成: 类定义, 类的方法定义和一个标准的job程序. Job程序用来创建类实例, 并调用类的方法.

 

4.4 作用域 

X++中的作用域规则几乎和Java一样. 唯一的区别就是没有屏蔽. 如果一个变量声明在内部作用域, 同时外部作用域也有一个相同名字的变量, 那么就会产生一个语义错误.

 

4.5 关键字和保留字

 

4.5.1 关键字

X++中的关键字是一个保留的字符串. 该字符串有特殊的意义, 不能用作标识符. X++语言定义如表 4.5.1的关键字.

4.5.2 内建方法和固有方法 

X++定义了一系列内建方法和固有方法. 内建方法类似于库, 固有方法是在编译时调用和执行的.

内建和固有方法的名字被认为是半保留的. 这意味着, 变量, 类名和嵌套方法等不能和内建方法和固有方法同名.

4.5.2.1里的名字是内建方法. 表4.5.2.2里的名字是固有方法.