賴(lài)智超
(中航工業(yè)綜合技術(shù)研究所,北京 100028)
AltaRica語(yǔ)言在安全性仿真分析平臺(tái)中的實(shí)現(xiàn)與應(yīng)用
賴(lài)智超
(中航工業(yè)綜合技術(shù)研究所,北京 100028)
[摘要]通過(guò)分析AltaRica語(yǔ)言的特性,在借鑒了編譯原理相關(guān)理論的基礎(chǔ)上,介紹如何實(shí)現(xiàn)AltaRica語(yǔ)言的編譯解析框架以及在安全性仿真分析平臺(tái)中的應(yīng)用。
[關(guān)鍵詞]AltaRica語(yǔ)言;編譯解析;仿真分析平臺(tái)
[收修訂稿日期] 2015-09-23
AltaRica語(yǔ)言[1]是一種形式化建模語(yǔ)言,被廣泛用于復(fù)雜系統(tǒng)的事件驅(qū)動(dòng)建模中,它的語(yǔ)言特性非常適用于安全性和可靠性分析,因?yàn)榘踩院涂煽啃苑治龅囊粋€(gè)主要目標(biāo)實(shí)際上就是檢測(cè)和量化導(dǎo)致系統(tǒng)從正常狀態(tài)到失效狀態(tài)的事件集合。
AltaRica語(yǔ)言以事件為中心,其語(yǔ)義為:系統(tǒng)通過(guò)一系列的變量來(lái)描述狀態(tài),當(dāng)事件發(fā)生時(shí),系統(tǒng)狀態(tài)會(huì)隨之發(fā)生改變。
安全性仿真分析平臺(tái)是基于模型的安全性和可靠性分析軟件。該平臺(tái)采用AltaRica語(yǔ)言,具有圖形化建模、故障樹(shù)分析、安全性分析、失效模式與影響分析、動(dòng)態(tài)仿真等功能。平臺(tái)統(tǒng)籌考慮適航安全性評(píng)估分析、任務(wù)可靠性評(píng)估、可靠性設(shè)計(jì)權(quán)衡分析等需求,是仿真大平臺(tái)的核心組成部分。
在安全性仿真分析平臺(tái)實(shí)現(xiàn)過(guò)程中,涉及到的多項(xiàng)功能業(yè)務(wù)均與AltaRica腳本緊密關(guān)聯(lián),包括故障樹(shù)的生成、模塊邏輯關(guān)系的描述、故障傳遞的運(yùn)算、仿真計(jì)算分析,因此,實(shí)現(xiàn)該平臺(tái)的首要任務(wù)是完成對(duì)AltaRica語(yǔ)言的編譯解析。
最基本的語(yǔ)言編譯過(guò)程通常包括詞法分析、語(yǔ)法分析、語(yǔ)義分析、生成目標(biāo)代碼,同樣的,AltaRica語(yǔ)言的編譯過(guò)程也是經(jīng)過(guò)了這幾個(gè)階段。首先,AltaRica語(yǔ)言在經(jīng)過(guò)詞法分析和語(yǔ)法分析后,會(huì)首先生成抽象語(yǔ)法樹(shù),生成的抽象語(yǔ)法樹(shù)再經(jīng)過(guò)語(yǔ)義分析生成AltaRica語(yǔ)法樹(shù),最后通過(guò)擴(kuò)展、轉(zhuǎn)換生成中間代碼,整個(gè)過(guò)程如圖1所示。

圖1 編譯解析流程圖
2.1 生成抽象語(yǔ)法樹(shù)
開(kāi)發(fā)一個(gè)AltaRica語(yǔ)法分析器大致分3步,第一步:寫(xiě)出所需要分析的內(nèi)容的文法;第二步:完成針對(duì)該文法的語(yǔ)法分析器的代碼;第三步:編譯語(yǔ)法分析器。
所謂文法,即是一系列的語(yǔ)法規(guī)則,它是由若干定義語(yǔ)法規(guī)則的推導(dǎo)式組成的。通過(guò)簡(jiǎn)單的以AltaRica語(yǔ)言規(guī)范中最基本的條件賦值(Condition)作為例子了解一下文法的表達(dá)。條件賦值是一個(gè)表達(dá)式,它的格式類(lèi)似于 “STATE = WORKING;”。由于在語(yǔ)法分析中一般是用樹(shù)來(lái)表示語(yǔ)法結(jié)構(gòu),表達(dá)式的語(yǔ)法樹(shù)是以操作符為根節(jié)點(diǎn)和操作數(shù)為子節(jié)點(diǎn)的樹(shù)形結(jié)構(gòu)。在安全性仿真分析平臺(tái)項(xiàng)目中,文法定義大致如圖2所示。

圖2 文法定義
文法定義中分2大部分:語(yǔ)法描述和詞法描述。其中每一行都是一個(gè)規(guī)則(rule)或叫做推導(dǎo)式,每個(gè)規(guī)則的左邊是文法中的一個(gè)名字,代表文法中的一個(gè)抽象概念。中間用一個(gè)“:”表示推導(dǎo)關(guān)系,右邊是該名字推導(dǎo)出的文法形式。
語(yǔ)法分析是編譯過(guò)程的第二步,在詞法分析提供的詞號(hào)流的基礎(chǔ)上,對(duì)源代碼的結(jié)構(gòu)做總體的分析。無(wú)論分析的內(nèi)容有多大,語(yǔ)法分析總是由一個(gè)啟始規(guī)則開(kāi)始的,最后總是生成一棵語(yǔ)法樹(shù)。一般情況語(yǔ)法規(guī)則是一個(gè)文法的主體部分,也是編寫(xiě)文法的難點(diǎn)。
安全性仿真分析平臺(tái)采用自頂向下的語(yǔ)法分析方法。自頂向下的分析方法的思路是從起始規(guī)則開(kāi)始選擇對(duì)應(yīng)的規(guī)則反復(fù)推導(dǎo),直到推導(dǎo)出待分析的語(yǔ)型。如果推導(dǎo)失敗則返回選擇其他規(guī)則進(jìn)行推導(dǎo),即回溯,如果所有規(guī)則都失敗則說(shuō)明這個(gè)句型是非法的。AltaRica語(yǔ)言進(jìn)過(guò)語(yǔ)法分析之后,生成抽象語(yǔ)法樹(shù),這棵抽象語(yǔ)法樹(shù)則是進(jìn)行下一步語(yǔ)義分析的基礎(chǔ)。
2.2 語(yǔ)義分析及中間代碼
在完成語(yǔ)法分析階段后,接下來(lái)的目標(biāo)就是通過(guò)遍歷抽象語(yǔ)法樹(shù),完成語(yǔ)義分析并生成中間代碼。
語(yǔ)義分析是編譯過(guò)程的一個(gè)邏輯階段,它的任務(wù)是對(duì)源程序進(jìn)行上下文有關(guān)性質(zhì)的審查和類(lèi)型審查,審查其有無(wú)語(yǔ)義錯(cuò)誤,為代碼生成階段收集類(lèi)型信息。比如審查某個(gè)運(yùn)算符是否具有語(yǔ)言規(guī)范允許的運(yùn)算對(duì)象,當(dāng)不符合語(yǔ)言規(guī)范時(shí),編譯程序應(yīng)報(bào)告錯(cuò)誤。
2.2.1 語(yǔ)義分析
通過(guò)語(yǔ)法分析得出的抽象語(yǔ)法樹(shù),它的某個(gè)節(jié)點(diǎn)在整個(gè)程序上下文的意義是需要經(jīng)過(guò)分析轉(zhuǎn)換得到的,因?yàn)檎Z(yǔ)法分析并未對(duì)一個(gè)源代碼內(nèi)部的邏輯含義加以分析。因此,編譯框架接下來(lái)需要執(zhí)行語(yǔ)義分析,即審查每個(gè)語(yǔ)法成分的靜態(tài)語(yǔ)義。靜態(tài)語(yǔ)義檢查涉及了以下幾個(gè)方面:
● 類(lèi)型檢查,比如某個(gè)操作符的兩個(gè)操作對(duì)象必須類(lèi)型一致。
● 控制流檢查,判斷控制語(yǔ)句的流向是否正確,比如if(…)then(…)else(…)格式語(yǔ)句需要有跳轉(zhuǎn)點(diǎn),否則出錯(cuò)。
● 一致性檢查,比如在相同的作用域里,定義了兩個(gè)同名的標(biāo)識(shí)符,這樣會(huì)造成歧義。
在語(yǔ)義分析階段,通過(guò)遍歷抽象語(yǔ)法樹(shù)進(jìn)行轉(zhuǎn)換,以生成中間代碼。遍歷轉(zhuǎn)換過(guò)程針對(duì)AltaRica語(yǔ)言規(guī)范中的文法規(guī)則來(lái)定義不同類(lèi)型的節(jié)點(diǎn),這些節(jié)點(diǎn)將用來(lái)對(duì)語(yǔ)法樹(shù)節(jié)點(diǎn)進(jìn)行轉(zhuǎn)義吸收,為后續(xù)的語(yǔ)義校驗(yàn)提供基礎(chǔ)。遍歷過(guò)程針對(duì)不同類(lèi)型節(jié)點(diǎn),可分為如下幾類(lèi):
● 定義常量及變量節(jié)點(diǎn)
針對(duì)AltaRica語(yǔ)言規(guī)范定義出整形、浮點(diǎn)、布爾值、字符型、枚舉等常量節(jié)點(diǎn),以及定義出代表系統(tǒng)變量(如系統(tǒng)端口、狀態(tài))的變量節(jié)點(diǎn),這些節(jié)點(diǎn)均繼承自基類(lèi)AltaRicaNodeBase,我們稱(chēng)之為AltaRica節(jié)點(diǎn)。在遍歷到該類(lèi)型的語(yǔ)法樹(shù)節(jié)點(diǎn)時(shí),進(jìn)行轉(zhuǎn)義吸收。如圖3所示,AltaRica節(jié)點(diǎn)派生出各種類(lèi)型的常量和變量節(jié)點(diǎn)。

圖3 AltaRica節(jié)點(diǎn)
● 定義邏輯操作符節(jié)點(diǎn)
它代表的是與操作符、或操作符、非操作符等。比如,當(dāng)代表一個(gè)或門(mén)的AltaRica節(jié)點(diǎn)出現(xiàn)時(shí),在語(yǔ)義分析階段,會(huì)把它轉(zhuǎn)義為或操作符,同時(shí)遍歷該AltaRica節(jié)點(diǎn)的所有孩子作為操作對(duì)象,并同時(shí)分析孩子的類(lèi)型是否匹配。如圖4所示。

圖4 邏輯操作符節(jié)點(diǎn)
● 定義運(yùn)算操作符節(jié)點(diǎn)
它代表的是常見(jiàn)的加、減、乘、除、比較等操作符。其中,比較運(yùn)算符又細(xì)分為小于、小于等于、大于、大于等于、相等、不等操作符。
● 定義函數(shù)節(jié)點(diǎn)
它代表一些自定義的常用的函數(shù)。所有符合ANTLR函數(shù)規(guī)則文法的表達(dá)式,均會(huì)被語(yǔ)法分析器解析成函數(shù),但是符合規(guī)則的這些函數(shù)其語(yǔ)義需要在函數(shù)節(jié)點(diǎn)中重新定義,賦予其真正的含義。比如Max函數(shù),它在語(yǔ)法樹(shù)中,只能被告知這是一個(gè)函數(shù)節(jié)點(diǎn),只有在語(yǔ)義解析階段,才給它定義功能為:這是一個(gè)二元及以上運(yùn)算操作的函數(shù),必須包含兩個(gè)及兩個(gè)以上的運(yùn)算對(duì)象,其計(jì)算結(jié)果是取所有運(yùn)算對(duì)象中值最大的那個(gè)。函數(shù)節(jié)點(diǎn)的定義如圖5所示。
在遍歷抽象語(yǔ)法樹(shù)時(shí),會(huì)根據(jù)不同的類(lèi)型,執(zhí)行不同類(lèi)型節(jié)點(diǎn)的轉(zhuǎn)義操作,在遍歷完抽象語(yǔ)法樹(shù)之后,AltaRica代碼的文法定義也就都經(jīng)過(guò)了語(yǔ)義分析,具備了屬于其自身的含義,這時(shí),將生成另外一棵樹(shù):AltaRica語(yǔ)法樹(shù),這時(shí),它的節(jié)點(diǎn)已經(jīng)具備了上下文關(guān)系。利用AltaRica語(yǔ)法樹(shù)可以在接下來(lái)的語(yǔ)義校驗(yàn)過(guò)程中,很方便地識(shí)別某個(gè)節(jié)點(diǎn)的身份含義,從而判斷某些節(jié)點(diǎn)是否存在語(yǔ)法錯(cuò)誤。
在校驗(yàn)階段,其實(shí)就是對(duì)AltaRica語(yǔ)法樹(shù)的節(jié)點(diǎn)進(jìn)行語(yǔ)法檢查的一個(gè)過(guò)程。還是以Max函數(shù)為例,如果有一個(gè)函數(shù)被描述為Max(A,B),在AltaRica語(yǔ)法樹(shù)中,它的結(jié)構(gòu)應(yīng)該是如6所示的。

圖5 函數(shù)節(jié)點(diǎn)的定義

圖6 語(yǔ)法樹(shù)結(jié)構(gòu)示例
在執(zhí)行到Max節(jié)點(diǎn)的語(yǔ)法檢查時(shí),會(huì)同時(shí)啟動(dòng)對(duì)孩子節(jié)點(diǎn)的檢查,如果發(fā)現(xiàn)孩子節(jié)點(diǎn)少于兩個(gè)時(shí),會(huì)報(bào)“函數(shù)定義不合法”的錯(cuò)誤。
在安全性仿真分析平臺(tái)中,定義了信號(hào)流(Flow)和斷言(Assert),它們的文法如圖2所示。
假設(shè)有下面這樣一段代碼:
flow
A:bool: in;
B:bool: in;
X:bool: out;
assert
X = if ((A=false) and (B=false)) then false else true;
它表示有A、B、X 3個(gè)布爾型的變量,X為輸出端口,A、B為輸入端口,這句斷言的語(yǔ)義是“當(dāng)輸入端口A和B的取值同時(shí)為false的時(shí)候,輸出端口X取值為false,否則為true”。上面的代碼將會(huì)被編譯成如圖7這樣的AltaRica語(yǔ)法樹(shù)結(jié)構(gòu)。

圖7 斷言在AltaRica語(yǔ)法樹(shù)中的結(jié)構(gòu)
生成中間代碼,是在AltaRica語(yǔ)法樹(shù)的基礎(chǔ)上,擴(kuò)展出一套符合AltaRica運(yùn)算法則的方法。基于前面生成的AltaRica語(yǔ)法樹(shù),在它上面掛載一些系統(tǒng)的業(yè)務(wù)功能比如邏輯關(guān)系運(yùn)算、仿真計(jì)算、故障傳遞等接口,使它可以在中間代碼解析執(zhí)行引擎執(zhí)行相應(yīng)的功能。
2.2.3 中間代碼解析執(zhí)行引擎
中間代碼必須在經(jīng)過(guò)加載、初始化、解析等階段才能被使用。在編譯解析框架中實(shí)現(xiàn)了一個(gè)中間代碼解析執(zhí)行引擎,就是做這部分工作。
在中間代碼解析執(zhí)行引擎的內(nèi)部維護(hù)了一個(gè)狀態(tài)機(jī),當(dāng)中間代碼被加載時(shí),狀態(tài)機(jī)會(huì)開(kāi)辟出包括變量區(qū)、操作數(shù)棧、棧信息區(qū)等區(qū)域。
變量區(qū):是一組變量值的存儲(chǔ)空間,用于存放在AltaRica代碼中定義的各種變量,在安全性仿真分析平臺(tái)中,這個(gè)區(qū)域一般是存放系統(tǒng)狀態(tài)值、端口的狀態(tài)值以及其他系統(tǒng)配置參數(shù)。
操作數(shù)棧:是用來(lái)存放操作數(shù)的棧結(jié)構(gòu),當(dāng)一個(gè)方法剛開(kāi)始執(zhí)行的時(shí)候,這個(gè)方法的操作數(shù)棧是空的,在方法的執(zhí)行過(guò)程中,會(huì)有指令向操作數(shù)棧中寫(xiě)入和提取內(nèi)容,也就是入棧和出棧的操作。
棧信息區(qū):主要用于存儲(chǔ)操作數(shù)棧的一些基本信息,包括方法返回的地址、臨時(shí)變量的地址、回調(diào)方法的地址等等。
?數(shù)據(jù)來(lái)自 Schenk C.R.,“The Origins of the Eurodollar Market in London:1955 ~ 1963”,Explorations in Economic History,2004,35(2),pp.221 ~238.
在中間代碼加載完畢之后,會(huì)進(jìn)行初始化工作,首先把AltaRica代碼中定義的變量初始化進(jìn)變量區(qū),然后在棧信息區(qū)里存儲(chǔ)各種函數(shù)調(diào)用關(guān)系。
初始化工作完成后,便可以執(zhí)行各種需要的運(yùn)算工作,比如項(xiàng)目執(zhí)行仿真計(jì)算或者故障推進(jìn)演算等等,都是在這個(gè)時(shí)期進(jìn)行的。
當(dāng)運(yùn)算工作結(jié)束,可以主動(dòng)調(diào)用狀態(tài)機(jī)去釋放內(nèi)存,或者等待系統(tǒng)在注銷(xiāo)狀態(tài)機(jī)時(shí)自動(dòng)釋放,完成垃圾回收工作。
2.2.4 中間代碼優(yōu)化
所謂代碼優(yōu)化,是在不改變程序運(yùn)行效果的前提下,對(duì)被編譯的程序進(jìn)行等價(jià)變化,以生成更加高效的目標(biāo)代碼。代碼優(yōu)化的級(jí)別一般分為3種:局部?jī)?yōu)化、循環(huán)優(yōu)化、全局優(yōu)化。由于AltaRica語(yǔ)言的特性,循環(huán)操作強(qiáng)度不大,而且代碼量不會(huì)非常龐大,做循環(huán)優(yōu)化和全局優(yōu)化的意義并不大,所以目前這套解析框架只實(shí)現(xiàn)了局部?jī)?yōu)化。
局部?jī)?yōu)化的第一步是劃分基本塊,一個(gè)基本塊內(nèi)的語(yǔ)句是沒(méi)有跳轉(zhuǎn)及分叉匯合的,比如,在安全性仿真分析平臺(tái)中常用到的影響(Effect),它的格式是Effect:= Assert1; Assert2;… .,它可以包含N個(gè)斷言(Assert),而Assert的格式則是這樣的X:= If(邏輯語(yǔ)句 A)then true else false;那么,在劃分基本塊時(shí),會(huì)自頂向下進(jìn)行劃分,一直到邏輯語(yǔ)句A時(shí),把它劃分為一個(gè)基本塊。
這時(shí)進(jìn)行第二步:基本塊處理。基本塊處理主要是進(jìn)行轉(zhuǎn)移分析,凡是控制流不可到達(dá)的語(yǔ)句,直接忽略處理,比如,邏輯語(yǔ)句A的內(nèi)容恒真,則它永遠(yuǎn)不會(huì)到達(dá)else那部分邏輯處理,可以將else部分直接忽略處理。除此之外,基本塊處理還會(huì)進(jìn)行變量分析,比如,對(duì)于已定義卻從未在語(yǔ)句中使用過(guò)的變量,會(huì)直接剔除掉。在經(jīng)過(guò)局部?jī)?yōu)化之后,生成的AltaRica語(yǔ)法樹(shù)會(huì)較未優(yōu)化之前的要小。
在安全性仿真分析平臺(tái)中,有相當(dāng)多的地方使用到了AltaRica語(yǔ)言,整個(gè)系統(tǒng)與AltaRica語(yǔ)言可謂是緊密相連,在系統(tǒng)的諸多功能中,AltaRica語(yǔ)言扮演了重要的角色,它既是參與模塊信息存儲(chǔ)的一份子,也是故障樹(shù)的前身;既是邏輯關(guān)系運(yùn)算的載體,也是仿真計(jì)算的主角。下面介紹一下AltaRica語(yǔ)言在仿真計(jì)算中的應(yīng)用。
首先,仿真計(jì)算中關(guān)鍵的一步就是,如何計(jì)算出一個(gè)信號(hào)的流入或者系統(tǒng)自身狀態(tài)的改變,會(huì)影響系統(tǒng)自身的輸出。這個(gè)計(jì)算的依據(jù),就是存儲(chǔ)在模型設(shè)計(jì)時(shí)用于描述系統(tǒng)模塊狀態(tài)變化的邏輯關(guān)系,而邏輯關(guān)系則直接由AltaRica腳本編寫(xiě),所以,仿真計(jì)算的這一步,其實(shí)最終就是簡(jiǎn)化為對(duì)AltaRica腳本的編譯計(jì)算,這樣,就可以根據(jù)邏輯關(guān)系的推演計(jì)算結(jié)果得到仿真計(jì)算的結(jié)果。
假設(shè),在模型設(shè)計(jì)時(shí),有如圖8的模型關(guān)系。

圖8 模型示例
其中,模型b12的邏輯關(guān)系如圖9所示。

圖9 模型b12的邏輯關(guān)系
它對(duì)應(yīng)的AltaRica代碼如下:
o := if((狀態(tài)1=失效) or ((i=故障) and (i1=故障))) then 故障 else 正常;
這段代碼的語(yǔ)義是:“當(dāng)自身的某個(gè)狀態(tài)1是失效,或者當(dāng)兩個(gè)輸入端口信號(hào)同時(shí)均為故障時(shí),輸出信號(hào)為故障,否則輸出信號(hào)為正常”。
這段代碼經(jīng)過(guò)編譯解析框架的編譯之后,其AltaRica語(yǔ)法樹(shù)如圖10所示。
生成中間代碼后,即可用于仿真計(jì)算,比如,系統(tǒng)b10和系統(tǒng)b11的輸出均為故障信號(hào),則系統(tǒng)b12的兩個(gè)輸入端口均接收到該故障信號(hào),這時(shí),針對(duì)系統(tǒng)b12的輸出計(jì)算,就是把故障信號(hào)作為參數(shù)傳遞給中間代碼,在解析執(zhí)行引擎中,會(huì)把這段邏輯關(guān)系執(zhí)行運(yùn)算,得出系統(tǒng)b12的輸出端口的值,即推算出了系統(tǒng)b12的輸出結(jié)果,從而達(dá)到仿真計(jì)算的目的。

圖10 編譯后的語(yǔ)法樹(shù)內(nèi)容
本文從應(yīng)用需求的角度出發(fā),提出了一種解決AltaRica語(yǔ)言的編譯解析的方法,借鑒于一般的編譯原理方式,解決了AltaRica語(yǔ)言的詞法分析、語(yǔ)法分析、語(yǔ)義分析等編譯任務(wù),并建立了一套可擴(kuò)展的編譯解析框架,在后期中間代碼生成階段,也充分考慮到了業(yè)務(wù)的可擴(kuò)展性,能夠在未來(lái)可以實(shí)現(xiàn)插件的方式來(lái)注入自定義的一些功能。
這套編譯解析框架雖然很好地解決了AltaRica語(yǔ)言的編譯需求,整個(gè)設(shè)計(jì)非常的簡(jiǎn)潔統(tǒng)一,但是在對(duì)AltaRica語(yǔ)言進(jìn)行詞法分析、語(yǔ)法分析時(shí),生成的抽象語(yǔ)法樹(shù)有些龐大,希望后續(xù)的研究中能對(duì)其進(jìn)行改進(jìn)優(yōu)化,以提升整個(gè)編譯解析框架的執(zhí)行效率。
[參考文獻(xiàn)]
[1] Antoine B. Rauzy. AltaRica Data-Flow Language Specification –Version 2.1[EB/OL] . http://www.lix.polytechnique.fr/~rauzy/altarica/.
[2] T. Prosvirnova & Antoine B. Rauzy. AltaRica 3.0 project : compile Guarded Transition Systems into Fault Trees[EB/OL] . http://www.lix.polytechnique.fr/~prosvirnova/.
(編輯:勞邊)
[中圖分類(lèi)號(hào)]TP391
[文獻(xiàn)標(biāo)識(shí)碼]C
[文章編號(hào)]1003–6660(2015)06–0037–05
[DOI編碼]10.13237/j.cnki.asq.2015.06.009