吳華,李湉,張世貴,李心靈,楊滔
(1.中國航發成都發動機有限公司,成都 610503;2.西南石油大學機電工程學院, 成都 610500)
為了實現我國由制造大國向制造強國的轉變,云制造、智能制造等先進的制造模式相繼被提出[1-3]。它們是面向產品全生命周期的數字化、網絡化、智能化制造系統。要實現這些先進的制造模式,實現產品信息建模方法標準化是十分重要的基礎性研究之一[4]。
產品模型數據交互規范(Standard for the Exchange of Product Model Data,STEP)是國際標準化組織(ISO)制定的描述整個產品生命周期內產品信息的標準,它提供了一種獨立于任何特定系統、能夠描述產品數據的中性機制[5]。
EXPRESS語言是產品描述性語言,不是一種實現語言,因此需要通過語言映射來實現對產品信息模型的利用。已有映射研究中,周受欽[4]認為要完成集成CAD系統的信息,EXPRESS與應用開發語言C++/Java之間映射關系是基礎,并簡述了映射的兩個關鍵點,數據類型的映射和數據關系的映射。趙繼政[6]認為EXPRESS語言和Java語言存在描述能力和計算能力的對比差距,但EXPRESS作為一種描述性語言,并不具備計算能力。此外,由于未建立一般的映射方法,部分研究者存在映射不正確、不準確、不完整的情況(例如:EXPRESS的REAL數據類型不需要考慮精度的問題; 未定義表達式及關鍵操作符如:=:、IN、LIKE等)。這使得在面向大量的EXPRESS描述的產品信息模型,實現映射的通用性、正確性難以保證。大多數CAx系統采用的是C/S模式,研究映射的目標語言多為C++語言。相比EXPRESS語言到C++語言的映射研究[7-10],建立EXPRESS到Java的映射研究較少[11]。要加快STEP的產品信息模型的快速應用,對于采用Java語言用于開發的研究者來說,建立一種通用性強的EXPRESS到Java的映射方法是必要的。
EXPRESS語言符合傳統設計語言,又在此基礎上吸收了面向對象的技術特性,這使其兼具了較強的語言表達力和描述優勢。EXPRESS語言對Java語言的映射可實施性較強,總體的映射復雜度相對較小。
本文在總結EXPRESS和Java的特點的基礎上,將映射方法分類為一致映射、簡易映射、預定義映射、功能改進映射、功能置換映射。依據上述具體情況說明所對應的映射方法,將EXPRESS語言的所有元素依據層級關系建立了到Java映射的總體框架,如圖1所示。

圖1 EXPRESS到Java映射總體框架
EXPRESS中的SCHEMA與Java中的包package進行簡易映射,映射方法和總體框架的關鍵內容映射在后文做進一步說明。
EXPRESS語言的數據類型有簡單數據類型、聚合數據類型、命名數據類型、構造數據類型、廣義數據類型。大部分簡單數據類型和聚合數據類型的定義于與Java語言常見數據類型是一致的,但在相對復雜的數據類型有較大差距,如表1所示。

表1 數據類型的映射表
2.1.1 簡單數據類型
簡單數據類型有數字型(NUMBER)、實型(REAL)、整型(INTEGER)、字符串型(STRING)、布爾型(BOOLEAN)、邏輯型(LOGICAL)和二進制型(BINARY)。Java中存在雙精度浮點數double、整數類型int、字符串類型String、布爾類型boolean、enum(自定義)、二進制數類型byte與之映射。
2.1.2 聚合數據類型
聚合數據類型包括數組(ARRAY)、列表(LIST)、包(BAG)和集合(SET)。除BAG以外,在Java中存在Arrays類、ArrayList類、Set類與之映射。前兩者為簡易映射,只是聲明的關鍵詞不同,后者的SET聲明的關鍵詞相同,因此是一致映射。由于Java中不存在與BAG功能相近的類,需要預定義映射。BAG數據結構的特點是:1)允許出現重復的元素;2)元素的集合是一個無序的集合;3)包內的元素數量是可變的。
2.1.3 命名數據類型
命名數據類型是指那些可以在形式化規范中說明的數據類型,是EXPRESS語言最基本、最重要的元素,包括實體數據類型和定義數據類型。
實體數據類型需用戶賦值一個實體標識符,通過該標識符實現引用。實體映射的關鍵點有屬性、局部規則、子類和超類和抽象實體數據類型等。
1)屬性。屬性在EXPRESS語言中是描述實體的本質特征、特點和特性,這與Java中用成員變量描述實例的狀態是類似的。屬性主要分為顯示屬性、導出屬性和反向屬性。盡管ENTITY數據類型的屬性與Java類的成員變量有共同之處,但在導出屬性和反向屬性上仍然需要功能置換映射,其映射到Java屬性的處理過程及示例如表2所示。

表2 屬性映射表
屬性映射過程中,需要注意的是導出屬性需定義導出函數,并將該函數放置于構造函數與相關屬性的set函數中的尾部。從而達到EXPRESS導出屬性的功能。
2)局部規則。局部規則分為唯一性規則和定義域規則。唯一性規則在所給實體數據類型的所有實例之間控制屬性值的唯一性。定義域規則對給定實體數據類型的每個實例的屬性值或這些值之間的其他約束條件進行描述。
唯一性規則的映射為功能置換映射。主要是約束實體的所有實例的某個屬性的值不能相等,在Java中不存在約束成員變量的值唯一性的規則,因此需要功能置換映射。具體實現方法是先定義一個與約束規則對應的類變量的數組,以及監測該數組是否有重復元素的唯一性函數。唯一性函數要求放置于構造函數和相關屬性的set函數中的尾部。當數組有重復的值,唯一性函數將會有提示,從而實現唯一性規則。
定義域規則的映射也為功能置換映射,需要定義一個私有變量作為是否滿足定義域規則的狀態變量,同時需要定義一個定義域函數來判斷屬性是否屬于定義域內,若不在定義域內,則提示。與唯一性規則一樣,定義域函數應放置于構造函數和相關屬性的set函數中的尾部。
3)其它。子類與超類:EXPRESS的子類與超類與Java是一致的,是簡易映射。EXPRESS 通過SUPERTYPE、和SUBTYPE的關鍵字進行超類和子類的聲明,Java則采用extends關鍵字。EXPRESS的子類和超類聲明在ENTITY和ENDENTITY之間,而Java則在類定義的頭部。
抽象實體數據類型:EXPRESS允許聲明不能直接被實例化而僅可通過其子類實例化的ENTITY數據類型-抽象實體數據類型。這與Java的抽象類的功能是一致的,可以通過抽象類的方法簡易映射達到抽象實體數據類型的功能。
定義數據類型的映射:定義數據類型是定義某個數據類型的變量聲明操作,可與Java中變量和類實例的初始化映射。
表達式由操作符、操作數及函數調用組合而成,并且要對它們進行運算以產生一個結果值。EXPRESS語言對操作符進行了定義并規定了與每一種操作符一起使用的操作數的數據類型,實現操作符的優先級映射和操作符的映射亦是模式映射的主要內容之一。
EXPRESS語言的操作運算符分為組件引用、一元操作符、取冪運算、乘法/除法運算、加法/減法運算、關系運算,共6個優先級。Java語言的操作符分為后綴、一元、乘性、加性、移位、關系、相等、按位與、按位異或、按位或、邏輯與、邏輯或、條件、賦值、逗號,共15個優先級。映射過程中,有以下3個注意點:
1)在Java中取冪、實例比較、成員操作、相似操作符在Java中沒有直接操作符與之對應,因此需要一定的處理以完成映射。對于取冪運算,采用Math.pow進行替代,對于實例比較、相似操作、賦值操作符的功能則需自定義映射,在Java中設計全局靜態函數實現其功能。
2)在映射過程中,部分操作符的優先級順序發生改變。例如或運算符及異或運算符的優先級低于了等號運算符和不等號運算符。又如取冪函數Math.pow的優先級上升到最高的0優先級。對于運算優先級上的改變,本文的解決方案是對于映射過程中只要存在運算符是帶有下劃線的操作符,一律加花括號( ),以保證運算先后順序的正確性。
3)當操作符是同一優先級別時,就需要考慮操作符的結合性,EXPRESS語言一律采用從左至右,部分操作符與Java操作符不同,這也影響這運算的順序。為了保證映射正確性,同樣采用花括號( )避免映射結合性的秩序問題。
此外,EXPRESS語言操作符中還存在實例比較、成員操作、相似操作三種操作符,需要在Java中預定義映射。實例比較操作符的映射:數字型、邏輯型、字符串型、二進制型及枚舉數據類型的實例比較,等價于對應的值比較操作符。因此Java映射對于上述類型采用值比較操作符進行返還結果值。EXPRESS的聚合實例和實體實例的比較操作符,需定義對應功能的全局靜態函數實現自定義映射。
成員操作符的映射:成員操作符的功能主要是判斷某個元素是否存在于某個聚合數據類型中,為真則返還TRUE,否則返還FALSE。實現方法同實例比較操作符。相似比較符的映射:相似比較符用于兩字符串的匹配。如果對應的任何字符不存在,則匹配失敗,結果為FALSE,匹配成功返還TRUE。在Java存在Pattern類可以實現這個匹配功能。
現有一個EXPRESS模式,SCHEMA s。有4個實體數據類型:person、teacher、student、graduate。person實體含有屬性身份證ss_no(整型)、出生日期date(日期型)、編號id(String字符串型)。teacher實體繼承了person,將person中的id重寫為INTEGER整型,同時有定義域約束年齡小于21。student實體繼承person,定義域約束年齡大于5,選的課程需為定義的course枚舉數據類型的范圍中。graduate實體繼承student和teacher,定義域約束GRAD LEVEL IN teachers。定義course枚舉數據類型。利用上述映射方法,從EXPRESS模式到Java模式的映射結果如圖2所示。

圖 2 EXPRESS模式到Java模式的映射
本文將映射方法總結并歸類為一致映射、簡易映射、預定義映射、功能改進映射和功能置換映射,構建了從EXPRESS語言到Java語言的總體框架。詳細論述了EXPRESS的數據類型、表達式等元素到Java的映射具體實現方法。依據該一般化映射方法實現了對SCHEMA s的EXPRESS模式到Java模式的映射。文中建立的一般化映射方法,適用于STEP標準中EXPRESS語言描述的信息模型的Java映射。大量現有的信息模型標準知識,為基于Java語言開發的CAD、CAPP、STEP-NC等系統提供了可借鑒的標準。