两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

關(guān)于Lyee指向軟件的靜態(tài)分析方法

文檔序號:6419737閱讀:579來源:國知局
專利名稱:關(guān)于Lyee指向軟件的靜態(tài)分析方法
技術(shù)領(lǐng)域
本發(fā)明涉及對于例如無論業(yè)務(wù)用·個(gè)人用等的用途、商業(yè)應(yīng)用·游戲等的種類·內(nèi)容、軟件單體·電氣化產(chǎn)品ROM插入等的形態(tài)、所有用途、種類·內(nèi)容、形態(tài)中的軟件都能使用的軟件分析方法,特別涉及關(guān)于Lyee(注冊商標(biāo)。以下相同)指向軟件的靜態(tài)分析方法。
背景技術(shù)
軟件開發(fā)與維護(hù)成為我們經(jīng)濟(jì)中具有主要地重要性的活動(dòng)。在計(jì)算機(jī)被廣泛應(yīng)用的情況下,這種活動(dòng)在生產(chǎn)事業(yè)中涉及很廣的范圍。
每年為開發(fā)·維護(hù)軟件都耗費(fèi)數(shù)千億美元的巨額資金。今天,軟件開發(fā)領(lǐng)域的參與者彼此的競爭比以前更加激烈。為了在該競爭生存,這些參與者(公司)必須最大限度地保持生產(chǎn)經(jīng)營的效率,使費(fèi)用保持在最小限度。他們還必須按時(shí)交出具有高質(zhì)量的產(chǎn)品(軟件)。但是,為軟件開發(fā),目前可利用的工具和方法論存在不能斷言有正好適合公司需要的部分。
基本上,軟件研究·開發(fā)的目標(biāo)是尋找能夠簡單、快捷地構(gòu)筑更高質(zhì)量的軟件的方法。這10年間,推敲、提出各種方法論與技術(shù),相應(yīng)地改良了軟件開發(fā)周期的步幅。
雖然承認(rèn)這些改良有相當(dāng)?shù)呢暙I(xiàn),但將其更廣泛的使用還存在困難。事實(shí)上,這其中創(chuàng)造出能夠明確理解和修正的系統(tǒng)幾乎是不可能的,因此仍然只有具有廣泛能力、技能以及知識(shí)的專家才能很好的使用這些。相反地,這意味著軟件的執(zhí)行需要錄用高薪的人才、高價(jià)的維護(hù)以及大規(guī)模的檢查。由此理由,企業(yè)目前對于新的有希望的軟件開發(fā)周期的改良方法論非常歡迎,同時(shí)做好了支付相應(yīng)報(bào)酬的準(zhǔn)備。
Lyee(含意為“用于軟件開發(fā)的統(tǒng)一的方法論”的末端字符)是一種新的非常有希望的方法論。謀求有效處理與不同領(lǐng)域相關(guān)的大范圍的軟件問題的Lyee,能夠只定義為所希望的軟件開發(fā)的必要條件來開發(fā)軟件。更準(zhǔn)確的說,用戶可以只給出詞、關(guān)于詞的運(yùn)算表達(dá)式、該運(yùn)算的條件(前提條件)以及畫面與打印的預(yù)覽圖(例如,參考專利文獻(xiàn)1及2、4到6)。
然后,將其后所有的麻煩的程序設(shè)計(jì)過程(控制邏輯側(cè)面)交給計(jì)算機(jī)做。即,SE(系統(tǒng)工程師)等人不需要進(jìn)行邏輯設(shè)計(jì)。雖然Lyee剛發(fā)明不久,但是該使用結(jié)果顯示了超出想象的可能性。事實(shí)上,與現(xiàn)有的方法論相比,可以很大程度減少開發(fā)時(shí)間、維護(hù)時(shí)間以及文件容量(70~80%)。到目前,由必要條件進(jìn)行代碼自動(dòng)生成的開發(fā)者能夠利用被稱為LyeeALL的原始的支援工具(例如,參考專利文獻(xiàn)3及4)。
盡管如此,為使在任何新的方法論中都如此,即使對于Lyee,也必須進(jìn)行證實(shí)其效率、應(yīng)該改良其質(zhì)量的研究。而且,為進(jìn)一步實(shí)現(xiàn)用戶友好界面,LyeeALL工具改良的余地不能說為零。
一方面,作為軟件的靜態(tài)分析方法,存在(1)優(yōu)化技術(shù)、(2)程序分?jǐn)嗉夹g(shù)、(3)必要條件調(diào)試、(4)鍵入等(參考非專利文獻(xiàn)1及4)方法。
(1)優(yōu)化技術(shù)(參照非專利文獻(xiàn)3及8)是通過引入一系列的改變,以縮減代碼列的容量、其執(zhí)行時(shí)間、耗費(fèi)保存等為目的來進(jìn)行的,但在與Lyee方法論的組合中,以前優(yōu)化對象是通過Lyee完成的代碼列,將Lyee必要條件作為其對象沒有在技術(shù)上明確實(shí)現(xiàn)(參考專利文獻(xiàn)4)。
(2)程序分?jǐn)嗉夹g(shù)在傳統(tǒng)的程序設(shè)計(jì)語言中,長時(shí)間被用于將程序閱讀理解與調(diào)試作為“進(jìn)行分離管理”的方法。另外,也成功地用在很多應(yīng)用的分析中,但是,這些應(yīng)用的目標(biāo)是檢測結(jié)合、算法的調(diào)試、反向管理、組件再利用、自動(dòng)并行化、程序合并以及驗(yàn)證輔助,在此之前沒有與Lyee方法論相結(jié)合的構(gòu)想(參考非專利文獻(xiàn)12)。
(3)必要條件調(diào)試能在代碼生成前檢出必要條件的錯(cuò)誤,以得到更有益的結(jié)果,在此之前沒有與Lyee方法論相結(jié)合的構(gòu)想。
(4)鍵入系統(tǒng)(參考非專利文獻(xiàn)2及11)主要用于將程序的幾個(gè)動(dòng)態(tài)的好的行為特性保證為靜態(tài),由此,編譯時(shí)能夠檢測出程序執(zhí)行時(shí)頻繁出現(xiàn)的錯(cuò)誤。另外,鍵入技術(shù)確實(shí)成功地用于所開發(fā)的軟件對于某些安全性問題的處理,在此之前沒有與Lyee方法論相結(jié)合的構(gòu)想。
(專利文獻(xiàn)1)
國際公開WO97/16784 A1冊
(專利文獻(xiàn)2)
國際公開WO98/19232 A1冊
(專利文獻(xiàn)3)
國際公開WO99/49387 A1冊
(專利文獻(xiàn)4)
國際公開WO00/79385 A1冊
(專利文獻(xiàn)5)
國際公開WO02/42904 A1冊
(專利文獻(xiàn)6)
日本國專利申請公開特開2002-202883號公報(bào)
(非專利文獻(xiàn)1)
M.Bozga、J.C.Fernandez、L.Ghirvu等著《用于自動(dòng)測試生成改良的靜態(tài)分析的使用》2000年,p.235-250
(非專利文獻(xiàn)2)
L.Cardelli著《類型系統(tǒng)》、計(jì)算機(jī)科學(xué)與工程學(xué)手冊、第103章、CRC Press公司、1997年
(非專利文獻(xiàn)3)
T.Henning著《優(yōu)化方法》、spring verlag出版、1975年
(非專利文獻(xiàn)4)
S.Muchnick著《程序編譯器設(shè)計(jì)的移植》、Morgan Kaufman出版、加利福尼亞、1999年
(非專利文獻(xiàn)5)
根來文生著《Lyee軟件原理》、關(guān)于21世紀(jì)信息化社會(huì)的國際會(huì)議2000(IS2000)、p.121-189、2000年11月
(非專利文獻(xiàn)6)
根來文生著《Lyee入門》、軟件生產(chǎn)技術(shù)研究所、東京、日本、2001年
(非專利文獻(xiàn)7)
根來文生、I.Hamid著、《意圖工程學(xué)的建議》、關(guān)于數(shù)據(jù)基礎(chǔ)與信息系統(tǒng)的第五次東歐會(huì)議研究(ADBIS’)、2000年9月
(非專利文獻(xiàn)8)
S.Pande、D.P.Agrawal著《用于可升級的并行系統(tǒng)的編譯器優(yōu)化語言、編譯技術(shù)及執(zhí)行時(shí)間系統(tǒng)》、Springer-Verlag公司、2001年
(非專利文獻(xiàn)9)
D.E.Rutherford著、《格論(Lattice Theory)序論》、Hafner出版、紐約、1965年
(非專利文獻(xiàn)10)
F.Tip著《關(guān)于程序分?jǐn)嗉夹g(shù)的調(diào)查》、程序設(shè)計(jì)語言雜志、3(3)p.121-189、1995年9月
(非專利文獻(xiàn)11)
D.Volpano、G.Smith及C.Irvine著《用于準(zhǔn)確的流程分析的靜態(tài)類型系統(tǒng)》、計(jì)算機(jī)安全雜志、4(3)p.167-187、1996年
(非專利文獻(xiàn)12)
W.Weiser著《程序分?jǐn)唷?、IEEE Trans Software Engineering、p.352-357、1984年7月
像這樣,作為能簡單快捷地構(gòu)筑更高質(zhì)量的軟件方法,一直以來提出各種方法論和技術(shù),相應(yīng)地改良了軟件開發(fā)周期的步驟,但是這些不能實(shí)現(xiàn)明確的理解和修正,所以只有具有廣泛能力、技能、以及知識(shí)的專家才能很好地使用,因此,在軟件執(zhí)行中存在著必須大規(guī)模支出勞務(wù)費(fèi)、軟件維護(hù)費(fèi)以及檢查費(fèi)的問題。
為解決該問題,提出了被稱為Lyee的有前途的方法論,存在著改良的余地用于其效率、質(zhì)量的研究、用戶更容易使用的實(shí)現(xiàn)。

發(fā)明內(nèi)容
本發(fā)明是為解決上述現(xiàn)有技術(shù)問題而進(jìn)行的。具體地,本發(fā)明目的在于提供一種協(xié)助Lyee方法論中具有更高質(zhì)量(更少的保存與執(zhí)行時(shí)間的耗費(fèi))的代碼生成的關(guān)于Lyee指向軟件的靜態(tài)分析方法。
為此,進(jìn)一步本發(fā)明的目的在于,展示為分析Lyee必要條件(它們的定義、它們的計(jì)算狀態(tài)以及它們的屬性中的1組詞),通過使用古典的靜態(tài)分析方法的技術(shù),能進(jìn)一步增進(jìn)Lyee方法論的方法,并提供可實(shí)際利用該方法的關(guān)于Lyee指向軟件的靜態(tài)分析方法。
并且本發(fā)明另一個(gè)目的在于,展示鍵入和其它靜態(tài)分析技術(shù)到底能否改良Lyee方法論的某些局面,提供可實(shí)際利用的該方法的關(guān)于Lyee指向軟件的靜態(tài)分析方法。
另外本發(fā)明的目的在于,提出了Lyee必要條件分析器即用于給予幾個(gè)靜態(tài)分析的技術(shù)開發(fā)的原型,并提供可實(shí)際利用該原型的關(guān)于Lyee指向軟件的靜態(tài)分析方法。
并且,本發(fā)明的目的在于,示意性地提出關(guān)于本工作以及今后研究的幾個(gè)結(jié)論性意見,并提供可實(shí)際利用其關(guān)于Lyee指向軟件的靜態(tài)分析方法。
在此,“Lyee(注冊商標(biāo))”是指由作為涉及本申請發(fā)明的發(fā)明者一員的根來文生發(fā)明的涉及軟件制作方法等的發(fā)明及技術(shù),更詳細(xì)的內(nèi)容公開在例如由上述專利文獻(xiàn)1至專利文獻(xiàn)6等規(guī)定的各國際公開公報(bào)等中。
本發(fā)明為達(dá)到上述目的,具備為按照Lyee方法論制作軟件,得到的包含每個(gè)詞的定義式的要求定義的步驟;將該得出的要求定義作為關(guān)鍵詞檢出常數(shù)的步驟;按照使用檢出的常數(shù)的定義式傳送該常數(shù)的步驟。
所謂“傳送常數(shù)”是要求定義(Lyee必要條件)的詞中存在常數(shù)的情況下,將該常數(shù)代入到該詞中,代入到具有使用該詞的定義式的詞中,通過不斷的代入來整理每個(gè)詞的定義式。
在本發(fā)明中,對作為根據(jù)Lyee的軟件制作的前階段的Lyee必要條件實(shí)施優(yōu)化,所以能夠完成在根據(jù)Lyee方法論制作的軟件中編碼列容量的減小、耗費(fèi)儲(chǔ)存的減少、程序執(zhí)行時(shí)間的進(jìn)一步減少。
并且,本發(fā)明具備為按照Lyee方法論制作軟件,得到包含每個(gè)詞的要求定義的步驟;由該得到的要求定義中的定義式檢出模式的步驟;以該檢出的模型作為置換式的表現(xiàn)來置換該要求定義的步驟。
所謂的“將模式作為置換式”是當(dāng)必要條件中的模式多次出現(xiàn)時(shí),將其置換為暫時(shí)變量。
在本發(fā)明中,Lyee必要條件的多次出現(xiàn)的模式只計(jì)算一次,不需要多次計(jì)算,所以能減少代碼的執(zhí)行時(shí)間。
另外,本發(fā)明具備為按Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及前提條件的要求定義的步驟;基于上述要求定義,得到遵守BNF語法記述至少涉及上述詞的識(shí)別符、定義式以及前提條件的聲明的步驟;對獲得的每個(gè)聲明定義Def/Use函數(shù)的步驟;由定義的Def/Use函數(shù)間的順序關(guān)系得到上述聲明間的順序關(guān)系的步驟。
所謂“聲明”是將必要條件中的詞和與其相對的定義式、前提條件、輸入輸出屬性等作為一個(gè)函數(shù)化的表達(dá)。另外,所謂“Def/Use函數(shù)”是表示每個(gè)這種聲明被定義詞的函數(shù)、表示用于定義該被定義的詞的其它詞的函數(shù)。
在本發(fā)明中,可以知道將Lyee必要條件的詞與該定義式等對聲明的形態(tài)進(jìn)行變換、分析的結(jié)果Lyee基礎(chǔ)理論中的謂語向量的最佳(即減少執(zhí)行時(shí)間)組合,因此,例如通過與必要條件生成的代碼工具(LyeeALL)結(jié)合,能進(jìn)一步推動(dòng)根據(jù)Lyee的軟件制作中的效率化。
另外,本發(fā)明具備為按照Lyee方法論制作軟件,得到每個(gè)詞的定義式以及包含輸入輸出屬性的要求定義的步驟;基于該要求定義,得到記述至少與該詞相關(guān)的標(biāo)識(shí)符、上述定義式以及輸入輸出屬性的聲明的步驟;由該得到的聲明(第1聲明)引入對與該聲明相關(guān)的詞的定義有貢獻(xiàn)的聲明(第2聲明),對相關(guān)的總的聲明執(zhí)行該第1以及第2聲明作為同一聲明群的分?jǐn)嗪瘮?shù)的步驟;由該分?jǐn)嗪瘮?shù)得到相互獨(dú)立的分?jǐn)嗟牟襟E。
所謂“分?jǐn)嗪瘮?shù)”是使程序收斂于與特定計(jì)算相關(guān)的聲明,具有區(qū)分每個(gè)相互獨(dú)立的聲明群的功能的函數(shù)。
在本發(fā)明中,由于能并行執(zhí)行相互獨(dú)立的分?jǐn)嗳?,所以能完成?zhí)行時(shí)間的縮短,特別是即使在聲明數(shù)多的情況下,也能減少必要條件的理解錯(cuò)誤。
另外,本發(fā)明具備為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;基于該要求定義,得到記述至少與上述詞相關(guān)的標(biāo)識(shí)符、該定義式以及上述輸入輸出屬性的聲明的步驟;基于關(guān)于該得到的聲明的規(guī)定的分析,檢出上述要求定義的錯(cuò)誤的步驟。
在“檢出要求定義中的錯(cuò)誤”中,例如使用關(guān)于聲明的規(guī)定,發(fā)現(xiàn)非活性聲明、循環(huán)聲明、不完全聲明、多余聲明等。當(dāng)然,錯(cuò)誤檢出并不限定在這些聲明中,也可以將其它的聲明作為對象。
本發(fā)明,在Lyee方法論中的方案函數(shù)執(zhí)行中,因?yàn)槟軌蚍乐箍刂埔苿?dòng)實(shí)際上不能執(zhí)行的輔助程序,所以能夠達(dá)到處理時(shí)間的減少、提高耗費(fèi)保存的效率。
并且,本發(fā)明具備為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;基于該要求定義,得到記述至少與上述詞相關(guān)的標(biāo)識(shí)符、該定義式以及輸入輸出的聲明的步驟;對該得到的聲明、該聲明中的運(yùn)算符以及對數(shù)據(jù)定義各種類型代數(shù)的步驟;對于該定義的類型代數(shù),使用相關(guān)連的環(huán)境以及預(yù)定的類型規(guī)則發(fā)現(xiàn)上述要求定義中的類型錯(cuò)誤的步驟。
“類型代數(shù)”是將類型的概念引入涉及由必要條件生成的聲明詞、定義式等,將同等處理類型的不同作為錯(cuò)誤,為以數(shù)學(xué)公式的方式進(jìn)行在必要條件階段中排除操作引入的概念。
在本發(fā)明中,將Lyee必要條件作為隊(duì)形進(jìn)行類型的分析,使用類型規(guī)則發(fā)現(xiàn)必要條件中的錯(cuò)誤,所以能夠進(jìn)一步促進(jìn)程序錯(cuò)誤的減少。
此外,本發(fā)明具備為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;基于該要求定義,得到記述至少涉及上述詞的識(shí)別符、該定義式以及輸入輸出屬性的聲明的步驟;對上述得到的聲明、該聲明中的運(yùn)算符以及數(shù)據(jù),定義類型代數(shù)的步驟;基于該定義的類型代數(shù),使用規(guī)定的環(huán)境和類型規(guī)則,由該要求定義中的輸入詞生成媒介以及輸出詞的類型的步驟。
在本發(fā)明中,由輸入詞唯一地預(yù)先導(dǎo)出輸出詞和媒介地類型,所以,能夠達(dá)到用戶操作地簡單化、錯(cuò)誤的減少。
并且,本發(fā)明具備為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;基于該要求定義,得到記述至少涉及該詞的識(shí)別符、該定義式、輸入輸出屬性以及安全標(biāo)號的聲明的步驟;使用表示該得到的聲明中的安全標(biāo)號間的關(guān)系網(wǎng)絡(luò),定義使安全標(biāo)號與該詞的值相關(guān)連的函數(shù)的步驟;基于該定義的標(biāo)號函數(shù),使用規(guī)定的安全方針,算出不遵守規(guī)定的安全方針的程序的步驟。
所謂“安全標(biāo)號”是表示關(guān)于某信息的安全必要條件(例如“公開的”、“秘密的”)的標(biāo)號?!皹?biāo)號函數(shù)”是用于對必要條件中的詞給予這種安全標(biāo)號、以數(shù)學(xué)公式的方式處理的函數(shù)。此外,所謂“安全方針”是能夠由用戶方自由規(guī)定的、決定具有某種安全標(biāo)號的信息如何處理的指針。
在本發(fā)明中,通過將上述鍵入技術(shù)擴(kuò)大到信息安全,能完成對明確存在發(fā)生違反安全余地的設(shè)計(jì)上的缺陷起作用的自動(dòng)程序驗(yàn)證。
本發(fā)明也可以為以下構(gòu)成,具備為按照Lyee必要條件制作軟件,接受包含每個(gè)詞的定義式以及前提條件的要求定義的要求定義接受部;由該接受要求定義分析包含于這的詞匯以及語法、輸出中間表達(dá)的分析部;由該輸出的中間表達(dá)開始對該要求定義進(jìn)行關(guān)于數(shù)據(jù)流程以及控制流程的分析、輸出數(shù)據(jù)流程圖以及控制流程圖的分析部;對于經(jīng)過該流程分析的要求定義實(shí)施優(yōu)化、輸出改善后的規(guī)約的優(yōu)化部。
此時(shí)的“要求定義接受部”是具有輸入實(shí)施本申請的例如加工前的Lyee必要條件(要求定義)的功能的單位,例如,作為登載的存儲(chǔ)介質(zhì)或ROM等,實(shí)現(xiàn)將該功能程序化并作為可執(zhí)行的形式。
所謂“分析部”是具有由被接受的該要求定義抽取詞匯以及句法進(jìn)行分析后,該要求定義作為句法情況的中間表達(dá)進(jìn)行輸出的功能的單位,例如作為登載的存儲(chǔ)介質(zhì)或ROM等,能夠?qū)崿F(xiàn)將該功能程序化并作為可執(zhí)行的形式。
所謂“流程分析部”是具有由中間表達(dá)開始,由1必要條件點(diǎn)到另1必要條件點(diǎn)的數(shù)據(jù)流程控制的循環(huán)中有關(guān)系的所有的信息作為例如控制流程圖(Control Flow GraphCFG)以及數(shù)據(jù)流程圖(Data-FlowGraphDFG)進(jìn)行輸出的功能的單位,例如作為登載的存儲(chǔ)介質(zhì)或ROM等,能夠?qū)崿F(xiàn)將該功能程序化并作為可執(zhí)行的形式。
所謂“優(yōu)化部”是,例如執(zhí)行常數(shù)傳送技術(shù)、適于LyeeAll工具生成能夠更快執(zhí)行且耗費(fèi)保存更少的程序、具有生成規(guī)則簡單化的聲明的系列的功能的單位,例如作為登載的存儲(chǔ)介質(zhì)或ROM等,能夠?qū)崿F(xiàn)將該功能程序化并作為可執(zhí)行的形式。
所謂“限制器”是具有以下功能的單位,接受與由流程基礎(chǔ)分析要素以及分?jǐn)嘣u價(jià)標(biāo)準(zhǔn)標(biāo)準(zhǔn)生成的流程相關(guān)(與各詞相關(guān)連的Def/Use等)的信息,作為輸出,給出與這些給出的評價(jià)標(biāo)準(zhǔn)對應(yīng)的分?jǐn)唷@缱鳛榈禽d的存儲(chǔ)介質(zhì)或ROM等,能夠?qū)崿F(xiàn)將該功能程序化并作為可執(zhí)行的形式。
因此,按照本發(fā)明,將上述各自的功能作為可以實(shí)現(xiàn)單位的例如介質(zhì),作為輸入接受Lyee的必要條件,作為輸出給出調(diào)整適于LyeeAll生成的優(yōu)化代碼的分?jǐn)嗪晚樞颍⑶?,可以?zhí)行常數(shù)傳送等其它的必要條件的優(yōu)化。
此外,本發(fā)明不只作為軟件分析方法,也可以作為軟件分析裝置、或大范圍的軟件開發(fā)方法、軟件開發(fā)裝置、以及用于在計(jì)算機(jī)中執(zhí)行這些的軟件、保存該軟件的存儲(chǔ)介質(zhì)、搭載該軟件的裝置、在例如ROM等中保存該軟件的額定專用機(jī)器、或作為業(yè)務(wù)方式執(zhí)行這些的業(yè)務(wù)模型等實(shí)現(xiàn),本發(fā)明包含這些實(shí)施方式。


第1圖是以代碼列表示涉及本發(fā)明的Lyee方法論中的必要條件執(zhí)行的示意圖。
第2圖是用于說明涉及本發(fā)明的Lyee方法論中的模塊概念的示意圖。
第3圖是用于說明涉及本發(fā)明的Lyee方法論中的方案函數(shù)概念的示意圖。
第4圖是表示涉及本發(fā)明的Lyee方法論中的謂語向量的動(dòng)態(tài)結(jié)構(gòu)的流程圖。
第5圖是表示涉及本發(fā)明的Lyee方法論L4,a、以及L4,b的謂語向量的動(dòng)態(tài)結(jié)構(gòu)的流程圖。
第6圖是表示涉及本發(fā)明的Lyee方法論L3,a、以及L3,b的謂語向量的動(dòng)態(tài)結(jié)構(gòu)的流程圖。
第7圖是用于示意性地說明涉及本發(fā)明的Lyee方法論中的畫面相互作用的示意圖。
第8圖是用于說明涉及本發(fā)明的Lyee方法論中的處理路徑圖的概念的示意圖。
第9圖是用于說明涉及本發(fā)明一實(shí)施方式的UseDirectAndIndirect(s,S)算法的流程圖。
第10圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的循環(huán)聲明語句的算法的流程圖。
第11圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的不完全聲明語句的算法的流程圖。
第12圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的無用聲明語句的算法的流程圖。
第13圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的無用聲明語句的算法的流程圖。
第14圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的2個(gè)之中應(yīng)該先執(zhí)行的聲明語句的算法的流程圖。
第15圖是用于說明排列涉及本發(fā)明一實(shí)施方式的聲明語句順序的算法的流程圖。
第16圖是用于說明排列涉及本發(fā)明一實(shí)施方式的聲明語句順序的算法的流程圖。
第17圖是用于說明抽取涉及本發(fā)明一實(shí)施方式的詞a的分?jǐn)嗨惴ǖ牧鞒虉D。
第18圖是用于說明抽取涉及本發(fā)明一實(shí)施方式的詞a的分?jǐn)嗨惴ǖ牧鞒虉D。
第19圖是用于說明檢出涉及本發(fā)明一實(shí)施方式的獨(dú)立的分?jǐn)嗨惴ǖ牧鞒虉D。
第20圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第21圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第22圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第23圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第24圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第25圖是用于說明涉及本發(fā)明一實(shí)施方式的鍵入的算法的流程圖。
第26圖是用于說明涉及本發(fā)明的一實(shí)施方式的Lyee必要條件分析器的動(dòng)態(tài)結(jié)構(gòu)的功能程序塊以及流程圖。
具體實(shí)施例方式
作為本發(fā)明的基本考慮方法是稱為Lyee的開發(fā)方法論,關(guān)于此,公開在上述的專利文獻(xiàn)1至專利文獻(xiàn)6等中。
在軟件系統(tǒng)的研究于開發(fā)的過程中,問題最多的工作之一是充分理解必要條件并將它們正確地變?yōu)榇a。為解決這個(gè)問題,在Lyee方法論中,提出由必要條件產(chǎn)生程序的簡單的方法。
關(guān)于Lyee方法論背景中的哲學(xué)的原則,根據(jù)上述的文獻(xiàn),下面參考附圖·表,為理解如何查看通過使用該方法論寫軟件的方法與根據(jù)該方法由必要條件自動(dòng)生成的代碼,只集中幾個(gè)實(shí)用的構(gòu)思進(jìn)行說明。
(1)Lyee必要條件
在Lyee方法論中,必要條件作為多個(gè)聲明(語句)(statements)的集合以聲明的方法給出。聲明包含詞、與其相伴的詞的定義、運(yùn)算條件及屬性(輸入/輸出、類型、安全性屬性等)。
為簡單化,在本說明書中看作各聲明的包含下面的1)到5)的信息。
1)詞(Word)
詞的標(biāo)識(shí)符
2)定義(Definition)定義詞的表達(dá)式。為簡單化,作為表達(dá)式可以考慮為是以下中任意的一個(gè)。
Exp=val|id||(Exp)|op Exp|Exp op Exp
val=num|num.num|bool
num=0|1…|9|num num
bool=true|false
id=a|…|z|A|…|Z|id num|id id
Op=+|-|*|or|and|<|<=|=|<>|>|>=|not
上述所示的表達(dá)式Exp的定義如下。
·Exp
式中″Exp″(表達(dá)式)、值″val ″、標(biāo)識(shí)符″id″、各個(gè)給出的表達(dá)式″Exp″、后面表述式是接續(xù)的單項(xiàng)運(yùn)算符″op Exp″(例如-2、-(a+b))、或者伴隨其它表達(dá)式的二項(xiàng)運(yùn)算符中的″Exp opExp″。
·Val
值″val″是數(shù)值″num″、浮點(diǎn)數(shù)值″num.num″(數(shù)值.數(shù)值)、或者邏輯值(真假值)″bool″。
·num
數(shù)值″num″是數(shù)字(degit)或一個(gè)數(shù)值后續(xù)的數(shù)值″num.num″。
·bool
邏輯值是真(true)或假(flase).
·id
標(biāo)識(shí)符″id″是字符、字符后的數(shù)值接續(xù)的″id num″或者標(biāo)識(shí)符后的標(biāo)識(shí)符接續(xù)″id id″。
·op
運(yùn)算符是+、-、*、or、and、<、<=、<>、>、>=、或not。
2)條件(Condition)
所謂條件是詞的運(yùn)算條件,是被作為邏輯運(yùn)算符的表達(dá)式Exp。如果沒有條件(即,條件常為真),該項(xiàng)目作為空白欄。
3)IO
為明確顯示,該項(xiàng)目將被定義的詞分為輸入詞、輸出詞或中間詞(intermediate Word)。如果詞為輸入,并且是由文件輸入,該項(xiàng)目的為值IF,如果詞是由畫面輸入,則為IS。同樣,如果詞為輸出,則該欄為值OF(輸出給文件的情況)或OS(輸出給畫面的情況)??墒?,如果是中間詞,該欄作為空白欄。所謂中間詞,并不輸入,并且,不輸出根據(jù)定義的表達(dá)式生成的值,生成的值只對其它的輸出詞的生成起作用。
4)類型(Type)
該項(xiàng)目為指定詞的類型而分配,是整數(shù)″int″、浮點(diǎn)數(shù)″float″或邏輯值″bool″中的任意一個(gè)值。
5)安全性(Security)
該項(xiàng)目為確定所定義的詞的安全級別而被分配,取公開(public)或非公開(secret)中的任意一個(gè)值。如果被定義的詞不是輸入,項(xiàng)目″類型″與″安全性″可以為空欄。同樣,其它種類的類型和其它種類的安全級別也能容易地?cái)U(kuò)大,正確地滿足真正的Lyee必要條件。
表1是表示Lyee必要條件的例子。
(表1)
在本說明書中,以下聲明(statement)是指必要條件表的1行的內(nèi)容。
例如,在表1中定義詞a的聲明(把這記為sa)在表2中記述。
(表2)
詞a的聲明
在本說明書中,以下如果s是聲明,其后的定義使用如下的意思。
1)Word(s)是聲明的項(xiàng)目為″詞″的意思。
2)Definition(s)是聲明的項(xiàng)目為″定義″的意思。
3)Condition(s)是聲明的項(xiàng)目為″條件″的意思。
4)IO(s)是聲明的項(xiàng)目為″IO″的意思。
5)Type(s)是聲明的項(xiàng)目為″類型″的意思。
6)Security(s)是聲明的項(xiàng)目為″安全性″的意思。
(2)Lyee程序的代碼生成
把Sw作為定義詞w的聲明。傳統(tǒng)的程序設(shè)計(jì)語言中,表1中給出的必要條件與表3中給出的代碼相對應(yīng)。Lyee方法論中,用戶不需要指定這些定義的執(zhí)行順序(控制邏輯)。在表1中,盡管詞a使用詞b來定義,聲明Sb被分配在Sa的后面。在Lyee方法論中,作為軟件理論部分的控制邏輯自動(dòng)生成的結(jié)果,能夠大量減少程序涉及錯(cuò)誤和程序時(shí)間。
(表3)
由表1的必要條件,我們能夠自動(dòng)生成計(jì)算a與b的值的程序,并將其輸出。在此,圖1是將必要條件反應(yīng)在執(zhí)行中的情況作為代碼列來表達(dá)的示意圖。如該圖所示,程序到達(dá)某一定點(diǎn)前,簡單地重復(fù)這些指示,即,無論怎樣的重復(fù),圖1所示的哪個(gè)詞的值都不變化。
然后,即使改變關(guān)于與圖3中給出的聲明相關(guān)連的代碼的順序,也不能改變程序的意思,即總是將正確的值賦予詞。
然后,更詳細(xì)地聲明根據(jù)Lyee由必要條件自動(dòng)地生成程序的結(jié)構(gòu)和內(nèi)容。在Lyee方法論中,一組聲明的執(zhí)行(表1中給出的)是以獨(dú)特的方法來執(zhí)行的。Lyee在圖2中表示與聲明相關(guān)連的代碼,分配在以Lyee術(shù)語稱呼的3個(gè)模塊上(W02、W03、W04)。
如該圖所示,W02模塊處理輸出詞,然后W03模塊算出詞的計(jì)算條件,該結(jié)果保存在幾個(gè)變量中(作為值取邏輯值)。例如,詞a的定義中使用的″b*e>2″的條件在W03模塊中計(jì)算,真/假的該結(jié)果保存在″a_cond″的另外一個(gè)變量中。最后,W04模塊按照在必要條件中給出的定義進(jìn)行詞的計(jì)算。另外,其輸出計(jì)算出來的詞的值。
在Lyee中,從W04開始,達(dá)到一定點(diǎn)之前對所有定義的詞進(jìn)行該值的計(jì)算。在W04中,對于詞的值不能再有進(jìn)展時(shí),控制轉(zhuǎn)到W02模塊。自己的號到來時(shí),第2個(gè)模塊在未達(dá)到一定點(diǎn)前(沒有得到重新取入輸入的狀態(tài)),重復(fù)進(jìn)行不足的詞的輸入,然后將控制轉(zhuǎn)到W03。最后,與W04模塊的情況一樣,根據(jù)必要條件,達(dá)到一定的點(diǎn)之前,W03模塊算出詞的計(jì)算條件。
如圖3所示,在達(dá)到整體穩(wěn)定狀態(tài)前,該整體的過程(W04→W02→W03)重復(fù)進(jìn)行,該單位被稱為基本結(jié)構(gòu)(Scenario Function方案函數(shù))??梢匀菀椎氐玫綀D1所示的程序的執(zhí)行結(jié)果與圖2所示的程序的執(zhí)行結(jié)果相同。
并且,Lyee確立具有使應(yīng)該生成的代碼的結(jié)構(gòu)與必要條件內(nèi)容一定沒有關(guān)系的固定結(jié)構(gòu)的簡潔的標(biāo)準(zhǔn)程序(按Lyee術(shù)語稱為″基礎(chǔ)理論″)。包括整體的全程程序(global program)簡單地稱為謂語向量(predicate vector)。圖4為展示上述謂語向量結(jié)構(gòu)的圖。
如該圖所示,作為謂語向量的目的根據(jù)模塊而改變。例如,在W04模塊,最初的目的是根據(jù)該計(jì)算的定義對詞賦值。例如對于圖2中所示的例子,與詞a與詞b的計(jì)算相關(guān)的謂語向量按圖5所示。另外,對圖4及圖5的各步驟的詳細(xì)說明符合上述專利文獻(xiàn)1至6,所以在此省略。
對于該詞的計(jì)算,如果沒有進(jìn)一步的進(jìn)展,根據(jù)Lyee生成的代碼嘗試以下目的,即詞的輸出。將值的輸出作為目的的謂語向量被稱為輸出向量(output vector)。在W02模塊中,存在將使值與輸入詞相關(guān)連為目的的2個(gè)謂語向量。為了說明簡潔,對處理輸入、輸出以及保存的初始化的謂語向量在其它的詳細(xì)說明中省略。最后,在W03模塊中,謂語向量的目的是如圖6所示,在判定必要條件中指定的前提條件。在此,對該圖的各步驟的詳細(xì)說明符合上述專利文獻(xiàn)1至6,所以在此省略。
最后,表1給出的必要條件相關(guān)的Lyee程序如表3所示。
(3)處理路徑圖
前部分示出的基本結(jié)構(gòu)(Scenario Function方案函數(shù))在任意的必要條件的簡單的情況、特別是所有的輸入及輸出詞屬于同一畫面、不使用數(shù)據(jù)基礎(chǔ)的情況下,其自身就是完整的程序。但是,需要輸入輸出數(shù)據(jù)基礎(chǔ)或相互有關(guān)連的屬于不同的畫面的詞時(shí),情況變得稍微復(fù)雜。為說明簡潔,以下只處理有多個(gè)畫面情況。例如,假設(shè)有圖7所示的相互連接的3個(gè)畫面,用戶由一個(gè)畫面轉(zhuǎn)到其它畫面,在這些中的任意一個(gè)中,用戶能夠輸入、運(yùn)算、輸出多個(gè)詞。因此用戶在說明書中需要給出這些畫面如何結(jié)合。
(表4)
然后,為計(jì)算在所有的畫面上定義的所有的詞,只定義一個(gè)基本結(jié)構(gòu)(方案函數(shù))是不合適的。實(shí)際上,畫面中可能有在程序的任意的執(zhí)行中未被執(zhí)行的畫面,該情況下,進(jìn)行那些畫面的詞的值的計(jì)算就浪費(fèi)時(shí)間了。由上述理由,Lyee將各畫面與該畫面被執(zhí)行時(shí)執(zhí)行的擔(dān)當(dāng)基本結(jié)構(gòu)相關(guān)連。示出與畫面相關(guān)連的基本結(jié)構(gòu)相互連接、如何由相同的畫面中的一個(gè)轉(zhuǎn)到別的畫面。若以Lyee術(shù)語來說,相互連接的多個(gè)基本結(jié)構(gòu)集中,作成如圖8所示的處理路徑圖(process routediagrams)。
總起來說,在Lyee方法論中程序通常包含多個(gè)處理路徑圖。這些處理路徑圖各自都是1組內(nèi)部相連接的基本結(jié)構(gòu)群,并且,各自的基本結(jié)構(gòu)包含內(nèi)部相連接的3個(gè)模塊,即W02模塊、W03模塊及W04模塊。
(4)Lyee方法論的改進(jìn)點(diǎn)
盡管Lyee方法論的簡潔程度與Lyee的方法論對軟件開發(fā)周期的所有步驟有幾個(gè)影響,但是Lyee方法論對生成代碼容量上具有重要的改進(jìn)點(diǎn)。實(shí)際上,對于必要條件中給出的各個(gè)詞Lyee分配幾個(gè)存儲(chǔ)區(qū)域。作為保存被消耗的正確容量的詳情參考上述的非專利文獻(xiàn)6及7。
以下,展示通過靜態(tài)分析的技術(shù)如何將Lyee程序改進(jìn)為具有更快運(yùn)行并且保存空間的消耗更小等更優(yōu)良的質(zhì)量的軟件。
以下,參考

涉及關(guān)于Lyee必要條件的靜態(tài)分析的本發(fā)明的實(shí)施方式。
軟件的靜態(tài)分析(參考非專利文獻(xiàn)1及4)意思一般是不實(shí)際執(zhí)行程序而進(jìn)行關(guān)于程序的代碼的驗(yàn)證。若按照經(jīng)驗(yàn)所示,通過靜態(tài)分析能夠控制、改良設(shè)計(jì)書與代碼中的多個(gè)質(zhì)量特征。特別的,根據(jù)靜態(tài)分析的技術(shù)能夠制作更快運(yùn)行、保存空間的耗費(fèi)更少的程序,發(fā)現(xiàn)程序的錯(cuò)誤。若對必要條件進(jìn)行靜態(tài)分析,能夠在代碼生成前發(fā)現(xiàn)理論的錯(cuò)誤與欠缺的地方,其結(jié)果能夠使用戶節(jié)約用于開發(fā)及測試的寶貴的時(shí)間。
在本說明書中,展示能夠改良Lyee必要條件與該生成代碼列的質(zhì)量的幾個(gè)靜態(tài)分析的技術(shù)。
一般的,所謂程序的優(yōu)化是指通過施加一系列的變化來縮小代碼列的大小、其執(zhí)行時(shí)間、耗費(fèi)保存等。明確了所給予的代碼列的優(yōu)化是最大的目的,但是即使任何情況下也不應(yīng)該改變最初程序的意思。
1.古典的優(yōu)化
在本部分中,說明幾種古典優(yōu)化技術(shù)(參考非專利文獻(xiàn)3及8)以及這些優(yōu)化對于保存耗費(fèi)量和Lyee程序的執(zhí)行時(shí)間的很大效果。
(1-1)常數(shù)傳送分析(Constant Progagation)
這個(gè)簡單的技術(shù)檢出程序中的常數(shù),按照使用它們的表達(dá)式傳送那些常數(shù)的值,最后消除這些常數(shù)。例如,表1的例子中,常數(shù)傳送前的必要條件中,將5賦予詞a的定義。詞b的定義為a+3*5,通過代入a=5,進(jìn)行常數(shù)的傳送時(shí),詞b的定義為20。詞d的定義為e+b*a,所以代入a=5、b=20,進(jìn)行常數(shù)的傳送,該定義式成為e+100。這樣常數(shù)傳送的結(jié)果、初始必要條件就成為表5的“常數(shù)傳送分析后”所示。定義為常數(shù)的聲明不需要生成值,所以由必要條件中除去。
(表5)
<常數(shù)傳送分析前>
<常數(shù)傳送分析后>
(1-2)模式檢出
模式是在程序中重復(fù)數(shù)次的基準(zhǔn)表達(dá)式。這意味著各自的基準(zhǔn)表達(dá)式都計(jì)算數(shù)次。因此,模式如果存在于必要條件中,一般地,將各個(gè)模式替換為基準(zhǔn)表達(dá)式只計(jì)算一次的暫時(shí)的變量,因此能夠減少與這些相關(guān)連的代碼的執(zhí)行時(shí)間。表6是給出基準(zhǔn)表達(dá)式″b*c″作為模式的例子。
(表6)
<模式傳送分析前>
<模式傳送分析后>
然后,說明使用這些簡單的古典優(yōu)化技術(shù)能夠如何改良通過Lyee生成的代碼的保存空間與執(zhí)行時(shí)間。熟知的事實(shí)是這些優(yōu)化技術(shù)由幾乎所有可能利用的程序編譯器給出。在此基礎(chǔ)上,可以得出如下結(jié)論由于Lyee一般通過COBOL等高級程序語言生成代碼,如果由人來生成Lyee的高級代碼,因此用于生成低級代碼的編譯器要對這些進(jìn)行優(yōu)化。但是,深入研究這個(gè)問題,顯示這個(gè)結(jié)論并非完全正確。實(shí)際上,Lyee用于生成代碼的方法可能將尋找這些古典優(yōu)化時(shí)的編譯器的操作變得復(fù)雜。
為了對其進(jìn)行確認(rèn),我們使用C語言來編寫了執(zhí)行簡單的必要條件的兩個(gè)程序。我們分別對其中之一給出由LyeeALL(注冊商標(biāo))工具生成、同樣結(jié)構(gòu)的第二個(gè)為通常的結(jié)構(gòu)。由程序編譯器對兩個(gè)程序進(jìn)行優(yōu)化編譯后,我們發(fā)現(xiàn),在具有Lyee結(jié)構(gòu)的程序中程序編譯器越來越不能適用常數(shù)傳送技術(shù),在第二個(gè)程序中始終能夠進(jìn)行優(yōu)化。即,我們得到結(jié)論一旦必要條件由用戶給出,Lyee方法論中代碼生成前使用這些優(yōu)化的技術(shù)更有益、更簡單。
2. Lyee必要條件靜態(tài)分析中的基本分析
在這部分中,為簡化本說明書中明確的靜態(tài)分析技術(shù)的大部分的說明,進(jìn)行幾個(gè)非常有益的基本的分析的定義。
(2-1)Def/Ues分析
(2-1-1)Def/Ues分析的非正式的定義
任意的Lyee必要條件中的各聲明s為定義新的詞,在定義式或條件式中使用幾個(gè)詞。在定義式或條件式匯總使用的詞的集合稱為Use(s),新定義的詞稱為Def(s)。
表7是Def/Ues概念的具體例。
(表7)
Def/Ues概念的具體例
(2-1-2)Def/Ues的正式的定義
s是聲明(wrd、Def、Cond、io、type、SecType)。由Def(s)表示的聲明s的Def只是wrd。并且,以Use(s)來表示的聲明s的Use如下定義。
<聲明的Use>
Use(s)=Use(Def)∪Use(Cond)
<表達(dá)式的Use>
Use(val)=_
Use(Id)={Id}
Use(Op Exp)=Use(Exp)_Use(Exp1·Op Exp2)=Use(Exp1)∪Use(Exp2)
上述的定義為如下的意思。
1)聲明的Use
Use(s)=Use(Def)∪Use(Cond)聲明s的定義以及條件中使用的詞(Use(s))是該定義的定義與條件中使用的詞(Use(Def))以及該條件的定義與條件中使用的詞(Use(Cond))的并集。定義與條件二者都是表達(dá)式,即,為結(jié)束任意的聲明Use的定義,可以只定義表達(dá)式Use。為此,對于各類型的表達(dá)式,必須明確其Use。
2)表達(dá)式Use
·Use(val)=0
表達(dá)式若是值(val),其Use為空白欄。即,沒有定義以及條件中使用的詞。
·Use(Id)={Id}
表達(dá)式若是標(biāo)識(shí)符(Id),其Use為標(biāo)識(shí)符其自身。
·Use(Op Exp)=Use(Exp)
表達(dá)式″Op Exp″若是(后面伴隨表達(dá)式(Exp)的單項(xiàng)運(yùn)算符(Op))的形式,其Use與表達(dá)式(Exp)相等。
·Use(Exp1 Op Exp2)=Use(Exp1)∪Use(Exp2)
表達(dá)式若是″Exp1 Op Exp2″,該Use為表達(dá)式1(Exp1)的Use與表達(dá)式2(Exp2)的Use的并集。
(2-2)直接及間接Use
如前項(xiàng)中所述,必要條件的各個(gè)聲明s通過詞的集合Use(s)來定義的、使用幾個(gè)詞的情況。將該詞的集合稱為聲明s的直接Use。實(shí)際上,屬于Use(s)的各個(gè)詞是該定義式或者條件式的聲明s中直接使用的。
除直接Use的詞以外,聲明s有時(shí)也間接地使用其它詞。例如,如果聲明s直接使用詞″a″,并且定義詞″a″的聲明使用詞″b″,此時(shí),可以說聲明s間接地使用詞″b″。并且,如果定義詞b的聲明s使用詞c,同樣,可以說聲明s間接地使用詞c。
表8示出用于明確間接Use的概念的具體例。
(表8)間接Use的概念的具體例
在表8的例中,詞e為輸入詞,所以該Use為(直接Use。以下,直的接Use只記為″Use″)空白欄,因此間接Use也為空白欄。詞i是作為其Use的詞e為輸入詞,其定義以及條件為空白欄,所以間接Use為空白欄。詞b是作為其Use的詞i的Use是詞,所以間接Use為詞e。詞c的作為其Use的詞b的Use為詞i以及其間接Use為詞e,所以詞c的間接Use為詞e以及詞i。詞a的作為該Use的詞b的Use為詞i、并且間接Use為詞e,并且作為另一個(gè)Use的詞c的Use為詞b、并且間接Use為詞e與詞i,因此詞a的間接Use為詞e以及詞i(詞b為直接Use,所以不加到間接Use上)。
按照下述的函數(shù)UseDirectAndIndirect(s,S)的算法,能夠得到任意的Lyee必要條件S(聲明的集合)中的任意1個(gè)聲明s的Use與間接Use二者。
UseDirectAndIndirect(sstatement,Sset of statements)Var W_Old,W_Newset of wordsBeginW_Old←Use(s)W_New←W_OldFix_Point←FalseWhile(Fix_Point=False)For all a∈Use(s)∩Word(S)W_New←W_New∪Use(Statement(a,S))EndFor<!-- SIPO <DP n="22"> --><dp n="d22"/>If(W_New=W_Old)Then Fix_Point←TrueElse W_Old←W NewEndIfEndWhilereturn W_NewEnd
上述函數(shù)UseDirectAndIndirect(s,S)的算法的意思如下。s是聲明,S是必要條件的聲明的集合。變量W_Old與變量W_New是詞的集合。
<開始>
變量W_Old中保存Use(s)[作為聲明s的直接Use的詞(群)]
變量W_New中保存變量W_Old的值
變量Fix_Point中保存值False
<While語句開始>變量Fix_Point的值為Flase時(shí),執(zhí)行下述程序。
<For語句開始>對于所有的詞a,作為屬于必要條件的聲明s的Use的情況執(zhí)行以下程序。
變量W_New中保存變量W_New保存的詞(群)以及作為屬于必要條件的詞a的聲明的Use的詞(群)。
<For語句結(jié)束>
<If語句開始>如果變量W_New的值與變量W_Odl的值相等,變量Fix_Point中保存值True。
否則,變量W_Old中保存變量W_New的值。
<If語句結(jié)束>
<While語句結(jié)束>
<結(jié)束>
在上述算法中,函數(shù)Statement(a,S)是返回定義Lyee必要條件S中的詞a的聲明的函數(shù)。即,返回如Def(sa)={a}(表示詞a的聲明sa的Def是詞a)的聲明sa∈S(必要條件包含的詞a的聲明s)。
如圖9,在流程圖中顯示上述函數(shù)UseDirectAndIndirect(s,S)的算法的。如下順次說明圖9的處理步驟。變量W_Old的區(qū)域中保存Use(s)[聲明s的直接Use,即詞(群)]的結(jié)果(步驟101),變量W_New的區(qū)域中復(fù)制W_Old的值(步驟102)。然后,區(qū)域Fix_Point中保存″假(flase)″(步驟103)。
通過步驟104的條件判定,若Fix_Point的值為假則前進(jìn)到步驟105。
在步驟105中,″Use(s)的結(jié)果與Word(s)的結(jié)果的和[聲明s的Use與必要條件S的全部聲明的詞]的詞的集合中是否有步驟106未執(zhí)行的詞a″的判定中,若結(jié)果為真則前進(jìn)到步驟106。在步驟106中,變量W_New的區(qū)域保存變量W_New的值與Use(Statement(a,S))[詞a的聲明的Use]的值。
步驟106結(jié)束后,返回步驟105再次執(zhí)行判定。只要步驟105判定結(jié)果為真,就重復(fù)由步驟105到步驟106的第1重新開始處理(111)。
在步驟105的判定中,結(jié)果為假時(shí),即,Use(s)的結(jié)果Word(s)的結(jié)果的和[聲明s的Use與必要條件S的全部聲明的詞]的詞的集合中,沒有未被執(zhí)行的詞a時(shí),前進(jìn)到步驟107。在步驟107中,″變量W_New的值是否與變量W_Old相等″的判定中,結(jié)果為假的情況下,前進(jìn)到步驟108,將變量W_New的值復(fù)制到變量W_Old的區(qū)域中,結(jié)果為真的情況下,前進(jìn)到步驟109,在區(qū)域Fix_Point中保存真。步驟108或步驟109結(jié)束后,返回到步驟104再次進(jìn)行判定。只要步驟104的判定結(jié)果為真,重復(fù)進(jìn)行步驟104到步驟109的第2重新開始處理(112)。
Fix_Point的值為真且步驟104的判定結(jié)果為假時(shí),由步驟104前進(jìn)到步驟110,作為函數(shù)UseDirectanIndirect(s,S)的結(jié)果,返回變量W_New的值。
3.必要條件調(diào)試
(3-1)非活性聲明(Dead Statements)
如果某個(gè)聲明一定不執(zhí)行,就認(rèn)為該聲明為非活性的。非活性的聲明由很多的原因引起。被熟知的原因之一是聲明中存在不相容的前提條件。實(shí)際上,與給出的聲明相關(guān)聯(lián)的前提條件總是出現(xiàn)錯(cuò)誤,這個(gè)聲明就沒有意義,作為結(jié)果與其相關(guān)聯(lián)的謂語向量(predicatevectors)完全不能被執(zhí)行。這是由方法的錯(cuò)誤引起的,所以必須告知用戶。為檢出這種類型的非活性的代碼,可以只分析與聲明相關(guān)聯(lián)的前提條件。與給出的聲明相關(guān)聯(lián)的前提條件總為假時(shí),如果能在靜態(tài)下證明(進(jìn)行評價(jià)時(shí),被提醒到得到前提條件中被使用的所有的詞的值的是不必要的。即,若條件″Φ∧_Φ″與Φ值無關(guān)、常為假),該聲明就為非活性的。而且,使用非活性聲明的其它聲明都是非活性的。若更正式的表示,若聲明s為非活性的,s’≤s中的s’也為非活性的(≤表示左邊的聲明的詞包含在右邊的聲明的Use中)。
(3-2)循環(huán)聲明(Cyclic Statements)
(3-2-1)循環(huán)聲明的非正式的定義
任意的聲明的詞的直接或者間接的定義包含該詞自身的情況下,稱聲明為循環(huán)的。換言之,就是任意詞″a″的定義中需要″a″的情況。以下,示出幾個(gè)具體的例子。
表9是″a″使用其自身進(jìn)行定義的直接循環(huán)的例子。
(表9)
循環(huán)聲明詞a
其次示出間接循環(huán)的例子。表10中,詞″a″的定義除了其它的詞以外還需要詞″b″的定義。但是,詞″b″的定義也需要詞″a″的定義。因此,詞″a″與″b″陷入間接循環(huán)中。
(表10)
循環(huán)聲明詞″a″、詞″b″
(3-2-2)循環(huán)聲明的正式定義
以下示出循環(huán)聲明的正式定義。S作為聲明的集合,與下述的條件一致時(shí),聲明s∈S(聲明s屬于必要條件S)進(jìn)行循環(huán)。
Def(s)∈UseDirectAndIndirect(s,S)
即,Def(s)∈UsedirectAndIndirect(s,S)形式上表示″聲明s的Def包含在屬于必要條件S的聲明s的直接以及間接Use中″。
根據(jù)下述函數(shù)CyclicStatements(S)的算法,能夠檢出任意的Lyee必要條件S中的循環(huán)聲明。
CyclicStatements(Sset of statements)Var CyclicSetset of statementsBeginCyclicSet←_For all s∈S doIf(Def(s)∈UseDirectAndIndirect(s))Then CyclicSet←CyclicSet∪{s}EndIfEndForreturn CyclicSetEnd
上述函數(shù)CyclicStatements(S)的算法為如下意思。
S是作為必要條件的聲明的集合。變量CyclicSet是聲明的集合。
<開始>
變量CyclicSet中保存″0″。
<For語句開始>對于屬于聲明的集合S的所有的聲明s,執(zhí)行以下語句。
<If語句開始>若Def(s)[聲明s的詞]包含在UseDirectAndIndirect(s)[聲明s的直接以及間接Use]中
變量CyclicSet中保存變量CyclicSet的值與{s}″聲明s″。
<If語句結(jié)束>
<For語句開始>
返回變量CyclicSet的值。
<結(jié)束>
圖10是表示該函數(shù)CyclicStatements(S)的算法的流程圖。以下s依次說明圖10的處理步驟。首先,變量CyclicSet的區(qū)域保存″0″(步驟201),進(jìn)行″聲明的集合S中是否有未執(zhí)行步驟202處理的聲明s″的判定(步驟202)。判定為真的情況下,進(jìn)行″Def(s)[聲明s的詞]是否屬于UseDirectAndIndirect(s)[聲明s的直接以及間接Use]″的判定(步驟203),判定為真的情況下,變量CyclicSet的區(qū)域保存CyclicSet的值與聲明s(步驟204),返回步驟202的判定。步驟203的判定為假的情況下,直接返回步驟202的判定并再次執(zhí)行。只要步驟202的判定為真,重復(fù)進(jìn)行步驟202到204的重新開始處理(206)。
步驟202的判定結(jié)果為假時(shí),前進(jìn)到步驟5,作為函數(shù)CyclicStatement測得結(jié)果,返回變量CyclicSet的值(聲明的集合)。
循環(huán)聲明的驗(yàn)證必須是應(yīng)該在聲明上進(jìn)行的最初的靜態(tài)分析,這點(diǎn)是重要的。因此,本說明書中,以下所述的靜態(tài)分析前提是分析結(jié)果中沒有循環(huán)。
(3-3)不完全聲明(Incomplete Statements)
(3-3-1)不完全聲明的非正式定義
聲明S的集合(Lyee必要條件),如果其至少包含一個(gè)使用一個(gè)以上在S中未直接和間接定義的詞的聲明s,可以稱為不完全的。上述定義抓住″所有被使用的詞必須要定義″的原則。
表11是不完全聲明的具體例子。在此,詞″a″使用詞″i″,但詞″i″還未被定義。
不完全聲明
(表)11
為簡單說明不完全聲明的概念,最初引入下面的表述法。Defined(S)
存在任意的聲明的集合S(必要條件S)時(shí),函數(shù)Defined(S)返回在S中定義完成的詞的集合。更加正式的如以下的表述。
上述表示函數(shù)Defined(S)是″作為屬于必要條件S的所有的聲明s的Def的結(jié)果的詞的全體集合″的。但是,所謂定義完成是存在該詞的聲明,并不是聲明的所有項(xiàng)目的必要信息都滿足。例如,也有盡管是輸出詞,但定義式與條件式是未定義的情況。這樣的聲明為Use(s)={}。不完全聲明中即使是定義完成,也能包含未輸入的未定義的定義式以及條件式。
使用下圖說明不完全聲明的定義。
X是作為必要條件S的所有的聲明s的直接以及間接Use的詞的集合。Y是必要條件S中定義完成的詞的集合。Z是X與Y的交集,即,在必要條件S的任意一個(gè)聲明中被使用并且作為定義完成的詞的集合。W是必要條件的聲明中被使用的詞中的、在必要條件中未定義的詞的集合。Q是″必要條件的任一聲明中被使用,并且定義完成的詞的集合″Z中、未定義聲明的定義式以及條件式的未輸入的詞。
因此,不完全聲明是″必要條件S的聲明中使用的詞中的、必要條件S中未定義的詞的集合″W的聲明和″必要條件S的任一的聲明中使用比你關(guān)切定義完成的詞的集合″Z中的未定義定義式以及條件式的未輸入的詞的集合Q的聲明之和。
圖11的流程圖表示用于取出不完全聲明的處理。首先,分別在變量IncompleteSet、變量X、變量q中保存值″0″(步驟301)。然后,在步驟302中判定″必要條件S中是否存在未執(zhí)行步驟303處理的聲明s″。如判定結(jié)果為真,前進(jìn)到步驟303,變量X中保存變量X的值與UseDirectAndIndirect(s,S)的值。步驟303結(jié)束后,返回步驟302再次執(zhí)行。只要步驟302的判斷為真,則重復(fù)步驟302到步驟303的第1重新開始處理。
步驟302的判斷結(jié)果為假的情況下,前進(jìn)到步驟304,變量Y保存函數(shù)Definded(S)[返回必要條件中定義完成的詞的集合]的結(jié)果,變量Z保存X∩Y[必要條件S的聲明中使用的詞,并且在必要條件S中定義完成的詞的集合],變量W保存X-Z[由必要條件S的聲明中使用的詞的集合減去Z的詞的集合。即,為必要條件S的聲明中使用的詞,但在必要條件S中未定義的詞的集合]。
然后,在步驟305中判斷″必要條件S中是否存在未執(zhí)行步驟306處理的詞a″。若判斷結(jié)果為真,在步驟306中判斷″是否IO(Statement(a,S))≠IS或IF[詞a未輸入],并且Use(Statement)(a,S)={}[詞a的聲明的直接Use為空,即未定義詞a的定義式以及條件式]″。若判斷結(jié)果為真,在步驟307中變量q保存變量q的值和詞a,返回步驟305再次執(zhí)行。只要步驟305的判斷為真,則重復(fù)步驟305到步驟307的第2重新開始處理。
步驟305的判斷為假的情況下,前進(jìn)到步驟308,變量Q中保存Z∩q[必要條件S的聲明中被使用并定義完成的詞(=Z),并且未定義定義式以及條件式的未輸入的詞(=q)]的值,變量IncompleteSet中保存W∪Q[必要條件S的聲明中使用的但未定義的詞(=W)和上述Q的詞]的所有的聲明。最后,作為必要條件S中的不完全聲明,返回變量IncompleteSet的值(步驟309),結(jié)束處理。
(3-4)無用聲明
(3-4-1)無用聲明的非正式定義
任意的Lyee必要條件S中的聲明s若對S的任何的輸入詞的定義沒有直接或間接的貢獻(xiàn),該聲明s被認(rèn)為是無用的。該定義抓住″必須使用各定義完成的詞″的原則。所謂“使用”是″直接或間接對輸出詞的定義有貢獻(xiàn)″的意思。無用的定義和不完全的定義合起來,抓住以下的原則定義了的必須全部使用,使用的必須全部定義。
表12是無用聲明的具體例子。在此,詞j對任何的輸出詞的定義沒有直接或間接的貢獻(xiàn)。因此,詞j未對程序的執(zhí)行帶來否定的效果,所以可以從必要條件中去掉。
(表12)
無用聲明
為正式定義無用聲明的概念,引入以下的概念。
OutputStatements(S)
存在任意的聲明的集合S時(shí),函數(shù)OutputStatements(S)由S中返回作為輸入/輸出屬性具有OS或OF的聲明。正式的表述如以下定義。
OutputStatements(S)={s∈S|IO(S)=OS or IO(S)=OF}
上述正式的表述的意思是函數(shù)OutputStatements(S)的結(jié)果是″屬于聲明的集合S的聲明s,該聲明s的該IO(輸入輸出屬性)項(xiàng)目的值是OS(對畫面的輸出)或OF(對文件的輸出)的聲明″。
根據(jù)下述的函數(shù)OutputStatements(S)的算法,由任意的Lyee必要條件S中可以導(dǎo)出作為輸出/輸出屬性為輸出(OS或OF)的聲明OutputStatements。
OutputStatements(Sset of statements)Var OututSet set of statementsBeginOutputSet←_For all s∈S doIf(IO(s)=”O(jiān)S”or IO(s)=”O(jiān)F”)Then OutputSet←OutputSet∪{s}EndIfEndForreturn OutputSetEnd
上述函數(shù)OutputStatements(S)的算法的意思如下。
S是作為必要條件的聲明的集合。變量OutputSet是聲明的集合。
<開始>
變量OutputSet的區(qū)域中保存″0″。
<For語句開會(huì)>對屬于聲明的集合S的所有的聲明s進(jìn)行以下處理。
<If語句開始>若聲明s的IO[輸入輸出屬性]為OS[對畫面的輸出]或OF[對文件的輸出]的情況下,
變量OutputSet的區(qū)域保存變量OutputSet的值和聲明s。
<If語句結(jié)束>
<For語句結(jié)束>
作為函數(shù)OutputStatements(S)的結(jié)果,返回OutputSet的值(聲明的集合)。
根據(jù)以上的定義,容易定義以下部分所示的正式的無用聲明。
圖12是表示該函數(shù)OutputStatements(S)的算法的流程圖。以下說明圖12的處理。首先,變量OutputSet的區(qū)域中保存″0″(步驟401)。然后,在步驟402中判斷″聲明的集合S中是否存在未進(jìn)行步驟403處理的聲明s″。步驟402的判斷結(jié)果為真時(shí),前進(jìn)到步驟403,判斷″聲明s的IO[輸入輸出屬性]是否是OS[對畫面的輸出]或OF[對文件的輸出]″。步驟403的判斷結(jié)果為真的情況下,變量OutputSet的區(qū)域保存變量OutputSet的值與聲明s,返回到步驟402。步驟403的判斷結(jié)果為假的情況下,直接返回到步驟402并在此執(zhí)行。只要步驟402的判斷結(jié)果為真,則重復(fù)步驟402到步驟404的重新開始處理。
若步驟402的結(jié)果為假,作為函數(shù)OutputStatement的結(jié)果,返回OutputSet的值。
(3-4-2)無用聲明的正式定義
對無用聲明的正式定義進(jìn)行說明。將S作為聲明的集合,S中的無用聲明由SuperfluouStatements(S)表示,進(jìn)行如下的正式定義。
上述正式的表述意思是函數(shù)SuperfluousStatements(S)的結(jié)果是″由聲明的集合S中除去屬于S的所有的聲明s的直接或間接Use的詞的聲明的集合,即如S的輸出詞的聲明的聲明的集合″。
通過下述函數(shù)SuperfluouStatements(S)的算法,能夠檢出任意的Lyee必要條件中的無用聲明。
SuperfluousStatements(Sset of statements)Var Super fluous′StatSet,ImportantStatSet,OutputStatSetset of statementsBeginOutputStatSet←OutputStatements(S)ImportantStatSet←_For all s∈OutputStatSet.doFor all a∈UseDirectAndIndirect(s,S)doImportantStatSet←ImportantStatSet∪{Satement(a,S)}EndForEndForSuper fluous StatSet←S-ImportantStatSetreturn Super fluous StatSetEnd
上述函數(shù)SuperfluousStatements(S)的算法的意思如下。
作為S必要條件是聲明的集合。變量SuperfluousStatement、變量ImportantStatSet、變量OutputStatSet是聲明的集合。
<開始>
變量OutputStatSet的區(qū)域保存函數(shù)OutputStatements(S)[屬于必要條件的所有的聲明]的結(jié)果。
變量ImportantStatSet中保存″0″。
<For語句開始>對屬于OutputStatSet的所有的聲明s進(jìn)行以下的處理。
<For語句開始>對屬于UseDirectAndIndirect(s,S)[必要條件S中的聲明s的直接或間接Use]的所有的詞a執(zhí)行以下處理。
變量ImportantStatSet的區(qū)域保存變量ImportantStatSet的值和詞a的聲明。
<For語句結(jié)束>
<For語句結(jié)束>
變量SuperfluousSet的區(qū)域保存由必要條件S中除去變量ImportantStatSet的值的聲明集合。
作為結(jié)果返回變量SuperfluousSet的值。
<結(jié)束>
圖13是表示該函數(shù)SuperfluousStatements(S)算法的流程圖。以下對圖13的處理進(jìn)行說明。首先,變量OutputStatSet的區(qū)域保存函數(shù)OutputStatements(S)[屬于必要條件的所有的輸出聲明]的結(jié)果,變量ImportantStatSet中保存″0″(步驟501)。然后,判斷“變量OutputStatSet中是否存在未執(zhí)行步驟503的聲明s”(步驟502)。步驟502的結(jié)果為真時(shí),步驟503判斷“UseDirectAndIndirect(s,S)[聲明s的直接或間接Use中是否存在未執(zhí)行步驟504的詞a]”。若步驟503的結(jié)果為真,前進(jìn)到步驟504,在變量ImportantStatSet的區(qū)域保存ImportantStatSet的值與Statement(a,S)[詞a的聲明]的結(jié)果。步驟504結(jié)束后,返回步驟503再次執(zhí)行。只要步驟503的判斷結(jié)果為真,則重復(fù)步驟503到504的第1重新開始處理。
步驟503的結(jié)果為假時(shí),返回到步驟502再次執(zhí)行。只要步驟503的結(jié)果為假,就重復(fù)步驟502到步驟504的第2重新開始處理。步驟502的結(jié)果為假時(shí),前進(jìn)到步驟505,在變量SuperfluousSet中保存由必要條件S中除去變量ImportantStatSet的值的聲明的集合,在步驟506中作為函數(shù)SuperfluousStatements(S)的結(jié)果,返回變量SuperfluousSet的值。
4.聲明列的最佳順序
(4-1)通過謂語向量的順序優(yōu)化
如上所述,在Lyee方法論中用戶輸入的自己的必要條件的聲明順序?qū)εc這些相關(guān)的程序的執(zhí)行結(jié)果沒有任何影響。并且,該事實(shí)是該方法論的巨大貢獻(xiàn)之一。盡管如此,我們建立的與這些相關(guān)的謂語向量的順序可能對生成的代碼的效率(執(zhí)行時(shí)間)有相當(dāng)?shù)挠绊懥?。在具體例中進(jìn)一步說明該問題。假設(shè)給出如表13的初期必要條件的情況。
(表13)
另外,假設(shè)與這些各個(gè)聲明相關(guān)連的生成的W04pallet的謂語向量如表14的(a)所示的順序。(例如L4a是詞a的謂語向量。)
(表14)
(a)未選擇的謂語向量 (b)選擇的謂語向量
以下,對表14的(a)的程序需要的執(zhí)行時(shí)間進(jìn)行簡潔地說明。執(zhí)行初始化向量(S4)后,在第一個(gè)重復(fù)中嘗試程序執(zhí)行L4a將值給予詞a,取得值失敗。因?yàn)?,詞a的計(jì)算需要還未計(jì)算的詞b。因此,在該第一次重復(fù)中,處理詞d,將值給予任何詞的嘗試都失敗。在第二個(gè)重復(fù)中,程序?qū)⒅捣峙浣o詞c成功。在第三重復(fù)中,計(jì)算詞b的值,最后在第四重復(fù)中算出詞a的值??傊?,該程序?yàn)樗愠鏊械脑~的值,需要進(jìn)行四次重復(fù)。
但是,由表14的(b)的程序替換表14的(a)的程序,徹底減少需要對所有的詞賦值的重復(fù)的數(shù)。事實(shí)上,只在一次的重復(fù)中,程序能夠計(jì)算對所有指定的詞的值。由此可以得出結(jié)論謂語向量的執(zhí)行順序?qū)Τ绦虻膱?zhí)行時(shí)間有很大的影響。因此,對于由Lyee必要條件生成代碼的工具(例如Lyee),為減少執(zhí)行時(shí)間,使謂語向量并列是有益的。并能夠自動(dòng)地并且在靜態(tài)下生成謂語向量的最佳排列。即,對于Lyee必要條件的聲明列進(jìn)行最佳排列。
(4-2)最佳順序的非正式定義
以下,非正式的定義最佳順序的聲明列。如果各詞的定義在聲明列S中在自身被使用前出現(xiàn),聲明列S,可以叫做最佳順序。聲明的條件是,定義任意的詞的聲明必須在聲明列S中使用的該聲明的所有的聲明之前出現(xiàn)。
表15是未排順序的聲明列的具體例。
(表15)
未排順序的聲明
一方面,表16是排列后的聲明列。
(表16)
排列的聲明
為了從形式上定義順序排列的概念,引入以下函數(shù)的概念。
1)First
存在任意的聲明的排列<s1...,sn>時(shí),函數(shù)First返回作為該順序的最初的要素s1。
2)AddFirst
存在任意的聲明的排列<s1...,sn>與聲明s0時(shí),函數(shù)AddFirst返回<s0,s1...,sn>,即,這是在最初的順序列的開頭處添加s0。
3)Remove
存在任意的聲明的排列S與聲明s時(shí),由函數(shù)Remove除去與s相同的聲明(假定S不是多次含有相同的聲明)。
4)Lower
存在任意2個(gè)聲明s與s′時(shí),如果Def(s)∈Use(s′),則Lower(s,s′)為真。下述的函數(shù)Lower(s,s′)的算法提出該Lower的定義。
Lower(s,s′statement)
Begin
If Def(s)∈Use(s′)
Then return true
Else return false
EndIf
End
上述函數(shù)Lower(s,s′)的算法的意思如下?!啊?br> <開始>
<If語句開始>如果Def(s)[聲明s的詞]屬于Use(s′)[聲明s′的Use],返回真(true)
否則返回假(flase)
<If語句結(jié)束>
<結(jié)束>
圖14是表示該函數(shù)Lower(s,s′)的算法的流程圖。如下說明圖14的處理。首先,進(jìn)行步驟601的判定″Def(s)[聲明s的詞]是否屬于Use(s′)[聲明s′的Use]″。判定結(jié)果為真時(shí),作為函數(shù)的結(jié)果返回″真true″(步驟602)。判斷結(jié)果為假時(shí),作為函數(shù)的結(jié)果返回″假flase″(步驟603)。
5)Min
存在任意的聲明的排列時(shí),函數(shù)Min返回聲明s,s是S中的聲明,S中無其它的聲明s′,使Lower(s,s′)為真。下述的函數(shù)Min(S)的算法提出該定義。
Min(Snot empty sequence of statements)Var sa statementBegins←First(S)For all s′∈S-{s}doIf Lower(s′,s)Then s ←s′EndIfEndForreturn sEnd
上述函數(shù)Min(S)的算法的意思如下。
S是不為空集合的聲明列。變量s是一個(gè)聲明。
<開始>
將函數(shù)First(S)[返回聲明列的開頭的聲明]的結(jié)果保存在變量s中。
<For語句開始>對屬于由聲明列S中除去變量s的值(聲明)的聲明列的所有的聲明s′執(zhí)行以下程序。
<If語句開始>如果函數(shù)Lower(s,s′)為真[聲明s′的詞在變量s的聲明的定義中被使用],變量s中保存聲明s′。
<If語句結(jié)束>
<For語句結(jié)束>
返回變量s的值
<結(jié)束>
圖15是表示該函數(shù)Min(S)的算法的流程圖。如下說明圖15。首先,將First(S)[返回聲明列的開頭的聲明]的結(jié)果保存在變量s中(步驟701)。其次,在步驟702中判定″在由聲明列S中除去變量s的值(聲明)的聲明列中是否存在在步驟703中未執(zhí)行的聲明s′″。判定結(jié)果為真時(shí),前進(jìn)到步驟703,判定″函數(shù)Lower(s,s′)是否為真[聲明s′的詞在變量s中被使用]″,如果結(jié)果為真,在變量s中保存聲明s′(步驟704),返回到步驟702。如果步驟703的結(jié)果為假時(shí),直接返回到步驟702。只要步驟702的結(jié)果為真,重復(fù)步驟702到步驟704的重新處理(706)。
如果步驟702的結(jié)果為假,前進(jìn)到步驟705,作為函數(shù)Min(S)的結(jié)果返回變量s的值。
根據(jù)以上的定義,容易正式地定義聲明列地最佳順序。
(4-3)最佳順序的正式定義
正式定義聲明列的最佳順序。S為聲明列,屬于由StatementOrdering(S)示出的S的聲明列的順序的排列,進(jìn)行如下的正式定義。
上述形式的定義的意思是,函數(shù)StatementOrdering(S)的結(jié)果是″聲明的排列S若為空,則函數(shù)的結(jié)果為空。否則,為AddFirst(Min(S),StatementOrdering(Remove(S,Min(S))))″。關(guān)于AddFirst(Min(S),StatementOrdering(Remove(S,Min(S))))的意思,通過后述的函數(shù)StatementOrdering(S)的流程圖的說明進(jìn)行詳細(xì)敘述。
根據(jù)下述的函數(shù)StatementOrdering(S)的算法,可以進(jìn)行聲明列S的最佳排列。
StatementOrdering(Ssequence of statements)
Var mina statement
Begin
If S=_
Then return<>
Else min←Min(S)
return AddFirst(min,StatementOrdering(Remove(S,min)))
EndIf
End
上述函數(shù)StatementOrdering(S)的算法的意思如下。
S是聲明列。變量min是一個(gè)聲明。
<開始>
<If語句開始>聲明列S若為空集合,則返回空。
否則,將Min(S)[在聲明列S中,返回該定義中未使用其它的聲明的聲明]的結(jié)果的聲明保存在變量min中,
返回函數(shù)AddFirst(min,StatementOrdering(Remove(S,min)))的值
<If語句結(jié)束>
<結(jié)束>
關(guān)于函數(shù)AddFirst(min,StatementOrdering(Remove(S,min))),由以下的流程圖進(jìn)行詳細(xì)說明。
圖16是表示該函數(shù)StatementOrdering(S)的算法的流程圖。圖16的說明如下。首先,進(jìn)行步驟801的″必要條件的聲明列S是否為空集合″的判定,判定結(jié)果若為真,作為函數(shù)StatementOrdering(S)的結(jié)果,返回空并進(jìn)行處理。
步驟801的判定結(jié)果若為假,前進(jìn)到步驟802,變量min的區(qū)域內(nèi)保存函數(shù)Min(S)[在聲明列S中,返回該定義中未使用其它任意聲明的聲明]的結(jié)果,前進(jìn)到步驟803。在步驟803中,執(zhí)行函數(shù)Remove(S,min)[由聲明列S中除去變量min的值的聲明],前進(jìn)到步驟804。在步驟804中判定″函數(shù)Remove(S,min)的結(jié)果S′是否為固定值″,若判定結(jié)果為假,返回步驟803并再次執(zhí)行。只要步驟804的結(jié)果為假,就重復(fù)由步驟803到步驟804的第一重新處理(811)。
步驟804的判定結(jié)果為真時(shí),前進(jìn)到步驟805。在步驟805中執(zhí)行函數(shù)StatementOrdering(S′),前進(jìn)到步驟806。在步驟806中,判定″函數(shù)StatementOrdering(S′)的結(jié)果是否為固定值″,若判定結(jié)果為假,返回步驟801,并再次執(zhí)行步驟801。只要步驟806的結(jié)果為假,就重復(fù)步驟801到步驟806的第2重新開始處理(812)。
步驟806的結(jié)果為真時(shí),前進(jìn)到步驟807,執(zhí)行函數(shù)AddFirst(min,S”),然后前進(jìn)到步驟808。在步驟808中,判定″函數(shù)AddFirst(min,S”)的結(jié)果S_是否達(dá)到固定值″,若判定結(jié)果為假,返回步驟807并再次執(zhí)行。只要步驟808的判定結(jié)果為假,就重復(fù)由步驟807到步驟808的第3重新開始處理(813)。
步驟808的判定結(jié)果為真時(shí),前進(jìn)到步驟809,作為函數(shù)StatementOrdering(S)的結(jié)果,返回聲明列S_的值,結(jié)束函數(shù)處理。
5.分?jǐn)?Slicing)
程序的分?jǐn)嗉夹g(shù)可追溯到非專利文獻(xiàn)12。分?jǐn)嗍怯蓪⒊绦蚩s小為與特定的計(jì)算相關(guān)連的聲明的程序的抽取來考慮。在傳統(tǒng)的程序語言中,分?jǐn)鄬⒊绦蜃x解與調(diào)試作為″分?jǐn)唷⒅洹宓耐緩?更小的程序塊,即分?jǐn)鄩K比大的程序容易理解)長時(shí)間使用。另外,很多應(yīng)用程序的分析始終被使用,其目的各種各樣。例如,包括結(jié)合度的判定、算法的調(diào)試、反向管理、部分再使用、自動(dòng)并行化、程序合并以及補(bǔ)助驗(yàn)證。
在Lyee必要條件中,分?jǐn)嗫梢云鸬接刹煌挠^點(diǎn)分析必要條件的作用。特別是根據(jù)分?jǐn)?,可以從以下的觀點(diǎn)進(jìn)行分析。
1.對任意的詞的定義,直接或間接由貢獻(xiàn)的聲明是哪個(gè)?
2.能夠生成可以并行執(zhí)行的子程序塊的必要條件中,獨(dú)立的部分是哪個(gè)?
使用自動(dòng)工具,由上述的第1觀點(diǎn)進(jìn)行分析,為理解、維護(hù)Lyee軟件(必要條件)非常有用。實(shí)際上,由必要條件給出的聲明的數(shù)重大時(shí)(數(shù)百條),為通觀整體來理解、維護(hù)軟件,尋找依存于誰的何種定義,只要不慎重、操作麻煩,就容易引起錯(cuò)誤。
(5-1)單一分?jǐn)?
(5-1-1)單一分?jǐn)嗟姆钦蕉x
存在任意的詞a與聲明的集合S時(shí),Slice(a,S)是直接或間接對詞a的定義由貢獻(xiàn)的S中的所有的聲明。為明確分?jǐn)嗟母拍睿e具體例。
表17是作為聲明的集合的Lyee的必要條件。
(表17)
Lyee必要條件
S如果是在表17中給出的聲明的集合,詞a的分?jǐn)郤lice(a,S)在表18中示出。
(表18)
詞a的分?jǐn)郤lice(a,S)
分?jǐn)嗥渥陨硎潜匾獥l件的完全的集合,這是重要點(diǎn)。該分?jǐn)嗟母拍羁梢钥紤]為所說的″分?jǐn)嗫朔宓募夹g(shù),對理解或維護(hù)Lyee必要條件,特別是其包含大量聲明的情況非常有用。
(5-1-2)單一分?jǐn)嗟恼蕉x
存在任意的詞a與聲明的集合S時(shí),與S中的詞a相關(guān)的分?jǐn)嘤蒘lice(a,S)示出,進(jìn)行如下定義。
上述的正式定義的意思是,函數(shù)Slice(a,S)的結(jié)果是″屬于聲明的集合S的詞a的聲明與屬于該詞a的聲明的直接或間接Use的所有的詞b的聲明的集合的合集″。
根據(jù)下述的函數(shù)Slice(a,S)的算法,能夠生成與Lyee必要條件(聲明的集合)中的任意的詞相關(guān)的分?jǐn)唷?br> Sllce(aword,Sset of statements)Var slice_sset of statementssstatementBegins←Satement(a,S)slice_s←{s}For all b∈UseDirectAnd Indirect(s,S)doslice_s←slice_s∪{Satement(b,S)}EndForreturn slice_sEnd
上述的函數(shù)Slice(a,S)的算法的意思如下。
a為詞,S為作為必要條件的聲明的集合。變量slice_s是聲明的集合,變量s為一個(gè)聲明。
<開始>
變量s中保存函數(shù)Statement(a,S)[返回屬于必要條件S的詞a聲明]的結(jié)果。
變量slice_s中保存變量s的值。
<For語句開始>對屬于函數(shù)UseDirectAndIndirect(s,S)[返回屬于必要條件S的聲明s的直接或間接Use]的結(jié)果的所有的詞b執(zhí)行以下程序。
變量slice_s中保存變量slice_s的值與函數(shù)Statement(b,S)[返回屬于聲明S的詞的聲明]的結(jié)果。
<For語句結(jié)束>
返回變量slice_s的值
<結(jié)束>
圖17是表示該函數(shù)Slice(a,S)的算法的流程圖。以下說明圖17。首先,在步驟901中,變量s保存函數(shù)Statement(a,S)[返回屬于必要條件S的詞a的聲明]的結(jié)果,保存函數(shù)Statement(a,S)[返回屬于必要條件S的詞a的聲明]的結(jié)果。然后,前進(jìn)到步驟902,進(jìn)行″函數(shù)UseDirectAndIndurect(s,S)[返回屬于必要條件的聲明s的直接或間接Use]的結(jié)果中是否存在未執(zhí)行的詞b″的判斷。若判定結(jié)果為真,前進(jìn)到步驟903,變量slice_s保存變量slice_s的值與函數(shù)Statement(b,S)[返回屬于必要條件的詞b的聲明]的結(jié)果的聲明,返回步驟902并再次執(zhí)行。只要步驟902的結(jié)果為真,就重復(fù)由步驟902到步驟903的重新處理(905)。
步驟902的判定結(jié)果為假時(shí),前進(jìn)到步驟904,作為函數(shù)Slice(a,S)的結(jié)果,返回變量slice_s的值。
最重要的分?jǐn)嗍桥c一般輸出詞相關(guān)的分?jǐn)唷8鶕?jù)下述的函數(shù)ALLoutputSlice(S)的算法,能夠生成與任意的Lyee必要條件中的各輸出詞相關(guān)的分?jǐn)唷?br> AllOutputSlices(Sset of statements)
Var sliceSetset of slices
Begin
sliceSet←_
For all s ∈OutputStatements(S)do
sliceSet←sliceSet∪(Slice(Word(s),S))}
EndFor
return sliceSet
End
上述的函數(shù)ALLoutputSlice(S)的算法的意思如下。
S是作為必要條件的聲明的集合。變量sliceSet是分?jǐn)嗟募稀?br> <開始>
變量sliceSet的區(qū)域中保存″0″。
<For語句開始>對屬于函數(shù)OutputStatement(S)[返回必要條件S的所有的輸出詞的聲明]的所有的聲明s執(zhí)行以下程序。
變量sliceSet中保存變量sliceSet的值與函數(shù)Slice(Word(s),S)[返回屬于必要條件的聲明s的詞的分?jǐn)郵的結(jié)果。
<For語句結(jié)束>
返回變量sliceSet的值。
<結(jié)束>
圖18是表示該函數(shù)ALLOutputSlice(S)的算法的流程圖。以下說明圖18。首先,變量sliceSte的區(qū)域保存值″0″(步驟1001)。然后,在步驟1002中,判斷″函數(shù)OutputStatements(S)[返回必要條件中的所有的輸出詞的聲明]″中是否存在未執(zhí)行的聲明s。若判定結(jié)果為真,前進(jìn)到步驟1003,變量sliceSet的區(qū)域保存變量sliceSet的值與函數(shù)SliceSet(Word(s),S)[返回屬于必要條件S的聲明s的詞的分?jǐn)郵的結(jié)果。步驟1003結(jié)束后,返回到步驟1002并再次執(zhí)行。步驟1002的結(jié)果為假時(shí),前進(jìn)到步驟1004,返回變量sliceSet的值。(5-2)獨(dú)立分?jǐn)?Independent Slice)
分?jǐn)嗟募夹g(shù)也能容易地用在為了知道必要條件中獨(dú)立部分上。作為另一個(gè)″分?jǐn)嗫朔寮夹g(shù),尋找任意的必要條件中的獨(dú)立部分,對程序的理解與自動(dòng)并行化(parallelization)是有用方法。
(5-2-1)獨(dú)立分?jǐn)嗟姆钦蕉x
2個(gè)分?jǐn)嘟Y(jié)合S1與S2如果不存在與S1和S2二者有關(guān)系的聲明,則作為獨(dú)立聲明。示出獨(dú)立分?jǐn)嗟木唧w例。S為表17中示出的聲明的集合時(shí),Slice(d,S)如表19所示。
(表19)
詞d的分?jǐn)郤lice(d,S)
此時(shí),與表18的Slice(a,S)以及表19的Slice(d,S)二者由關(guān)系的聲明不存在。因此,能夠得到2個(gè)分?jǐn)郤lice(a,S)與Slice(d,S)獨(dú)立,并且能夠并列執(zhí)行的結(jié)論。
(5-2-2)獨(dú)立分?jǐn)嗟恼蕉x
如果以下的條件成立,2個(gè)分?jǐn)嗉蟂1和S2相獨(dú)立。
S1∩S2=Φ
上述表示不存在是S1的要素、并且是S2的要素的分?jǐn)?聲明的集合)。
考慮只有1個(gè)分?jǐn)嗉?,把握哪個(gè)分?jǐn)嗍欠癃?dú)立于其它的分?jǐn)嗟牟糠旨系那闆r。例如,我們生成與各自的輸出詞相關(guān)的分?jǐn)?,檢測這些分?jǐn)嗟莫?dú)立部分的情況。首先,介紹幾個(gè)對理解分?jǐn)嗟莫?dú)立部分集合的概念有幫助的定義。
2個(gè)獨(dú)立的分?jǐn)嗉?br> 將S1和S2作為2個(gè)分?jǐn)嗉稀H绻謹(jǐn)郤1∈S1(屬于分?jǐn)嗉蟂1的分?jǐn)郤1)與分?jǐn)郤2∈S2(屬于分?jǐn)嗉蟂2的分?jǐn)郤2)相獨(dú)立,則分?jǐn)嗉蟂1和S2相獨(dú)立。
最佳分?jǐn)嗉?br> 將S作為分?jǐn)嗉?。S1≠0且S2≠0,S1_S(分?jǐn)郤1屬于分?jǐn)嗉蟂)的所有的S1并且S2_S(分?jǐn)郤2屬于分?jǐn)嗉蟂)中,如果S1與S2不相互獨(dú)立,則S為最佳分?jǐn)嗉稀?br> 最佳并且獨(dú)立的分?jǐn)嗉?br> 將S1...Sn作為n個(gè)固定的分?jǐn)嗉?。如果,i為1≤i≤n的所有的Si為最佳分?jǐn)嗉希琷為1≤j≤n并且i≠j的Sj時(shí),如果所有的Si與Si為獨(dú)立分?jǐn)啵琒1...Sn為最佳并且獨(dú)立分?jǐn)嗉稀?br> 通過下述的函數(shù)IndependenSetOfSlice(S)的算法,能夠抽取輸出詞的分?jǐn)啵⑵浞蛛x為最佳并且獨(dú)立分?jǐn)嗉稀?br> IndependentSetOfSlices(Sset of statements)Var sliceMultiSetset of set of slicessliceSetset of slicesOutputWordsset of wordsNotTreatedWordsset of wordsBeginsliceMultiSet←_OutputWords←Word(OutputStatements(S))For all a∈OutputWords dosliceSet←Slice(a,S)OutputWords←OutputWords-{a}NotTreatedWords←OutputWordsFor all b∈NotTreatedWords doIf(UseDirectAndIndirect(Slice(b,S))∪)∩(UseDirectAndIndirect(Slice(a,S))∪{a})≠_sliceSet←sliceSet∪Slice(b,S)NotTreatedWords←NotTreatedWords-EndIFEndForsliceMultiSet←sliceSetEndForreturn sliceMultiSetEnd
上述的函數(shù)IndependenSetOfSlice(S)的算法的意思如下。
S是作為必要條件的聲明的集合。變量sliceMultiSet是分?jǐn)嗉?。變量sliceSet是分?jǐn)嗟募稀W兞縊utputWord、變量NotTreadWords是詞的集合。
<開始>
變量sliceSet的區(qū)域保存值″0″。
變量OutputWord的區(qū)域保存函數(shù)Word(OutputStatements(S))[返回必要條件S的所有的輸出詞的聲明的詞]的結(jié)果。
<For語句開始>對屬于變量OutputWords的值的所有的詞a執(zhí)行以下程序。
變量sliceSet保存函數(shù)Slice(a,S)[返回屬于必要條件S的詞a的分?jǐn)郵的值。
變量OutputWords的區(qū)域保存由變量OutputWords的值除去詞a的詞的集合。
變量NotTeateWords的區(qū)域保存變量OutputWords的值。
<For語句開始>變量NotTeateWords的區(qū)域保存變量NotTeateWords的值。
<If語句開始>如果,函數(shù)UseDirectAndIndirect(Slice(b,S))[詞b的分?jǐn)郲在詞b的定義中使用的詞的聲明的集合]的直接和間接Use]與b的合集和函數(shù)UseDirectAndIndirect(Slice(a,S))[詞b的分?jǐn)郲詞a的定義中使用的詞的聲明的集合]的直接或間接Use]與詞a的合集,兩個(gè)集合的交集不為空,即,如果有同時(shí)屬于2個(gè)集合的詞,
變量sliceSet的區(qū)域保存變量sliceSet的值與函數(shù)Slice(b,S),
變量NotTeateWords的區(qū)域保存由變量NotTeateWords的值除去詞b的詞的集合。
<If語句結(jié)束>
<For語句結(jié)束>
變量sliceMultiSet的區(qū)域保存變量sliceSet的值。
<For語句結(jié)束>
返回變量sliceMultiSet的值
<結(jié)束>
圖19是表示該函數(shù)IndependenSetOfSlice(S)的算法的流程圖。以下說明圖19。首先,變量sliceSet的區(qū)域保存值″0″,變量OutputWords的區(qū)域保存函數(shù)Word(OutputStatements(S))[返回必要條件的所有輸出詞的聲明的詞]的結(jié)果(步驟1101)。然后,在步驟1102中判定″在變量OutputWords的值中是否存在未執(zhí)行的詞a″,如果判定結(jié)果為真,前進(jìn)到步驟1103。在步驟1103中,變量sliceSet保存函數(shù)Slice(a,S)[返回屬于必要條件S的詞a的分?jǐn)郵的結(jié)果,變量OutputWords的區(qū)域保存由變量OutputWords的值除去詞a的詞的集合,變量NotTreatedWords的區(qū)域保存變量OutputWords的值。
然后,在步驟1104中,判定″變量NotTreatedWords的值中是否存在未執(zhí)行的詞b″,如果結(jié)果為真,前進(jìn)到步驟1105。
步驟1105判定″函數(shù)UseDirectAndIndirect(Slice(b,S))[詞b的分?jǐn)郲詞b的定義中使用的詞的聲明的集合]的直接或間接Use]與b的并集和函數(shù)UseDirectAndIndirect(Slice(a,S))[詞b的分?jǐn)郲詞a的定義中使用的詞的聲明的集合]的直接或間接Use]與詞a的并集,2個(gè)集合是否存在交集(即,是否存在同時(shí)屬于2個(gè)集合的詞)″。如果判定結(jié)果為真,前進(jìn)到步驟1106,變量sliceSet的區(qū)域保存變量sliceSet的值與函數(shù)Slice(b,S),變量NotTreatedWords的區(qū)域保存由變量NotTreatedWords的值除去詞b的詞的集合。步驟1106結(jié)束后,返回到步驟1104并再次執(zhí)行。只要步驟1104的判定未真,就重復(fù)步驟1104到步驟1106的第一重新處理(1109)。
步驟1104的判定結(jié)果為假時(shí),前進(jìn)到步驟1107,變量sliceMultiSet的區(qū)域保存變量sliceSet的值。步驟1107結(jié)束后,返回步驟1102并再次執(zhí)行只要步驟1102的判定結(jié)果為真,則重復(fù)由步驟1102到步驟1107的第2重新開始處理。
步驟1102的判定結(jié)果為假時(shí),前進(jìn)到步驟1108,作為函數(shù)IndependentSetOfSlice(S)的結(jié)果,返回變量sliceMultiSet的值。(5-2-3)最佳獨(dú)立分?jǐn)嗉系睦?br> 表示了最佳并且獨(dú)立的分?jǐn)嗉系木唧w例子。表20是以S表示的聲明的集合。
表(20)
必要條件
(1)輸出詞的分?jǐn)?br> 由S表示的、對應(yīng)S的輸出詞的分?jǐn)嗟募先缦隆?br> S={Slice(b,S),Slice(c,S),Slice(f,S),Slice(g,S),Slice(h,S)}
并且,這些分?jǐn)嗳缫韵碌谋硭尽?br> (表21)詞b的分?jǐn)鄐lice(b,S)
(表22)詞c的分?jǐn)鄐lice(c,S)
(表23)詞f的分?jǐn)鄐lice(f,S)
(表24)詞g的分?jǐn)鄐lice(g,S)
(表25)詞h的分?jǐn)鄐lice(h,S)
(2)最佳并且獨(dú)立分?jǐn)嗉?br> 可以由S中抽取的最佳并且獨(dú)立集合如以下所述。
·S1={Slice(b,S),Slice(c,S)}
以及
·S2={Slice(f,S),Slice(g,S), Slice(h,S)}
6.鍵入(Typing)
鍵入(參考非專利文獻(xiàn)12以及11)主要使用于在靜態(tài)下保證程序的幾個(gè)動(dòng)態(tài)的好的動(dòng)作特性。如果進(jìn)行鍵入,能夠在編譯時(shí)檢測程序執(zhí)行時(shí)頻繁發(fā)生的錯(cuò)誤。另外,鍵入技術(shù)經(jīng)常使用于開發(fā)的軟件確實(shí)進(jìn)行對幾個(gè)安全問題的處理(參考非專利文獻(xiàn)11)。
在這部分中,示出為進(jìn)行用于與檢測Lyee必要條件的詞的類型相關(guān)的錯(cuò)誤的分析、Lyee必要條件的簡化(即使步指定輸出詞的類型,也能夠由輸入的類型自動(dòng)地生成中間詞和輸出詞的類型),能夠怎樣的使用鍵入技術(shù)。并且,示出為處理與軟件開發(fā)相關(guān)的安全問題(例如,不使幾個(gè)機(jī)密信息由于軟件的原因而泄漏),如何簡單擴(kuò)大Lyee方法論。
鍵入的目的在于檢測由于類型的不正確處理引起的錯(cuò)誤。通過鍵入,在可能的情況下能進(jìn)行類型的修正或不足類型的生成。例如,用戶可以只指定輸入詞的類型的指定時(shí),相應(yīng)地所有詞的類型能夠自動(dòng)生成。為進(jìn)行類型錯(cuò)誤的檢測、更正錯(cuò)誤的類型或生成不足的類型,需要在最初明確定義被包含的運(yùn)算對象(operand)的類型。任意Lyee必要條件的鍵入在本部分以前說明的各種優(yōu)化或分析后進(jìn)行非常有益,這是重要點(diǎn)。換言之,在鍵入開始前,必須確認(rèn)任意的Lyee必要條件中不包含循環(huán)聲明、無用聲明、非循環(huán)性聲明。
(6-1)鍵入規(guī)則
鍵入的技術(shù)一般包含以下要素的使用。
(6-1-1)基本鍵入
在該項(xiàng)中,定義屬于任意的Lyee必要條件包含的詞、常數(shù)、運(yùn)算符的類型的不同的種類。
<值類型>
為簡單化,詞與定義的類型為邏輯型(boolean)、整數(shù)型或浮點(diǎn)型(floating point number)。為方便,將這些類型進(jìn)行如下再編。
Tval::=Tnum|Tbool
Tnum::=int|float
Tbool::=bool
上述定義可以理解為Tval(值的類型)是Tnum(數(shù)值的類型)或Tbool(邏輯值的類型)。Tnum是整數(shù)型或浮點(diǎn)型。最后,Tbool對應(yīng)邏輯型。
<運(yùn)算符的類型>
同樣,必須明確任意的Lyee必要條件中包含的邏輯以及算術(shù)運(yùn)算符的類型。關(guān)于個(gè)運(yùn)算符,該操作數(shù)(運(yùn)算對象)的類型和該結(jié)果的類型必須正確。任意的運(yùn)算符的類型一般取T1→T2的形式。為直觀理解,其意思是,運(yùn)算符被考慮為是作為輸入取類型T1的要素、并且返回類型T2的要素的函數(shù)。
當(dāng)然,幾個(gè)運(yùn)算符具有1個(gè)以上的操作數(shù)。因此,如果考慮1個(gè)類型其自身也具有2個(gè)類型的組的情況,考慮該事實(shí)簡單??傊?,某類型是Tval(值的類型)、2個(gè)類型的組T1×T2或T1→T2。如果更正式的表示,可以寫為以下形式。
T::=Tval|T1×T2|T1→T2
上述正式的表述的意思是,″任意的類型T是Tval(值的類型)、2個(gè)類型的組T1×T2或T1→T2″。
(6-1-2)常數(shù)鍵入(Constant Typing)
Lyee必要條件的鍵入中,符合聲明中包含的常數(shù)的類型如下。

上述表述的意思是,true或flase(真假值)的類型為bool(邏輯型),num(數(shù)值)的類型為int(整數(shù)型),num.num(浮點(diǎn)數(shù)值)的類型為float(浮點(diǎn)型)。
更加準(zhǔn)確地,如后述,為使1個(gè)類型與任意地常數(shù)相關(guān)連,使用下述的函數(shù)。
TypeOfOst(cstconstant)
Begin
Switch(cst)
EndSwifch
End
上述函數(shù)TypeOfCst(cst)的意思如下。
函數(shù)的自變量cst是常數(shù)。
<開始>
函數(shù)Switch(cst)的執(zhí)行
自變量常數(shù)cst為true或flase(真假值)時(shí),返回值bool(邏輯型)。
自變量常數(shù)cst為num(數(shù)值)時(shí),返回值int(整數(shù)型)。
自變量常數(shù)cst為num.num(浮點(diǎn)數(shù)值)時(shí),返回值float(浮點(diǎn)型)。
函數(shù)Switch結(jié)束
<結(jié)束>
常數(shù)鍵入可以根據(jù)以下的規(guī)則正式化。
上述正式的表述的常數(shù)的鍵入規(guī)則表示″屬于任意的Lyee必要條件ε的常數(shù)c的類型是不需前提條件只由函數(shù)TypeOfCst(c)返回的值″。(這以前的說明中,作為表示Lyee必要條件符號使用S,但是,在鍵入技術(shù)中習(xí)慣使用ε,所以使用ε。)
(6-1-3)詞的鍵入(Word Typing)
無論對于何種輸入詞,用戶都必須絕對正確鍵入該類型。對于輸入詞以外的詞,其類型被自動(dòng)地算出,并且保存在定義這些詞的聲明的″類型″區(qū)域中。存在所有知道的詞的情況下,如下述定義返回該類型的函數(shù)TypeOfWrd
TypeOfWrd(wword,εList of statements)
begin
return Type(Statement(w,ε))
End
上述函數(shù)TypeOfWrd(w,ε)的意思如下。
函數(shù)的變量w是屬于聲明表ε的詞。
<開始>
算出詞w的聲明(Statement(w,ε)),返回算出的聲明(Statement(w,ε)的結(jié)果設(shè)為s)的類型(Type(s))。
<結(jié)束>
詞的鍵入能根據(jù)以下的規(guī)則形式化。
上述形式化記述所示的詞的鍵入規(guī)則表示″將任意的Lyee必要條件ε作為待詞的環(huán)境的詞w的類型,是不需前提條件只由函數(shù)TypeOfWrd(w,ε)返回的值″。
(6-1-4)運(yùn)算符的鍵入(Operator Typing)
關(guān)于程序中使用的各運(yùn)算符的類型,需要更加嚴(yán)密。實(shí)際上,因?yàn)橛幸韵碌那闆r某個(gè)運(yùn)算符需要邏輯型的變量返回邏輯型的結(jié)果,但是,別的運(yùn)算符需要其它類型的變量返回別的類型的結(jié)果。參與Lyee必要條件的各運(yùn)算符的更加嚴(yán)密的類型,可以如下述的正式化。
上述形式化的定義意思如下。運(yùn)算符1)和2)作為輸入取1個(gè)值,返回1個(gè)值,運(yùn)算符3)到6)因?yàn)樽鳛榻Y(jié)果返回1個(gè)值,所以作為輸入需要2個(gè)值。
1)-u
一元運(yùn)算符-u的類型是給出Tnum(數(shù)值的類型)和返回Tnum(數(shù)值的類型)的函數(shù)。
2)not
邏輯型運(yùn)算符的1個(gè)not(邏輯否定的運(yùn)算符)的類型是給出邏輯型(bool)和返回邏輯型(bool)的函數(shù)。例如,如果將true(邏輯型)給予運(yùn)算符not,″not true″的結(jié)果為flase(邏輯型),如果給予flase(邏輯型),″not flase″的結(jié)果為true(邏輯型)。
3)+、-b、*
運(yùn)算符+(加法)、-b(減法)、*(乘法)的類型是給出Tnum(數(shù)值的類型)與Tnum(數(shù)值的類型)的組和返回1個(gè)Tnum(數(shù)值的類型)的函數(shù)。
4)<、<=、>=、>
運(yùn)算符<(左邊小于右邊)、<=(左邊小于右邊或等于右邊)、>=(左邊比右邊大或等于右邊)、>(左邊大于右邊)的類型是給出Tnum(數(shù)值的類型)與Tnum(數(shù)值的類型)的組和返回1個(gè)Tnum(數(shù)值的類型)的函數(shù)。
5)or、and
作為邏輯型的運(yùn)算符的or(邏輯和的運(yùn)算符)和and(邏輯積的運(yùn)算符)的類型是給出bool(邏輯型)與bool(邏輯型)的組和返回1個(gè)bool(邏輯型)的函數(shù)。例如,將true(邏輯型)與true(邏輯型)給予邏輯和的邏輯運(yùn)算符or,″true or true″的結(jié)果為true(邏輯型)。
6)=、<>
運(yùn)算符=(左邊等于右邊)、<>(左邊不同于右邊)是給出Tval(值的類型)與Tval(值的類型)的組和返回1個(gè)bool(邏輯型)的函數(shù)。
更具體的,返回任意的運(yùn)算符的類型的函數(shù)TypeOfOp可以進(jìn)行如下的定義。
TypeOfO(opoperator)
Begin
Switch(op)
EndSwitch
End
上述的函數(shù)TypeOfOp(Op)的意思如下。
自變量op為運(yùn)算符。
<開始>
函數(shù)Switch(op)的執(zhí)行
自變量的運(yùn)算符op為-u(一元運(yùn)算符)時(shí),返回Tnum→Tnum(取數(shù)值的類型,返回?cái)?shù)值的類型的函數(shù)型)。
自變量的運(yùn)算符op為not(邏輯運(yùn)算符)時(shí),返回bool→bool(取邏輯型,返回邏輯型函數(shù)型)。
自變量的運(yùn)算符op為+和-b時(shí),返回Tnum×Tnum→Tnum(取2個(gè)數(shù)值
的類型的組,返回?cái)?shù)值的類型的函數(shù)型)。
自變量的運(yùn)算符op為<、<=、>=、>時(shí),返回Tnum×Tnum→bool(取2個(gè)數(shù)值的類型的組,返回邏輯型的函數(shù)型)。
自變量的運(yùn)算符op返回bool×bool→bool(取2個(gè)邏輯型的組,返回邏輯型的函數(shù)型)。
自變量的運(yùn)算符op返回Tval×Tval→Tval(取2個(gè)值的類型的組,返回值的類型的函數(shù)型)。
函數(shù)Switch結(jié)束
<結(jié)束>
運(yùn)算符鍵入可以通過以下規(guī)則形式化。
上述形式化的技術(shù)表示的規(guī)則意味著,將任意的Lyee必要條件ε作為鍵入的環(huán)境的的運(yùn)算符op的類型是不需前提條件只由函數(shù)TypeOfOp(op)返回的值。
(6-1-5)表達(dá)式的鍵入(Expression Typing)
示出判定各種表達(dá)式的類型的方法。為簡化表達(dá)式的鍵入的說明,需要引入如下所示的以_表示的類型間的半順序關(guān)系。

在此,注意t rue(真)_flase(假)與flase(假)_true(真)二者成立時(shí),意思是true=flase。
使用上述的順序關(guān)系,可以將2個(gè)類型的上位的類型進(jìn)行以下定義。
上述記述意思是″T1和T2中上位的類型(Sup(T1,T2)),T1_T2時(shí)為T2,T2_T1時(shí)為T1″。
表達(dá)式Exp是如以下定義所示的″val(值)″、″id(識(shí)別符)″、″(Exp)(括號表達(dá)式)″、″op Exp(運(yùn)算符表達(dá)式)″、″Expop Exp(表達(dá)式運(yùn)算符表達(dá)式)″的任意一個(gè),所以
Exp=val|id||(Exp)|op Exp|Exp op Exp
根據(jù)以下函數(shù),每個(gè)表達(dá)式的種類能夠關(guān)連1個(gè)類型。
TypeOfExp(eexpression,εList of staternents)
Begin
Switch(e)
case creturn TypeOfCst(c)
case wreturn TypeOfWrd(w)
case(e1) return TypeOfExp(e1,ε)
case op e1(T1,T2)←TypeOfOp(op)
T′←TypeOfExp(e1,ε)
then return T′
else print ErrMsg,return TypErr
EndIfcase e1 op e2(T1,T2,T3)←TypeOfOp(op)
T′1←TypeOfExp(e1,ε)
T′2←TypeOfExp(e2,ε)
then if(T3≠bool)
then return Sup(T′1,T′2)
else return bool
EndIf
else print ErrMsg,return TypErr
EndIf
EndSwitch
End
上述的函數(shù)TypeOfExp(e,ε)的意思如下。函數(shù)的自變量e是屬于聲明表ε的表達(dá)式。
<開始>
函數(shù)Switch(e)的執(zhí)行
自變量e為c(常數(shù))時(shí),返回TypeOfCst(c)的值
自變量e為w(詞)時(shí),返回TypeOfWrd(w)的值
自變量e為″e(cuò)1″型(表達(dá)式)的表達(dá)式時(shí),返回TypeOfExp(e1,ε)的值
自變量e為″op e1″型(一元運(yùn)算符表達(dá)式)的表達(dá)式時(shí),
TypeOfOp(op)的值保存在(T1,T2)中,TypeOfExp(e1,ε)的值保存在T’中。
<If處理開始>如果為T’_T1(T1大于T’)的關(guān)系,返回T1。
否則,打印錯(cuò)誤信息(ErrMsg),返回TypErr。
自變量e為″e(cuò)1 op e2″型(表達(dá)式二元運(yùn)算符表達(dá)式)時(shí),
TypeOfOp(op)的值保存在(T1,T2,T3)中,TypeOfExp(e1,ε)的值保存在T’1中,TypeOfExp(e2,ε)的值保存在T’2中。
<If處理開始>如果為T’1_T1(T1比T’1大)并且T’2_T2(T2
比T’2大)的關(guān)系,
<If處理開始>并且,如果T3不是邏輯型,返回
Sup(T’1,T’2)。
否則,返回bool。
<If處理結(jié)束>
否則,打印錯(cuò)誤信息(ErrMsg),返回″TypErr″
<If處理結(jié)束>
函數(shù)Switch結(jié)束
<結(jié)束>
圖20是表示該函數(shù)TypeOfExp(e,ε)的流程圖。如下說明圖20。首先,判定″表達(dá)式e是否為常數(shù)″(步驟1201),若結(jié)果為真,返回函數(shù)TypeOfCst(c)[返回常數(shù)c的類型]的結(jié)果(步驟1202),結(jié)束處理。
如果步驟1201的結(jié)果為假,前進(jìn)到步驟1203,判定″表達(dá)式e是否為詞″,若判定結(jié)果為真,返回函數(shù)TypeOfWord(w)[返回詞w的類型]的結(jié)果(步驟1204),結(jié)束處理。
如果步驟1203的結(jié)果為假,前進(jìn)到步驟1205,判定″表達(dá)式e是否為″e(cuò)1″型(表達(dá)式)的表達(dá)式″,結(jié)果若為真,返回函數(shù)TypeOfExp(e1,ε)[返回屬于聲明表ε的的表達(dá)式e1的類型]的結(jié)果(步驟1206),結(jié)束處理。
如果步驟1205的結(jié)果為假,前進(jìn)到步驟1207,判定″表達(dá)式是否為″op e1″型(一元運(yùn)算符表達(dá)式)的表達(dá)式″,若判定結(jié)果為真,函數(shù)TypeOfOp(op)[返回運(yùn)算符op的類型]的值保存在(T1,T2)中,函數(shù)TypeOfExp(e1,ε)[返回屬于聲明表ε的的表達(dá)式e1的類型]的值保存在T’中(步驟1208)。步驟1208結(jié)束后,在步驟1209中判定″T’_T1[T1的類型比T’的類型大]是否為真″,若為真,在步驟1210中返回T’的值,結(jié)束處理。步驟1209的判定結(jié)果若為假,在步驟1211中輸出錯(cuò)誤信息(ErrMsg)并返回″TypErr″,結(jié)束處理。
步驟1207的判定結(jié)果若為假,前進(jìn)到步驟1212。在步驟1212中判定″表達(dá)式e是否為″e(cuò)1 op e2″型(表達(dá)式二元運(yùn)算符表達(dá)式)的表達(dá)式″,若判定結(jié)果為真,在步驟1213中,函數(shù)TypeOfOp(op)[返回運(yùn)算符op的類型函數(shù)]的值保存在(T1,T2,T3)中,函數(shù)TypeOfExp(e1,ε)[返回屬于聲明表ε的的表達(dá)式e1的類型]的值保存在T’1中,函數(shù)TypeOfExp(e2,ε)[返回屬于聲明表ε的的表達(dá)式e2的類型]的值保存在T’2中。步驟1213結(jié)束后,在步驟1214中,判定″是否為T’1_T1(T1的類型比T’1類型大)并且T’2_T2(T2的類型比T’2類型大)″。判定結(jié)果若為真,前進(jìn)到步驟1215,判定″T’3的類型是否不為邏輯型″,判定結(jié)果若為真,在步驟1216中返Sup(T’1,T’2)[返回T’1和T’2的2個(gè)類型的最上位的類型](步驟1216),結(jié)束處理。步驟1215的結(jié)果為假時(shí),在步驟1217中返回邏輯型,結(jié)束處理。步驟1214的結(jié)果為假時(shí),在步驟1218中輸出錯(cuò)誤信息(ErrMsg)并返回″TypErr″,結(jié)束處理。
步驟1212的結(jié)果若為假,結(jié)束處理。
該函數(shù)有怎樣的功能,舉具體例進(jìn)行說明。
表達(dá)式為″a+b″,″a″和″b″為類型為整數(shù)型(int)的輸入詞,該表達(dá)式具有″e(cuò)1 op e2(表達(dá)式1運(yùn)算符表達(dá)式2)″型,該表達(dá)式的情況為″e(cuò)1=a″、″op=+″、″e(cuò)2=b″。
因此,由于TypeOfOp(+)=Tnum×Tnum→Tnum(運(yùn)算符+的類型是取2個(gè)數(shù)值類型的組、返回?cái)?shù)值類型的函數(shù)型),所以(T1,T2,T3)=(Tnum,Tnum,Tnum),由于TypeOfExp(a)=TypeOfExp(b)=int(表達(dá)式a、表達(dá)式b都是類型為整數(shù)型的詞,所以TypeOfExp(a)=TypeOfWrd(a)=int、TypeOfExp(b)=TypeOfWrd(b)=int),所以T’1=int、T’2=int,根據(jù)上述的類型的半順序定義,能夠推導(dǎo)出int_Tnum(數(shù)值的類型與整數(shù)型相比為上位),所以T’1_T1(T’1=int、T1=Tnum)且T’2_T2(T’2=int、T2=Tnum)的條件成立,由于T3=Tnum,所以T3≠bool也成立。
因此,作為函數(shù)TypeOfExp(a+b)的最終結(jié)果返回的Sup(T’1,T’2)為Sup(int,int),所以能夠?qū)С鋈缦碌淖罱K結(jié)果。
TypeOfExp(a+b)=int(表達(dá)式a+b的類型為整數(shù)型int)
再舉1例,如果″a″的類型為浮點(diǎn)型(浮點(diǎn)數(shù))時(shí),此時(shí)表達(dá)式″a+b″的類型為浮點(diǎn)型。
因此,在TypeOfExp(a+b)中,a=float、b=float時(shí),有(T1,T2,T3)=(Tnum,Tnum,Tnum),因?yàn)門ypeOfExp(a)=float、TypeOfExp(b)=int(表達(dá)式a是類型為浮點(diǎn)型float的詞,表達(dá)式b是類型為整數(shù)型int的詞,所以,有TypeOfExp(a)=TypeOfWrd(a)=float、TypeOfExp(b)=TypeOfWrd(b)=int),所以T’1=float、T’2=int,根據(jù)上述的類型的辦順序定義,因?yàn)閕nt_float并且float_Tnum(數(shù)值的類型與整數(shù)型相比為上位),所以T’1_T1(T’1=float、T1=Tnum)并且T’2_T2(T’2=int、T2=Tnum)的條件成立,因?yàn)門2=Tnum,T3≠bool也成立。
因此,作為函數(shù)TypeOfExp(a+b)的最終結(jié)果返回的Sup(T’1,T’2)為Sup(float,int)=float(浮點(diǎn)型和整數(shù)型中上位的類型是浮點(diǎn)型)。
更形式化的表示表達(dá)式的類型能夠通過以下鍵入規(guī)則獲得。
上述形式化的記述所示的規(guī)則如下。
(Cst)表達(dá)式為常數(shù)時(shí)的規(guī)則
將任意的Lyee必要條件ε作為鍵入環(huán)境的常數(shù)c的類型是不需前提條件函數(shù)TypeOfCst(c)返回的值。
(Wrd)表達(dá)式為詞時(shí)的規(guī)則
將任意的Lyee必要條件ε作為鍵入環(huán)境的詞w的類型是不需前提條件函數(shù)TypeOfWrd(w,ε)返回的值。
(Op)表達(dá)式為運(yùn)算符時(shí)的規(guī)則
將任意的Lyee必要條件ε作為鍵入環(huán)境的運(yùn)算符Op的類型是不需前提條件函數(shù)TypeOfOp(Op)返回的值。
(ExpP)表達(dá)式為括號表達(dá)式時(shí)的規(guī)則
在前提條件″將任意的Lyee必要條件ε作為鍵入環(huán)境的表達(dá)式Exp的類型為T″成立時(shí),將任意的Lyee必要條件ε作為鍵入的環(huán)境的表達(dá)式(Exp)的類型為T。
(ExpU)表達(dá)式為″op Exp″時(shí)的規(guī)則
將前提條件″將任意的Lyee必要條件ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1→T2、表達(dá)式Exp的類型為T’1、T’1_T1時(shí)的類型為T″成立時(shí),將任意的Lyee必要條件ε作為鍵入的環(huán)境的表達(dá)式op Exp的類型是T’1。
(ExpBA)表達(dá)式為″Exp op Exp″,運(yùn)算結(jié)果不為邏輯型時(shí)的規(guī)則
前提條件″將任意的Lyee必要條件ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1×T2→T3、表達(dá)式Exp1的類型為T’1、表達(dá)式Exp2的類型為T’2、T’1_T1、T’2_T2并且T3≠bool″成立時(shí),將任意的Lyee必要條件ε作為鍵入環(huán)境的表達(dá)式Exp1 op Exp2的類型是Sup(T’1、T’2)。
(ExpBB)表達(dá)式為″Exp op Exp″,運(yùn)算結(jié)果為邏輯型時(shí)的規(guī)則
前提條件″將任意的Lyee必要條件ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1×T2→bool、表達(dá)式Exp1的類型為T’1、表達(dá)式Exp2的類型為T’2、T’1_T1并且T’2_T2″成立時(shí),將任意的Lyee必要條件ε作為鍵入的環(huán)境的表達(dá)式Exp1 op Exp2的類型是bool。
(6-1-6)聲明的鍵入
如果知道表達(dá)式的類型判定方法,進(jìn)行Lyee必要條件的任意的聲明的鍵入非常容易。以下的函數(shù)判定Lyee必要條件中的任意的聲明s的類型。
TypeOfStat(Id,Exp,Cand,io,T,Tsec)statement,εList of statements)BeginIf(io=IF)or(io=IS)and(r=””)Then print ErrMsgreturn 0Else If(TypeOfExp(Exp)?。絋ypErr)and(TypeOfExp(Cond)=bool)return(Id,Cond,io,TypeOfExp(Exp),Tsec)EndIfEndIfEnd
上述函數(shù)TypOfStat((Id,Exp,Cond,io,T,Tsec),ε)的意思如下。函數(shù)的自變量(Id,Exp,Cond,io,T,Tsec)是構(gòu)成將任意的Lyee必要條件的聲明表ε作為鍵入環(huán)境的任意的聲明的項(xiàng)目的值(id=詞的識(shí)別符、Exp=定義式、Cond=定義式執(zhí)行條件式、io=輸入輸出屬性、T=詞的值的類型、Tsec=表示詞的值的安全水平的類型)。
<開始>
<If處理開始>
如果oi=If或io=IS并且T為空[即,如果聲明為輸入字,所以沒
有類型信息],打印錯(cuò)誤信息,返回″0″[即,不能進(jìn)行類型判定]。
否則[即,聲明如果是輸出詞]
<If處理開始>如果函數(shù)TypeOfExp(Exp)[返回定義式Exp的類型]的結(jié)果為TypErr[定義式的類型為TypErr,即類型不能判定],并且,函數(shù)TypeOfExp(Cond)[返回條件式Cond的類型]的值若為邏輯型,
作為結(jié)果,返回(Id,Exp,Cond,io,TypeOfExp(Exp),Tsec)。
<If處理結(jié)束>
<If處理結(jié)束>
<結(jié)束>
圖21是表示該函數(shù)TypeOfStat((Id,Exp,Cond,io,T,Tsec),ε)的流程圖。以下說明圖21。首先,判定″聲明的io項(xiàng)目是IF[對文件的輸入]或IS[對畫面輸入],并且項(xiàng)目T是否為空[無類型信息]″(步驟1301)。如果判定的結(jié)果為真前進(jìn)到步驟1302,打印錯(cuò)誤信息(ErrMsg)并返回″0″,結(jié)束處理。
判定結(jié)果如果為假,前進(jìn)到步驟1303,判定″是否函數(shù)TypeOfExp(Exp)[返回定義式的類型]的結(jié)果為TypErr[即,類型不能判定],并且,函數(shù)TypeOfExp(Cond)[返回條件式Cond的類型]的值為邏輯型″。判定結(jié)果為真,在步驟1304中,返回(Id,Exp,Cond,io,TypeOfExp(Exp),Tsec)的值,結(jié)束處理。判定結(jié)果若為假,結(jié)束處理。
如果形式化表述,該函數(shù)的鍵入規(guī)則如下。
上述形式化記述表示的規(guī)則是″前提條件‘將任意的Lyee必要條件的聲明表ε作為鍵入環(huán)境、定義式Exp的類型為T1、同樣,定義式執(zhí)行條件式的類型為邏輯型、輸入輸出屬性不是IS以及IF’成立時(shí),將聲明的序列ε作為鍵入環(huán)境的聲明(Id,Exp,Cond,io,T,Tsec)的類型是(Id,Exp,Cond,io,T1,Tsec)。″
(6-1-7)Lyee必要條件的鍵入
存在任意的排列的聲明的序列ε時(shí),該表的類型判定如下。
TypeiOfLyee(<s1,...,sn>list of statements)
Varε0list of statements
Begin
ε0←<s1,...,sn>
For i=1 to n
EndFor
return εn
End
上述的函數(shù)TypeOfLyee(<s1,...,sn>)的意思如下。
自變量<s1,...,sn>為Lyee必要條件的聲明的序列,變量ε0為聲明的序列。
<開始>
變量ε0的區(qū)域保存聲明的序列<s1,...,sn>
<For處理開始>將1到n代入i,執(zhí)行以下程序
s’i中保存TypeOfStat(si,εi-1)的結(jié)果
εi中保存εi-1的結(jié)果
εi的i號要素置換為s’i
<For處理結(jié)束>
返回εn的值
<結(jié)束>
例如,n=3的函數(shù)TypeOfLyee(<s1,s2,s3>)如下。
變量ε0的區(qū)域中保存聲明的序列<s1,s2,s3>
<For處理開始>i=1時(shí),
s’1中保存TypeOfStat(s1,ε0)
ε1中保存ε0的結(jié)果
ε1的1號要素s1以s’1的值置換
i=2時(shí)
s’2中保存TypeOfStat(s2,ε1)的結(jié)果
ε2中保存ε1的結(jié)果
ε2的2號要素s2以s’2的值置換
i=3時(shí)
s’3中保存TypeOfStat(s3,ε2)的結(jié)果
ε3中保存ε2的結(jié)果
ε3的3號要素s3以s’3的值置換
<For語句結(jié)束>
作為結(jié)果,返回ε3的值<s’1,s’2,s’3>
<結(jié)束>
圖22是表示該函數(shù)TypeOfLyee(<s1,...,sn>)的流程圖。以下說明圖22。首先,變量ε0的區(qū)域保存聲明的序列<s1,…,sn>(步驟1401)。然后,將1加到i中(步驟1402),前進(jìn)到步驟1403。在步驟1403中,判定″i的值是否為n″,結(jié)果若為假,s’i中保存TypeOfStat(si,εi-1)的結(jié)果,εi的i號要素置換為s’i(步驟1404)。步驟1404結(jié)束后,返回步驟1402并再次執(zhí)行。只要步驟1403的結(jié)果為假,就重復(fù)由步驟1402到步驟1404的重新開始處理(1406)。
步驟1403的結(jié)果為真時(shí),在步驟1405中返回εn的值,結(jié)束處理。此時(shí),εn的值為<s’1,...,s’n>。
如果形式化表示,與該函數(shù)相關(guān)連的鍵入規(guī)則如下。
上述形式化記述表示的規(guī)則的意思是,″前提條件‘將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的聲明s1的類型為s’1,將s’1代入s1后的聲明的序列ε作為鍵入環(huán)境的<s2,...,s’n>的類型為<s’2,...,s’n>’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的聲明的序列<s1,...,sn>的類型為<s’1,...,s’n>″。
最終,與被排列的Lyee必要條件相關(guān)連的類型判定的完全的系統(tǒng)如下。
上述形式化記述表示規(guī)則如下。
(Cst)表達(dá)式為常數(shù)時(shí)的規(guī)則
將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的常數(shù)c的類型,是不需前提條件函數(shù)TypeOfCst(c)返回的值。
(Wrd)表達(dá)式為詞時(shí)的規(guī)則
將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的詞w的類型,是不需前提條件函數(shù)TypeOfWrd(w)返回的值。
(Op)表達(dá)式為運(yùn)算符時(shí)的規(guī)則
將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的運(yùn)算符Op的類型,是不需前提條件函數(shù)TypeOfOp(Op)返回的值。
(Expp)表達(dá)式為括號表達(dá)式時(shí)的規(guī)則
前提條件‘將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的表達(dá)式Exp的類型為T’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的表達(dá)式(Exp)的類型為T。
(ExpU)表達(dá)式為″op Exp″時(shí)的規(guī)則
前提條件‘將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1→T2、表達(dá)式Exp的類型為T’1、T’1_T1’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的表達(dá)式op Exp的類型為T’1。
(ExpBA)表達(dá)式為″Exp op Exp″,運(yùn)算結(jié)果不為邏輯型時(shí)的規(guī)則
前提條件‘將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1×T2→T3、表達(dá)式Exp1的類型為T’1、表達(dá)式Exp2的類型為T’2、T’1_T1、T’2_T2并且T3≠bool’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的表達(dá)式Exp1 op Exp2的類型為Sup(T’1,T’2)。
(ExpBB)表達(dá)式為″Exp op Exp″,運(yùn)算結(jié)果為邏輯型時(shí)的規(guī)則
前提條件‘將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境、運(yùn)算符op的類型為T1×T2→bool、表達(dá)式Exp1的類型為T’1、表達(dá)式Exp2的類型為T’2、T’1_T1并且T’2_T2’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為鍵入環(huán)境的表達(dá)式Exp1 op Exp2的類型為bool。
(6-2)個(gè)案研究
以下,示出表示在Lyee必要條件中應(yīng)用鍵入的重要性的2個(gè)例子。第1例表示鍵入系統(tǒng)如何正確檢測與類型違反相關(guān)的錯(cuò)誤。第2例表示鍵入系統(tǒng)由鍵入系統(tǒng)的類型的自動(dòng)生成。
<例I>
給出如表26的初始必要條件。如上所述,類型的驗(yàn)證前,首先需要聲明的最佳排列。因此,對于表27所示的必要條件的排列后的形式進(jìn)行類型的驗(yàn)證。
(表26)
初始條件
(表27)
排列后的必要條件
對表27的排列后的必要條件進(jìn)行鍵入分析,返回的結(jié)果表示在必要條件中存在如下的類型錯(cuò)誤。
·聲明d的錯(cuò)誤表達(dá)式(true)不是數(shù)值(int或float)。
·對聲明c的警告類型(int)被修正為(bool)。
·對聲明g的警告類型(int)被修正為(bool)。
·對聲明f的警告類型(float)被修正為(bool)。
·對聲明h的警告類型(int)被修正為(bool)。
通過鍵入生成正確類型的必要條件如表28所示。
(表28)
鍵入后的必要條件
<例II>
如上述,鍵入系統(tǒng)可以自動(dòng)生成輸入詞以外的所有的詞的類型。其特征如以下具體例所示。
如表29所示,給出的類型只是輸入詞的類型。對將該必要條件進(jìn)行排列后的必要條件(表30)應(yīng)用類型檢驗(yàn)的系統(tǒng),如表31的結(jié)果。
(表29)
初始必要條件
(表30)
排列后的必要條件
(表31)
鍵入后的必要條件
7.安全鍵入
下面,我們介紹對Lyee方法論處理安全等、軟件開發(fā)的其它的很多的情況如何處理。實(shí)際上,為了證明程序在敵對的環(huán)境被執(zhí)行時(shí)生成的代碼滿足數(shù)據(jù)機(jī)密性和完整性等的何種的安全方針,能夠簡單地?cái)U(kuò)大應(yīng)用以上示出的鍵入技術(shù)。其主要目標(biāo)是使以下情況成為可能,用戶將表示安全必要條件的安全標(biāo)號(″公開″以及″非公開″)與安全方針(例如,公開的詞不能保存非公開的詞的值等)一起明確給予各自定義的詞。由這些給出的信息,為使有發(fā)生安全違反的余地的微妙的設(shè)計(jì)上的缺陷明顯,可以使用自動(dòng)的程序檢驗(yàn)用鍵入技術(shù)。
例如,由在表32中給出的聲明中所示的安全標(biāo)號,擴(kuò)大必要條件。
(表32)
安全方針是禁止非公開的詞的值對公開的詞的影響。此外,必須認(rèn)為非公開的值加上別的值(非公開的或公開的)的結(jié)果也是非公開的。因此,其中公開的詞a接受非公開的值,所以在表32中所示的必要條件明顯不遵守安全方針。
(7-1)安全鍵入原則
與鍵入的驗(yàn)證相同,安全的驗(yàn)證也使用下述的要素。在該部分中,定義屬于任意的Lyee必要條件中出現(xiàn)的詞、常數(shù)、運(yùn)算符的不同的類型。
(7-1-1)基本的安全類型
<值的安全類型>
為簡單化,詞和常數(shù)的安全類型定為public(公開)和secret(非公開)。
TSval::=public|secret
上述定義意思是″值的安全類型(Tsval)是public(公開)和secret(非公開)″。
<運(yùn)算符的安全類型>
同樣,必須明確包括在Lyee必要條件中的邏輯運(yùn)算符以及算術(shù)運(yùn)算符的安全類型。關(guān)于各運(yùn)算符,需要明確該運(yùn)算符的安全類型和其結(jié)果的類型。任意的運(yùn)算符的安全類型通常取Ts1→Ts2的形式。
為直觀理解,形式化的記述意思是,1個(gè)運(yùn)算符可以看成是取作為輸入的安全類型Ts1時(shí),返回安全類型Ts2的函數(shù)。當(dāng)然,幾個(gè)運(yùn)算符取1個(gè)以上的操作數(shù)。因此,安全類型若看作其自身也存在1對安全類型,說明這樣的例子容易。
總之,安全類型是Tsval(1個(gè)值的安全類型)、1對安全類型Ts1×Ts2或Ts1→Ts2。
若更形式化表示,可以寫成如下的形式。
TS::=TSual|TS1×TS2|TS1→TS2
上述正式的記述意思是″安全類型(Ts)是Tsval、Ts1×Ts2或Ts1→Ts2″。
(7-1-2)常數(shù)的安全類型
進(jìn)行Lyee必要條件的安全檢查時(shí),聲明中被發(fā)現(xiàn)的常數(shù)的安全類型是如下述所示只是public。

即,常數(shù)為t rue(真)或flase(假)、num(數(shù)值)、num.num(浮點(diǎn)數(shù))時(shí),安全類型都為public(公開)。與鍵入的驗(yàn)證相同,可以通過以下的函數(shù)判定任意的常數(shù)的安全類型。
SecTypeOfCst(cstconstant)
Begin
return public
End
上述函數(shù)SecTypeOfCst(cst)的意思如下。
函數(shù)的自變量cst意思是常數(shù)。
<開始>
返回值public
<結(jié)束>
常數(shù)的安全類型可以通過以下的規(guī)則正式化。
上述正式的記述的意思是″作為Lyee必要條件的聲明的序列ε作為安全類型環(huán)境的常數(shù)c的安全類型,是不需前提條件SecTypeOfCst(c)的結(jié)果的值″。
(7-1-3)詞的安全類型
無論怎樣的輸入詞,用戶對于其安全類型必須絕對正確鍵入。關(guān)于其它的詞,安全類型自動(dòng)被算出并保存在定義這些詞的聲明的區(qū)域″安全″中。存在已經(jīng)知道的詞時(shí),如下定義返回詞的安全類型的函數(shù)SecTypeOfWrd。
SecTypeOfWrd(wword,εList of statements)
Begin
return Securlty(Statement(w,ε))
End
上述函數(shù)SecTypeOfWord(w,ε)的意思如下。
函數(shù)的自變量意思是屬于必要條件ε的任意的詞。
<開始>
返回屬于必要條件ε的詞w的聲明(Statement(w,ε))的安全類型的值(Security(*)、*是由Statement(w,ε)求出的聲明)
<結(jié)束>
詞的安全類型可以通過以下的規(guī)則正式化。
上述正式的記述的意思是″將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的詞w的安全類型,是不需前提條件SecTypeOfWrd(w,ε)的結(jié)果的值″。
(7-1-4)表達(dá)式的安全類型
下面,示出判定各類表達(dá)式的安全類型的方法。
為簡化表達(dá)式的安全類型的說明,需要引入以安全類型間的_s表述的半順序關(guān)系。
使用上述的半順序關(guān)系,可以如下定義2個(gè)安全類型中的上位的安全類型。
上述記述的意思是″Ts1和Ts2中的上位的類型(SecSup(Ts1,Ts2)),在Ts1_sTs2時(shí)為Ts1,在Ts2_sTs1時(shí)為Ts2″。
表達(dá)式為以下中的1個(gè),即,val(值)、id(詞的識(shí)別符)、(Exp)(括號表達(dá)式)、op Exp(運(yùn)算符表達(dá)式)或Exp op Exp(表達(dá)式運(yùn)算符表達(dá)式),
Exp=val|id|(Exp)|op Exp|Exp op Exp
通過以下函數(shù),每個(gè)表達(dá)式的各類能夠與安全類型相關(guān)連。
SecTypeOfExp(eexpression,εList of statements)BeginSwitch(e)case creturn SecTypeOfCst(c)case wreturn SecTypeOfWrd(w)case(e1) return SecTypeOfExp(e1,ε)case op e1return SecTypeOfOp(e1)case e1 op e2 TS1←SecTypeOfExp(e1,ε)TS2←SecTypeOfExp(e2,ε)returnSecSup(TS1,TS2)EndSwitchEnd
上述函數(shù)SecTypeOfExp(e,ε)的意思如下。
函數(shù)的自變量e是屬于必要條件ε的任意的表達(dá)式。
<開始>
函數(shù)Switch(e)的執(zhí)行
自變量e為c(常數(shù))時(shí),返回SecTypeOfCst(cst)的結(jié)果的值
自變量e為w(詞)時(shí),返回SecTypeOfWrd(w)的結(jié)果的值
自變量e為e1(表達(dá)式)時(shí),返回SecTypeOfExp(e1,ε)的結(jié)果的

自變量e為op e1時(shí)(運(yùn)算符表達(dá)式)時(shí),返回SecTypeOfExp(e1)的結(jié)果的值
自變量e為e1 op e1時(shí)(表達(dá)式運(yùn)算符表達(dá)式)時(shí),
Ts1中保存SecTypeOfExp(e1,ε)
Ts2中保存SecTypeOfExp(e2,ε)
返回SecSup(Ts1,Ts2)
函數(shù)Switch結(jié)束
<結(jié)束>
圖23是表示該函數(shù)SecTypeOfExp(e,ε)的流程圖。首先,判定″表達(dá)式e是否為常數(shù)″(步驟1501),結(jié)果若為真,返回函數(shù)SecTypeOfCst(c)[返回常數(shù)c的安全類型]的結(jié)果(步驟1502),結(jié)束處理。
步驟1501的結(jié)果若為假,前進(jìn)到步驟1503,判定″表達(dá)式e是否為詞″,判斷結(jié)果若為真,返回函數(shù)SecTypeOfWrd(w)[返回詞w的安全類型]的結(jié)果(步驟1504),結(jié)束處理。
步驟1503的結(jié)果若為假,前進(jìn)到步驟1505,判定″表達(dá)式e是否為″e(cuò)1″型的表達(dá)式″,結(jié)果若為真,返回函數(shù)SecTypeOfExp(e1,ε)[返回屬于聲明的序列ε的表達(dá)式e1的安全類型]的結(jié)果(步驟1506),結(jié)束處理。
步驟1505的結(jié)果若為假,前進(jìn)到步驟1507,判定″表達(dá)式e是否為″op e1″型(一元運(yùn)算符表達(dá)式)的表達(dá)式″,判定結(jié)果若為真,返回函數(shù)SecTypeOfExp(e1)[返回表達(dá)式e1的安全類型]的結(jié)果(步驟1508)。
步驟1507的判定結(jié)果若為假,前進(jìn)到步驟1509。在步驟1509中,判定″表達(dá)式e是否為″e(cuò)1 op e2″型(表達(dá)式二元運(yùn)算符表達(dá)式)的表達(dá)式″,判定結(jié)果若為真,在步驟1510中,Ts1中保存SecTypeOfExp(e1,ε)、Ts2中保存SecTypeOfExp(e2,ε),并且返回SecSup(Ts1,Ts2),結(jié)束處理。
步驟1509的結(jié)果若為假,結(jié)束處理。
更形式化表示,則表達(dá)式的安全類型可以通過以下的規(guī)則獲得。
上述形式化記述表示規(guī)則如下。
(Cst)表達(dá)式為常數(shù)時(shí)的規(guī)則
將作為Lyee必要條件的聲明的序列的ε作為安全鍵入環(huán)境的常數(shù)c的類型,是不需前提條件函數(shù)SecTypeOfCst(c)返回的值。
(Wrd)表達(dá)式為詞時(shí)的規(guī)則
將作為Lyee必要條件的聲明的序列的ε作為安全鍵入環(huán)境的詞w的類型,是不需前提條件函數(shù)SecTypeOfWrd(w,ε)返回的值。
(ExpP)表達(dá)式為括號表達(dá)式時(shí)規(guī)則
前提條件″將作為Lyee必要條件的聲明的序列的ε作為安全鍵入環(huán)境的表達(dá)式Exp的類型為Ts″成立時(shí),將作為Lyee必要條件的聲明的序列的ε作為安全鍵入環(huán)境的表達(dá)式(Exp)的類型為Ts。
(ExpU)表達(dá)式為″Op Exp″時(shí)的規(guī)則
前提條件″作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的Exp(表達(dá)式)的類型為Ts″成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的Op Exp(運(yùn)算符表達(dá)式)的類型為Ts。
(ExpB)表達(dá)式為″Exp op Exp″時(shí)的規(guī)則
前提條件″作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境、表達(dá)式Exp1的類型為Ts1、表達(dá)式Exp2的類型為Ts2″成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的表達(dá)式Exp1op Exp2的類型是Sup(Ts1,Ts2)。
(7-1-5)聲明的安全鍵入
以下函數(shù)將安全類型與Lyee必要條件ε中的任意的聲明s相關(guān)連。
SecTypeOfStat((Id,Exp,Cond,io,T,Tsec)statement,
BeginεList of statement)
If(io=IF)or(io=IS)and(Tsec=””)
Then print ErrMsg
return 0
Then return(Id,Exp,Cond,io ,T,Tsec)
EndIf
or(io≠OF))
Then return(Id,Exp,Cond,io,T,Tsec)
Else return ErrMsg
EndIf
EndIf
End
上述函數(shù)的SecTypeOfStat((Id,Exp,Cond,io,T,Tsec),ε)的意思如下。函數(shù)的自變量(Id,Exp,Cond,io,T,Tsec)是構(gòu)成屬于Lyee必要條件ε的任意的聲明的項(xiàng)目的值(Id=詞的識(shí)別符、Exp=定義式、Cond=定義式執(zhí)行條件、io=輸入輸出屬性、T=詞的值的類型、Tsec=表示詞的安全級別的類型)。
<開始>
<If語句開始>如果io=IF或io=IS,并且Tsec為空,[即,如果輸入輸出屬性io為輸入、未給出安全類型的信息],打印ErrMsg,返回″0″[因?yàn)椴荒芘卸ò踩愋?,所以打印錯(cuò)誤信息,返回0]否則,
<If語句開始>如果SecTypeOfExp(Exp)_Tsec[聲明的安全類型與定義式的安全;類型相比為上位],并且,io≠OS且io≠OF[io不是輸出,即,為輸入],返回(Id,Exp,Cond,io,T,Tsec)
<If處理結(jié)束>
<If語句開始>如果SecTypeOfExp(Exp)_STsec≠secret[聲明的安全類型(不是secret)與定義式的安全類型相比為上位],并且,io=OS或io≠OF[io是對畫面的輸出或?qū)ξ募妮敵鯹,
返回(Id,Exp,Cond,io,T,Tsec)
否則,返回ErrMsg(錯(cuò)誤信息)
<If處理結(jié)束>
<If處理結(jié)束>
<結(jié)束>
圖24是表示該函數(shù)SecTypeOfStat((Id,Exp,Cond,io,T,Tsec),ε)的流程圖。以下說明圖24。首先,判定″聲明的io項(xiàng)目是IF[對文件的輸出]或IS[對畫面的輸出],并且項(xiàng)目T是否為空[無類型信息]″(步驟1601)。判定的結(jié)果若為真,前進(jìn)到步驟1602,打印錯(cuò)誤信息(ErrMsg)并返回″0″,結(jié)束處理。判斷結(jié)果若為假,前進(jìn)到步驟1603,判定″是否有SecTypeOfExp(Exp)_STsec[聲明的安全類型與定義式的安全類型相比為上位],并且,io≠OS且io≠OF[io不是輸出,即,是輸入]″。判定結(jié)果若為真,在步驟1604中返回(Id,Exp,Cond,io,T,Tsec),結(jié)束處理。
步驟1603的判定結(jié)果為假,前進(jìn)到步驟1605,判定″SecTypeOfExp(Exp)_STsec≠secret[是否聲明的安全類型(不是secret)與定義式的安全類型相比為上位],并且,io=OS或IO≠OF[io是對畫面輸出或?qū)ξ募妮敵鯹″。結(jié)果若為真,在步驟1606中返回(Id,Exp,Cond,io,T,Tsec)的值,結(jié)束處理。
步驟1605的結(jié)果若為假,返回錯(cuò)誤信息(ErrMsg)(步驟1607),結(jié)束處理。
形式化的記述,與該函數(shù)相關(guān)的鍵入規(guī)則如下。
即,上述形式化的記述意思如下。
(Stat1)生成缺少輸出詞的安全類型信息時(shí)
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的定義式Exp的類型為Ts1,聲明的輸入輸出屬性不是輸入(io≠IS且io≠IF)’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明(Id,Exp,Cond,io,T,“”)的類型為(Id,Exp,Cond,io,T,Ts1)。
(Stat2)檢查、修正輸出詞的安全類型信息時(shí)
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境、定義式Exp的類型為Ts1、該Ts1與聲明的安全類型的值相比為上位(Ts1_STsec)、輸入輸出屬性不為輸入(io≠IS且io≠IF)’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明(Id,Exp,Cond,io,T,Tsec)的類型為(Id,Exp,Cond,io,T,Ts1)。
(7-1-6)Lyee必要條件的安全鍵入
存在排列后的聲明的序列的ε,通過下述的函數(shù),可以將安全類型與其各個(gè)聲明相關(guān)連。
SecTypeOfLyee(<s1,...,sn>list of statements)
Varε0list of statements
Begin
ε0←<s1,...,sn>
For i=1 to n
EndFor
return εn
End
上述的函數(shù)SecTypeOfLyee(<s1,...,sn>)的意思如下。函數(shù)的自變量<s1,...,sn>是任意的聲明的序列。變量ε0的值是聲明的序列。
<開始>
ε0中保存聲明的序列<s1,...,sn>。
i取由1到n時(shí),執(zhí)行以下程序
s’i中保存SecTypeOfStat(si,εi-1)
εi中保存εi-1的值
εi的i號要素由s’i替換。
<For處理結(jié)束>
返回εn
<結(jié)束>
圖25是表示該函數(shù)SecTypeOfLyee(<s1,...,sn>)的流程圖。以下說明圖25。首先,在變量ε0的區(qū)域保存聲明的序列<s1,...,sn>(步驟1701)。然后,對i加1(步驟1702),前進(jìn)到步驟1703。在步驟1703中,判定″i的值是否為n″,結(jié)果若為假,在s’i中保存SecTypeOfStat(si,εi-1)的結(jié)果,在εi中保存εi-1的結(jié)果,εi的i號要素由s’i替換(步驟1704)。步驟1704結(jié)束后,返回步驟1702比你跟再次執(zhí)行。只要步驟1703的結(jié)果為假,就重復(fù)由步驟1702到步驟1704的重新開始處理(1706)。
步驟1703的結(jié)果為真時(shí),在步驟1705中返回εn,結(jié)束處理。此時(shí),εn的值為<s’1,...,s’n>。
正式的記述,上述函數(shù)的安全鍵入規(guī)則如下。
上述正式的記述表示的規(guī)則的意思是″前天條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明s1的安全類型為s’1,s’1代入s1后的聲明序列ε作為安全類型的環(huán)境的<s2,...,s’n>的安全類型為<s’2,...,s’n>’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明的序列<s1,...,sn>的安全類型是<s’1,...,s’n>″。

最后,與排列后的Lyee必要條件的完全的安全類型系統(tǒng)如下。
(Cst)表達(dá)式為常數(shù)時(shí)的表達(dá)式的安全類型
將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的常數(shù)c的類型,是不需前提條件函數(shù)SecTypeOfCst(c)返回的值。
(Wrd)表達(dá)式為詞時(shí)的表達(dá)式的安全類型
將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的詞w的類型,是不需前提條件函數(shù)SecTypeOfWrd(w,ε)返回的值。
(ExpP)表達(dá)式是括號表達(dá)式時(shí)的表達(dá)式的安全類型
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的表達(dá)式Exp的類型為Ts’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的表達(dá)式(Exp)的類型為Ts。
(ExpU)表達(dá)式為″Op Exp″時(shí)的表達(dá)式的安全類型
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的表達(dá)式(Exp)的類型為Ts’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的Op Exp(運(yùn)算符表達(dá)式)的類型為Ts。
(ExpB)表達(dá)式為″Exp op Exp″時(shí)的表達(dá)式的安全類型
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境、表達(dá)式Exp1的類型為Ts1、表達(dá)式Exp2的類型為Ts2’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的表達(dá)式Exp1op Exp2的類型是Sup(Ts1,Ts2)。
(Stat1)生成缺少輸出詞的安全類型信息時(shí)
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的定義式Exp的類型為Ts1,聲明的輸入輸出屬性不是輸入(io≠IS并且io≠IF)’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明(Id,Exp,Cond,io,T,“”)的類型為(Id,Exp,Cond,io,T,Ts1)。
(Stat2)檢查、修正輸出詞的安全類型信息時(shí)
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境、定義式Exp的類型為Ts1、該Ts1與聲明的安全類型的值Tsec相比為上位(Ts1_STsec)、輸入輸出屬性不是輸入(io≠IS并且io≠IF)’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明(Id,Exp,Cond,io,T,Tsec)的類型是(Id,Exp,Cond,io,T,Ts1)。
(Req)排列后的Lyee必要條件的安全類型
前提條件‘將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明s1的安全類型為s’1、s’1代入s1后的聲明的序列ε作為安全類型的環(huán)境的<s2,...,s’n>的安全類型為<s’2,...,s’n>’成立時(shí),將作為Lyee必要條件的聲明的序列ε作為安全鍵入環(huán)境的聲明的序列
<s1,...,sn>的安全類型為<s’1,...,s’n>。
(7-2)個(gè)案研究
上述的表31的Lyee必要條件中,進(jìn)行安全鍵入,檢測出以下的錯(cuò)誤。
·聲明c的錯(cuò)誤詞c的類型為public(公開),但是,定義式包含secret(非公開)的詞(定義式a=6的詞a為secret),由于受其影響,所以矛盾。
·聲明b的錯(cuò)誤詞b的類型為public(公開),但是,定義式間接包含secret(非公開)的詞(定義式c的詞c的定義式a=6的詞a為secret),由于受其影響,所以矛盾。
·聲明d的錯(cuò)誤詞d的類型為public(公開),但是,定義式包含secret(非公開)的詞(定義式a+6的詞a為secret),由于受其影響,所以矛盾。
·聲明g的錯(cuò)誤詞g的類型為public(公開),但是,定義式間接包含secret(非公開)的詞(定義式d =9的詞d的定義式a+6的詞a為secret),由于受其影響,所以矛盾。
·聲明f的錯(cuò)誤詞f的類型為secret(非公開),但是,詞f是輸出之一,所以矛盾(因?yàn)橛凶鳛榘踩愋偷闹挡惠敵龅姆结?。
·聲明h的錯(cuò)誤詞h的類型為public(公開),但是,定義式間接包含secret(非公開)的詞(定義式f的詞f的定義式為g,詞g的定義式為d=9,詞d的定義式為a+6,詞a為secret),由于受其影響,所以矛盾。
8. Lyee必要條件分析器
Lyee必要條件分析器是為部分實(shí)現(xiàn)我們以前討論的靜態(tài)分析技術(shù)產(chǎn)生的原型。其作為輸入理解Lyee必要條件,作為輸出給出適于以LyeeAll工具的優(yōu)化的代碼的生成的分?jǐn)嗪团帕许樞虻谋匾獥l件。然后,它能夠執(zhí)行常數(shù)傳送等的其它的必要條件優(yōu)化。如圖26所示,該原型的基本構(gòu)成要素如下
●詞匯以及語法的分析器這部分作為輸入的Lyee必要條件,給出作為輸出的一般的被稱為中間表現(xiàn)的語法樹形結(jié)構(gòu)。必要條件的該新的表現(xiàn)方法是我們希望進(jìn)行的所有的靜態(tài)分析記述的出發(fā)點(diǎn)。而且,分析Lyee必要條件時(shí),能夠檢測詞匯或語法上的錯(cuò)誤并傳達(dá)給用戶。
●流程基礎(chǔ)分析器流程基礎(chǔ)分析要素由在以前部分中進(jìn)行的中間的表現(xiàn)開始,生成與由1必要條件到另1必要條件的數(shù)據(jù)流程控制的循環(huán)有關(guān)的所有的信息。這些分析的結(jié)果由控制流程圖(Control FlowGraphCFG)以及數(shù)量流程圖(Data-Flow GraphDFG)構(gòu)成。
●優(yōu)化在其它之中,該要素執(zhí)行常數(shù)的傳送技術(shù),生成LyeeAll工具適于生成能夠更快地執(zhí)行并消耗地保存更少地程序、適當(dāng)?shù)睾唵位穆暶鞯南盗小?br> ●限制器該要素作為輸入取與根據(jù)流程基礎(chǔ)分析要素以及限制評價(jià)標(biāo)準(zhǔn)生成的流程相關(guān)(與各詞相關(guān)連的Def/Use等)的信息,作為輸出,給出與這些給出的評價(jià)標(biāo)準(zhǔn)對應(yīng)的分?jǐn)唷?br> 9.結(jié)論和對將來的展望
我們在本文中發(fā)表了對Lyee必要條件使用靜態(tài)分析技術(shù)和其影響。首先,我們提出常數(shù)傳送或模式檢測等的古典的優(yōu)化的技術(shù)能夠如何改良Lyee程序的執(zhí)行時(shí)間。此外,我們介紹如何發(fā)現(xiàn)必要條件中的錯(cuò)誤(死的定義。周期的定義、不完全或多余的定義)。第2,我們討論所謂分?jǐn)嗟募夹g(shù)能夠如何改良Lyee系統(tǒng)的理解和維護(hù)。而且,我們示出,如何通過使用該分?jǐn)嗉夹g(shù)發(fā)現(xiàn)可以并行執(zhí)行的Lyee系統(tǒng)中的獨(dú)立的部分。第3,我們提出能夠發(fā)現(xiàn)鍵入錯(cuò)誤和自動(dòng)生成媒介以及詞的類型的類型系統(tǒng)。第4,我們舉例證明Lyee方法論如何適于安全方面等的一些擴(kuò)大。被提出的靜態(tài)分析技術(shù)中,現(xiàn)在存在以稱為Lyee必要分析器的原型執(zhí)行的技術(shù)。
并且,作為今后的工作,我們首先完成Lyee必要條件分析工具,調(diào)查用于改良Lyee方法論的其它的方面的其它的靜態(tài)分析技術(shù)。
10.
如以上詳細(xì)的說明,根據(jù)涉及本實(shí)施方式的本發(fā)明的靜態(tài)分析方法,對Lyee必要條件使用靜態(tài)分析的方法,所以能夠改善根據(jù)Lyee必要條件和Lyee生成的代碼列二者的質(zhì)量,因此,Lyee方法論中生成具有更高質(zhì)量(更少的保存和執(zhí)行時(shí)間的耗費(fèi))的代碼成為可能。(7)作為發(fā)展形態(tài),通過對Lyee必要條件(要求定義)使用上述的靜態(tài)分析方法或靜態(tài)分析器,能夠得到更加改善的Lyee必要條件,通過以上述的″Lyee必要條件″對其進(jìn)行說明的方法,或?qū)@墨I(xiàn)1、2、4到6中記載的Lyee的軟件生成方法,進(jìn)一步對專利文獻(xiàn)3記載的軟件生成裝置進(jìn)行輸入,能夠?qū)崿F(xiàn)以更少的保存空間和處理時(shí)間由Lyee生成所希望的軟件的方法或生成的生成裝置。
即,若在作為Lyee的軟件生成的上流階段的Lyee必要條件的階段實(shí)現(xiàn)效率化,對其后的處理應(yīng)用已有的Lyee方法論,因此能夠得到作為更加高質(zhì)量的最終產(chǎn)品的軟件。
關(guān)于得到這樣的Lyee必要條件(要求定義)后的階段的方法或裝置的詳細(xì)說明,作為在上述的″Lyee發(fā)明的概要″中說明內(nèi)容或?qū)@墨I(xiàn)1至6中記載的方法的說明,在此省略。
此外,根據(jù)本發(fā)明,通過使用古典的靜態(tài)分析的技術(shù),能夠更加增進(jìn)Lyee方法論。
并且,與根據(jù)涉及本發(fā)明的Lyee指向軟件相關(guān)的靜態(tài)分析器,接受Lyee必要條件,能夠?qū)⑦m于以LyeeAll工具生成的優(yōu)化代碼的分?jǐn)嗪驼{(diào)整順序的必要條件作為輸出給出。并且,其能夠執(zhí)行常數(shù)傳送等其它必要條件的優(yōu)化。
本發(fā)明的許多特征及優(yōu)點(diǎn)通過說明書的詳細(xì)說明得以明確。進(jìn)而,對于該技術(shù)領(lǐng)域中的具有常識(shí)的人來說,能夠容易地做很多修正及改變,所以不希望本發(fā)明限于與圖示及記述沒有一點(diǎn)不同結(jié)構(gòu)及動(dòng)作,所有適當(dāng)?shù)淖冃卫暗葍r(jià)例都看成為包含在本發(fā)明的范圍內(nèi)。雖然根據(jù)上述涉及本發(fā)明的實(shí)施方式的說明以及圖例進(jìn)行了詳細(xì)記述,但是在不僅限于附加的專利權(quán)利要求范圍內(nèi),還不超出涉及本發(fā)明公開的全部內(nèi)容中定義的本發(fā)明的范圍的情況下,可以進(jìn)行很多修改、替換及變更。
此外,涉及本申請的發(fā)明,在其應(yīng)用上,并不限于是否在上述記述中進(jìn)行了說明或圖示要素的詳細(xì)解釋及組合中。本發(fā)明可以是其它實(shí)施方式,可以在各種方法中使用或?qū)嵤4送?,在此使用的語法以及術(shù)語以說明為目的,不能作為限定的功能。
因此,在該技術(shù)領(lǐng)域中的具有常識(shí)的人應(yīng)將作為本發(fā)明的基本概念理解為將用于實(shí)施本發(fā)明的某些目的的其它結(jié)構(gòu)、方法及系統(tǒng)作為設(shè)計(jì)用的基礎(chǔ),能容易地被利用。因此,只要在不脫離本發(fā)明的宗旨及范圍內(nèi),都可以看作是本申請的專利權(quán)利要求的范圍包含那樣的等價(jià)解釋。
此外,上述主要說明Lyee方法論中軟件的靜態(tài)分析法以及靜態(tài)分析器,無需贅言,涉及本發(fā)明的技術(shù)思想,例如也為計(jì)算機(jī)軟件的自動(dòng)開發(fā)裝置、自動(dòng)開發(fā)程序、保存自動(dòng)開發(fā)程序的存儲(chǔ)介質(zhì)、傳送介質(zhì)、紙介質(zhì),此外,所謂注冊自動(dòng)開發(fā)程序的計(jì)算機(jī)裝置、執(zhí)行自動(dòng)開發(fā)程序的客戶服務(wù)器形式等的種類中,也可以實(shí)現(xiàn)利用。
并且,本發(fā)明不限于具備單一處理器、單一硬盤驅(qū)動(dòng)以及單一本地保存器的計(jì)算機(jī)系統(tǒng),作為該系統(tǒng)的選擇,也適于裝備任意多個(gè)或組合處理器或保存設(shè)備。計(jì)算機(jī)系統(tǒng)包含精密的計(jì)算器、掌上電腦、膝上型電腦/筆記本電腦、迷你電腦、大型計(jì)算機(jī)、超級計(jì)算機(jī)、以及這些處理系統(tǒng)網(wǎng)絡(luò)組合。能夠由按照本發(fā)明原理工作的任意適當(dāng)?shù)奶幚硐到y(tǒng)代替,此外也可以和這些組合使用。
此外,涉及本發(fā)明的技術(shù)思想,當(dāng)然可適用于所有類型的程序語言。并且,涉及本發(fā)明的技術(shù)思想也可適用于所有種類功能的應(yīng)用軟件。
此外,進(jìn)而涉及本申請發(fā)明在該技術(shù)思想的同樣以及等價(jià)的范圍中,允許各種變形、再增加、置換、擴(kuò)大、縮小等。此外,使用本申請發(fā)明制作的軟件在其2次產(chǎn)品中注冊、商品化時(shí),分申請發(fā)明的價(jià)值沒有任何減少。
生產(chǎn)上的可利用性
在本發(fā)明中,通過對Lyee必要條件使用靜態(tài)分析方法,能改善Lyee必要條件和根據(jù)Lyee生成的代碼列的二者的質(zhì)量,因此,通過Lyee方法論中生成具有更高質(zhì)量(更少的保存和執(zhí)行時(shí)間的耗費(fèi))的代碼成為可能,由此帶來軟件制作效率大幅提高、生產(chǎn)能力提高、質(zhì)量提高等的軟件產(chǎn)業(yè)上的重大的效果。
權(quán)利要求
1.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式的要求定義的步驟;
將上述得出的要求定義作為關(guān)鍵詞檢測常數(shù)的步驟;
按照使用上述檢出的常數(shù)的定義式傳送該常數(shù)的步驟。
2.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式的要求定義的步驟;
從上述得到的要求定義的定義式中檢測模式的步驟;
以該檢測模式作為置換式的表現(xiàn)替換上述要求定義的步驟。
3.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及前提條件的要求定義的步驟;
基于上述要求定義,得到遵守BNF語法記述至少涉及上述詞的識(shí)別符、上述定義式以及上述前提條件的聲明的步驟;
對上述得到的每個(gè)聲明定義Def/Use函數(shù)的步驟;
由上述定義的Def/Use函數(shù)間的順序關(guān)系得到上述聲明間的順序關(guān)系的步驟。
4.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;
基于上述要求定義,得到記述至少涉及上述詞的識(shí)別符、上述定義式以及輸入輸出屬性的聲明的步驟;
由上述得到的聲明(第1聲明),引導(dǎo)對涉及該聲明的詞的定義有貢獻(xiàn)的另外的聲明(第2聲明),對該所有的聲明執(zhí)行將該第1以及第2聲明作為同一聲明群的分?jǐn)嗪瘮?shù)的步驟;
由上述分?jǐn)嗪瘮?shù)得到相互獨(dú)立的分?jǐn)嗟牟襟E。
5.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;
基于上述要求定義,得到記述至少涉及上述詞的識(shí)別符、上述定義式以及輸入輸出屬性的聲明;
基于對上述得到的聲明的規(guī)定的分析,檢測上述要求定義中的錯(cuò)誤的步驟。
6.根據(jù)權(quán)利要求5所述的關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于
對上述聲明的規(guī)定的分析是根據(jù)算出非活性聲明、循環(huán)聲明、不完全聲明或多余聲明中的至少1個(gè)得出的。
7.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;
基于上述要求定義,得到記述至少涉及上述詞的識(shí)別符、上述定義式以及輸入輸出屬性的聲明的步驟;
對上述得到的聲明、該聲明中的運(yùn)算符以及數(shù)據(jù),定義各個(gè)類型代數(shù)的步驟;
對上述定義的類型代數(shù),使用相關(guān)的環(huán)境以及規(guī)定的類型規(guī)則,發(fā)現(xiàn)上述要求定義中的類型錯(cuò)誤的步驟。
8.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;
基于上述要求定義,得到記述至少涉及上述詞的識(shí)別符、上述定義式以及輸入輸出屬性的聲明的步驟;
對上述得到的聲明、該聲明中的運(yùn)算符以及數(shù)據(jù),定義各個(gè)類型代數(shù)的步驟;
基于上述定義的類型代數(shù),使用規(guī)定的環(huán)境以及類型規(guī)則,由上述要求定義中的輸入詞生成媒介以及輸出詞的類型的步驟。
9.一種關(guān)于Lyee指向軟件的靜態(tài)分析方法,其特征在于,具備
為按照Lyee方法論制作軟件,得到包含每個(gè)詞的定義式以及輸入輸出屬性的要求定義的步驟;
基于上述要求定義,得到記述至少涉及上述詞的識(shí)別符、上述定義式、輸入輸出屬性以及安全標(biāo)號的聲明的步驟;
使用表示上述得到的聲明中的安全標(biāo)號間的關(guān)系網(wǎng)絡(luò),在上述詞的值中定義與安全標(biāo)號相關(guān)連的標(biāo)號函數(shù)的步驟;
基于上述定義的標(biāo)號函數(shù),使用規(guī)定的安全方針,算出不遵守規(guī)定的安全方針的程序的步驟。
全文摘要
Lyee必要條件中,應(yīng)用在以往方法中使用的靜態(tài)分析方法。具體地,將Lyee必要條件作為對象進(jìn)行優(yōu)化(古典式優(yōu)化、根據(jù)謂語向量的排列的優(yōu)化)、分?jǐn)唷⒈匾獥l件調(diào)試、鍵入(錯(cuò)誤檢測、類型發(fā)現(xiàn)、使用類型的安全)。此外,將這些作為實(shí)施了適于Lyee All工具生成的優(yōu)化代碼的預(yù)處理的形式輸出必要條件。由此,使Lyee方法論中用于生成具有更高質(zhì)量(更少的保存和執(zhí)行時(shí)間的耗費(fèi))的代碼的必要條件定義的優(yōu)化成為可能。
文檔編號G06F11/28GK1788254SQ0382643
公開日2006年6月14日 申請日期2003年9月25日 優(yōu)先權(quán)日2003年3月10日
發(fā)明者M·梅里, B·克塔里, H·藤田, M·埃希奧伊 申請人:珂特那株式會(huì)社
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
鄂托克旗| 兴仁县| 东台市| 富平县| 东方市| 宁波市| 交城县| 泰来县| 湘潭市| 天全县| 临沂市| 富民县| 江安县| 武强县| 合作市| 拉孜县| 龙岩市| 抚松县| 合水县| 洮南市| 牡丹江市| 百色市| 吴堡县| 云和县| 双流县| 思南县| 曲阳县| 陵川县| 巩义市| 蕲春县| 镇原县| 平果县| 长宁区| 佛教| 汶川县| 南召县| 诸暨市| 扎鲁特旗| 潍坊市| 抚松县| 贵州省|