Ryan, go ahead...

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

公告

2008年9月8日

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里的名字是固有方法.

posted @ 2008-09-08 18:02 Ryanwhang 阅读(1019) 评论(1) 编辑

2008年9月4日

第1章 简介

这份报告是在哥本哈根IT大学2004年的一个为期4周的项目的总结. 这个项目源自同微软商务解决方案Microsoft Business Solution(Vedbaek, Danmark)的合作. 它是一个初级项目, 作为一个硕士论文的准备, 目的是建立一个对领域特征语言X++详尽的理解.

X++是一个专门为Axapta产品所设计的面向对象语言, 包含处理数据库查询的内建结构. 这份报告主要任务是描述X++的语法和语义, 它的大纲是模仿Java Precisely(一个简明的Java编程语言的描述), 适合熟悉编程语言以及语法语义和编译器解释器的关系有所了解的读者.

这些公开的章节将提供一些细节, 这些细节是关于研究问题域和Axapta架构的描述的方法论.如果熟悉Axapta系统将会增强理解X++中某些组成的效果. 在依次深入研究该语言每种结构之前, 我们会先概览一下X++的基本概念. 这些基本概念包括程序框图, 命名规则, 保留字, 数据类型, 类, 接口, 表达式和语句. 本报告将会以X++语言的建议和往后发展的可能性作为结束.

我们要向来自微软商务解决方案的Luis Mourâo, Laurent Ricci, Anna Lomova,

Peter Villadsen和Michael Fruergaard Pontoppidan表示感谢, 他们提供了支持,领导及提供环境. 同时也要感谢Peter Sestoft和Martin Elsman以及他们自始至终的帮助和合作.

第2章 目标定义和方法论

2.1 目标定义

本项目的目标是为将来的X++语言新的编译器的开发打个基础. 为了成功设计和实现一个已定制编程语言的编译器, 深入理解该语言的语法和语义是必要的. 这个问题域可分解成2部分:

X++的语法

X++的语义

2.2 方法论 

贯穿本报告中的许多实例都是同Java语言来比较的. 这是因为Java语言在IT界是广为人知的, 并且是精心制定的同时X++和Java在许多特征上相似. 其它相关的编程语言在需要会被提及.

 

我们可以在一个叫做Job的小程序中测试X++代码. 这些小程序是在Application Object Tree (AOT)下Jobs节点里创建, 并且类似Java中执行static main方法. 这允许一些小段代码在这里测试分析. 这就是用来做测试和表述X++语言的方法论.

static void Job1(Args _args) 

实例 2-1 

第3章 Axapta

根据文档, Axapta是一款设计成具有高度灵活性, 高性能和高度可扩展性的Enterprise  Resource Planning (ERP)系统. 这一部分将简述Axapta的部署架构, 集成开发环境(IDE) Morphx, X++语言, 编译器和运行时环境.

3.1部署架构  

Axapta系统的功能是由许多组件组成的. 因为这些组件部署在应用程序架构中的, 在讨论应用程序架构之前, 我们将依次了解它们. 

关系数据库: 在表中存储所有商业数据. 一张表对应一种类型数据, 比如Customers, Suppliers, Products和Orders. (这通常成为SQL数据库)

 

应用程序对象数据(AOD): 这是一系列保存X++源代码, 对象bytecode和元数据的文件.

应用程序对象服务器(AOS): 这是Axapta的运行时环境. X++ bytecode将在AOS中执行.

应用程序对象树(AOT): 应用程序对象树为应用程序中包括开发工具等所有对象提供一个图形化的界面. 这些都是Axapta对象集合的子集: Classes,

Macros, Forms, Reports, Queries, Jobs, Menus和Tables.

这些要素大多数可部署在当前很流行的两种商业应用程序架构上. 它们分别被称作2-tier和3-tier. 我们将会简要概览一下这两种结构.

3.1.1 2层架构

2层架构有2个核心组件组成, 分别称为client和SQL database. 如下图所示的拓扑结构, 用户接口和应用程序逻辑在同一平台上. Client维护X++ bytecode的运行时环境(AOS)和应用程序对象数据(AOD). 所有计算都在client端. Client端直接在SQL Database里查找更新数据.

SQL database server 

应用程序: AOS 位于client

3.1.2 3层架构 

3层架构将应用程序逻辑拆分开来单独做成一层. AOS从而成为一个执行X++ bytecode服务器. 应用程序逻辑由AOS提供给所有用户. SQL database保持不变. Client在这种情况下可再分为2种: "瘦"客户端和"胖"客户端.

"瘦"客户端(Thin Clients)有关应用程序对象的用户界面, 比如窗体,和报表, 都运行在客户端机器上.

"胖"客户端(Fat Clients):  AOSAOD运行在本地机器.  其他的应用程序对象, 例如queries, classes, 和其它应用程序逻辑可在客户端机器上执行. ("胖"客户端又被称作Intelligent Axapta Clients (IAC))

"胖"客户端有2个运行时环境: server AOS (AOSserver )local AOS (AOSclient ). X++语言提供指明bytecode应在哪一层执行的结构. 程序员所写X++源代码会保存在AODclient文件中, 它们必须和AOSserver同步, 以保证该应用程序逻辑能被其他用户使用. 综上所述, Axapta的部署结构的类型对应用程序编程者来说是显而易见的.

posted @ 2008-09-04 19:59 Ryanwhang 阅读(782) 评论(0) 编辑

X++语言参考 -- 目录

第1章 简介

第2章 目标定义和方法论

     2.1 目标定义

     2.2 方法论

第3章 Axapta

     3.1 部署架构

          3.1.1 2层架构

          3.1.2 3层架构

     3.2 MorphX

     3.3 X++

     3.4 X++编译器

     3.5 运行时环境

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

     4.1 语法

     4.2 注释

     4.3 Hello world

     4.4 作用域

     4.5 关键字和保留字

          4.5.1 关键字

          4.5.2 内建方法和固有方法

第5章 命名和保留字

     5.1 命名规则

第6章 数据类型

     6.1 变量声明的语法

     6.2 原始类型

          6.2.1 Boolean

     6.3 Integer

     6.4 Real

     6.5 Date

     6.6 TimeOfDay

     6.7 Enumeration

     6.8 Strings

     6.9 Anytype

     6.10 原始类型总结

     6.11 组合类型

     6.12 参考类型

     6.13 Arrays

     6.14 Containers

     6.15 Tables

第7章 类

     7.1 类的声明和类体

     7.2 顶级类,内嵌类,成员类和局部类

     7.3 类修饰符

     7.4 子类,超类,类的层次,继承和覆盖

     7.5 类的字段声明

     7.6 方法声明

     7.7 构造函数

第8章 接口

第9章 表达式

     9.1 算术表达式(+, -, *, /, DIV, MOD)

     9.2 字符串连接(+)

     9.3 逻辑表达式(||, &&, !)

     9.4 关系表达式(<, <=, ==, LIKE, >=, >)

     9.5 位操作(~, ^, &, |)

     9.6 条件表达式

     9.7 方法调用

          9.7.1 非静态方法调用

          9.7.2 静态方法调用

          9.7.3 内部/内建/固有方法调用

     9.8 对象创建表达式

     9.9 访问字段和方法

     9.10 常量

     9.11 Select 表达式

     9.12 X++和Java表达式的不同

第10章 语句

     10.1 复合语句

     10.2 While, do while 和if 语句

     10.3 For语句

     10.4 Switch语句

     10.5 Pause语句

     10.6 Window语句

     10.7 Break和continue语句

     10.8 Breakpoint语句

     10.9 Print语句

     10.10 Return语句

     10.11 Throw语句

     10.12 Try语句

     10.13 Retry语句

     10.14 Select语句

          10.14.1 Select forupdate

     10.15 While select语句

     10.16 Update_recordset语句

     10.17 Insert_recordset语句

     10.18 赋值语句

     10.19 Flush语句和tablelock语句

     10.20 Changecompany语句和changesite语句

     10.21 Transaction语句

第11章 宏

第12章 改进X++的建议

     12.1 标准OO语言设计

     12.2 类型系统

     12.3 表达式,语句和异常处理

     12.4 内建函数

第13章 未来工作

第14章 附录A - 异常现象

     14.1 命名和保留字

     14.2 数据类型

     14.3 

     14.4 接口

     14.5 表达式

     14.6 语句

第15章 附录B - 语法

posted @ 2008-09-04 09:50 Ryanwhang 阅读(466) 评论(1) 编辑

2008年9月3日

在未来一周内翻译完《X++ Language Description》,名字姑且定为《X++语言参考》吧。-- 工作有点忙, 现在看来一周是完不成了, 还是每天都翻一点,希望能尽早完成.

接下来,一点一点啃Dynamics Ax开发系列,5个系列5周完成吧(有点慢)。

看看<Inside Dynamics AX> 和<Quality Assurance for Dynamics AX Based ERP Solutions>, 有机会翻译后者.

会每天研究Microsoft Dynamics AX...

计划每天都做笔记,晚上整理总结一下,更新到blog上。

posted @ 2008-09-03 20:25 Ryanwhang 阅读(136) 评论(3) 编辑

    只有注册用户登录后才能阅读该文。阅读全文

posted @ 2008-09-03 19:56 Ryanwhang 阅读(61) 评论(6) 编辑