肖安洪,曾 輝,王 箏,楊大為,彭 輝
(中國核動力研究設(shè)計院核反應(yīng)堆系統(tǒng)設(shè)計技術(shù)重點實驗室,四川 成都 610041)
軟件維護是軟件生存周期的重要環(huán)節(jié),二十世紀六七十年代發(fā)生的“軟件危機”正是由于大量軟件不可維護引起,并由此興起軟件工程的概念[1]。國內(nèi)相關(guān)標準將國際電工委員會定義的5種軟件維護類型經(jīng)過合并整理,定義為:完善性維護、適應(yīng)性維護和改正性維護,其中適應(yīng)性維護是指為適應(yīng)軟件運行環(huán)境變化而作的修改[2]。通常我們稱軟件適應(yīng)性維護過程為程序移植。核反應(yīng)堆設(shè)計中采用了大量早期開發(fā)的專業(yè)程序,這些程序具有典型的“遺留軟件”特征:生命周期長、業(yè)務(wù)功能關(guān)鍵和質(zhì)量差[3]。隨著計算機硬件的快速發(fā)展,反應(yīng)堆專業(yè)程序的運行平臺逐漸停產(chǎn)、淘汰和退役,因此迫切需要將這些專業(yè)程序移植到現(xiàn)有主流計算平臺。此外,這類程序多是通過各種渠道從國外引進,移植工作只能由單位內(nèi)部技術(shù)人員完成,缺乏開發(fā)方的技術(shù)支持以及足夠的程序文檔,技術(shù)難度很大。因此應(yīng)用軟件工程理論對反應(yīng)堆專業(yè)程序適應(yīng)性維護過程進行研究,建立相應(yīng)的工作流程,可以規(guī)范維護過程,提高工作效率,并減少引入缺陷的風險。
軟件工程定義了許多過程模型用于軟件開發(fā)和維護,包括線性模型、原型模型、快速應(yīng)用開發(fā)模型、演化軟件過程模型等[3]。這些模型各有優(yōu)缺點,在此不一一贅述??傊诶碚撋弦⑼昝赖倪^程模型是不現(xiàn)實的,只能衡量人力、資源、時間等各種成本和風險因素,靈活運用過程模型概念來開展軟件項目。
對于反應(yīng)堆專業(yè)程序適應(yīng)性維護而言,技術(shù)人員在程序現(xiàn)有框架約束下完成修改,使其運行于新平臺,需求明確,過程相對簡單,適宜采用線性模型,并在關(guān)鍵節(jié)點進行迭代。根據(jù)軟件工程化的相關(guān)理論,可以將反應(yīng)堆專業(yè)程序適應(yīng)性維護過程歸納為7個階段,如圖1所示。
圖1 反應(yīng)堆專業(yè)程序適應(yīng)性維護過程
策劃階段的主要工作是識別用戶需求并確定程序移植目標平臺、移植總體技術(shù)路線、測試方案、工作計劃、投入人力資源和所需配套設(shè)備、識別風險因素并進行風險分析。其中關(guān)鍵活動是識別用戶需求并確定移植目標平臺,結(jié)合主流計算機技術(shù)以及當前軟硬件條件,從長遠發(fā)展和當前可行兩個方面綜合論證總體技術(shù)路線。
準備階段應(yīng)完成以下幾個方面準備工作。
2.2.1 系統(tǒng)環(huán)境準備
系統(tǒng)環(huán)境準備包括服務(wù)器硬件、操作系統(tǒng)、編譯系統(tǒng)及庫文件等資源的準備,完成目標平臺的搭建。
2.2.2 工具軟件準備
需要準備的工具軟件包括源代碼分析工具、程序調(diào)試工具等。由于適應(yīng)性維護涉及到代碼修改,所以在條件允許的情況下應(yīng)部署配置管理系統(tǒng)對源代碼版本進行控制。
2.2.3 資料準備
反應(yīng)堆專業(yè)程序大多開發(fā)在早期的系統(tǒng)環(huán)境中,和現(xiàn)有系統(tǒng)環(huán)境差異顯著,所以系統(tǒng)資料和程序資料顯得尤為重要,包括操作系統(tǒng)命令腳本、編譯器相關(guān)資料、程序開發(fā)語言資料、程序開發(fā)手冊、編譯手冊等。
代碼分析主要是對程序的規(guī)模、函數(shù)調(diào)用及依賴關(guān)系、程序流程進行分析。代碼分析可以在人工分析基礎(chǔ)上配合使用輔助工具,提高準確性和效率。
2.3.1 代碼總體分析
分析掌握程序代碼所使用的編程語言及版本、代碼的規(guī)模(如代碼行數(shù)、注釋行數(shù)、子程序數(shù)、公用變量數(shù)等),可借助工具軟件完成,如STI Understand。
2.3.2 靜態(tài)結(jié)構(gòu)分析
靜態(tài)結(jié)構(gòu)分析主要對程序調(diào)用或依賴的庫文件、頭文件等進行分析,并在目標平臺進行相應(yīng)配置。通常核反應(yīng)堆專業(yè)程序依賴以下幾種庫文件、頭文件:操作系統(tǒng)級、編譯器級和程序自定義級。
2.3.3 動態(tài)運行分析
動態(tài)運行分析主要掌握程序運行流程及函數(shù)邏輯調(diào)用關(guān)系。程序動態(tài)運行分析有助于對程序移植過程中發(fā)現(xiàn)的錯誤進行定位及排查。程序動態(tài)運行結(jié)構(gòu)分析主要輸出成果為程序流程圖、程序邏輯結(jié)構(gòu)圖等。
代碼移植是適應(yīng)性維護的核心階段,其任務(wù)是將程序源代碼在目標平臺進行相應(yīng)修改;然后編譯、鏈接,得到目標程序;在目標平臺對目標程序進行運行、調(diào)試,并解決在修改、編譯、鏈接、運行、調(diào)試過程出現(xiàn)的錯誤。通常情況下編譯、鏈接合并進行,運行、調(diào)試也合并進行。代碼移植階段可以按照以下步驟進行。
2.4.1 確定編譯、鏈接選項
由于系統(tǒng)環(huán)境及編譯器差異等原因,程序在不同平臺進行編譯、鏈接時采用的選項不同,通過查閱相關(guān)編譯器文檔可以了解選項信息。例如Alpha平臺f77編譯器的編譯選項“-r8-i8”,作用是對浮點數(shù)和整數(shù)按雙精度進行編譯,而在Solaris平臺對應(yīng)選項為“xtypemap=real:64,integer:64”。
2.4.2 建立編譯鏈接錯誤信息表
確定選項后即可著手程序編譯鏈接。這個步驟的主要任務(wù)是記錄編譯過程中產(chǎn)生的錯誤和警告信息,并整理為錯誤信息表,表格包含的主要內(nèi)容包括信息類別、產(chǎn)生信息的位置、信息描述等。
2.4.3 解決代碼編譯鏈接錯誤
根據(jù)錯誤信息表定位到故障代碼,分析并確定錯誤原因,然后對代碼進行修改,直至消除所有錯誤。從筆者程序移植經(jīng)驗來看,編譯鏈接錯誤主要體現(xiàn)在3個方面:編譯鏈接選項、編程語言語法和引用庫文件。編譯鏈接選項錯誤可以通過查閱編譯器資料找到解決方法,編程語言語法錯誤也可以通過查閱程序開發(fā)語言手冊找到答案。
下面以筆者在對早期Fortran程序移植過程中遇到的兩個典型語法問題為例進行說明。
第一個是賦值問題,不同平臺編譯器對DATA賦值語句的解析不同,如對變量進行八進制賦值,Alpha平臺使用“DATA TEMP/OXXXX/”,而 Solaris平臺使用“DATA TEMP/O‘XXXX’/”。
第二個是函數(shù)同名,新版本編程語言中內(nèi)置越來越多的內(nèi)部函數(shù),而早期程序中某些自定義函數(shù),其名稱可能已經(jīng)被用作內(nèi)部函數(shù),這種情況會導致莫名其妙的錯誤。如調(diào)用函數(shù)報參數(shù)不匹配錯誤,而檢查代碼發(fā)現(xiàn)調(diào)用函數(shù)時傳遞的參數(shù)類型和函數(shù)定義時的參數(shù)類型一致,這就有可能是該函數(shù)名已被用作內(nèi)部函數(shù),并有了不同的定義。這類問題的解決辦法就是將自定義函數(shù)改名。
編譯鏈接過程中最難解決的問題是引用庫文件問題。庫文件是代碼通過編譯鏈接產(chǎn)生的,如果程序代碼引用了沒有源代碼的庫文件,對這個程序進行跨平臺移植就會遇到很大的問題,因為不同平臺的二進制文件結(jié)構(gòu)是不一樣的,庫文件也是二進制文件,因此不能將原運行平臺的庫文件直接拷貝至目標平臺使用,而沒有庫文件源代碼,就不能在目標平臺進行編譯鏈接產(chǎn)生庫文件。目前暫時還沒有很好的辦法能解決這樣的問題,除非重構(gòu)代碼,剝離程序?qū)煳募囊蕾?,但是花費的代價將更大。
在對代碼進行修改過程中應(yīng)重視注釋的作用,注釋可以幫助理解編程思路。對修改的代碼也應(yīng)增加注釋以方便后來者閱讀程序,修改代碼的注釋內(nèi)容包括:修改者、修改時間、修改原因和修改的起止位置等;同時被修改的語句不能簡單刪除,而應(yīng)將其轉(zhuǎn)換為注釋語句予以保存,以便代碼后續(xù)使用者對比閱讀。
2.4.4 調(diào)試、運行目標程序
在經(jīng)過編譯、鏈接得到目標程序后,還需要驗證程序是否能正常運行,因此要對目標程序進行運行調(diào)試。目標程序只有在實際運行的時候才會將編譯鏈接符號、函數(shù)、變量等進行加載,鏈接的動態(tài)庫錯誤也只有在實際運行的時候才能體現(xiàn)。如果遇到運行調(diào)試錯誤,和解決編譯錯誤一樣,需要建立調(diào)試錯誤信息表,確定錯誤原因并提供解決方法,直至所有錯誤完全消除,這也涉及代碼的修改,因此應(yīng)注意添加和保存注釋。
總之,代碼移植階段要完成程序的修改、編譯、鏈接、運行、調(diào)試等任務(wù),并且還應(yīng)同步編寫移植說明書,記錄代碼移植過程情況,對發(fā)現(xiàn)的具有普遍性的問題進行歸納總結(jié),以便后續(xù)工作的開展。程序移植和程序開發(fā)有很大不同,更需要良好的編程技巧和豐富的實踐經(jīng)驗,這些都需要在實際工作中進行總結(jié)和積累。
適應(yīng)性維護是對原程序進行移植,對代碼的修改主要是修正語法等方面的錯誤,不會影響程序框架結(jié)構(gòu),修改代碼規(guī)模較小,因此相對來說測試需求比較簡單,使用基準例題對程序進行回歸測試即可。如果在測試階段發(fā)現(xiàn)問題,則應(yīng)回溯到代碼分析階段,查找分析原因,并通過修改代碼解決問題。
在測試過程中需要準備測試記錄表,記錄測試人員、測試時間、測試例題及測試結(jié)果等信息,為程序驗收提供見證記錄。
適應(yīng)性維護的軟件產(chǎn)品應(yīng)參照軟件開發(fā)要求進行驗收。驗收由軟件維護人員和軟件使用人員共同參與完成。驗收過程應(yīng)評審程序的功能、相關(guān)文檔是否滿足要求,然后根據(jù)評審結(jié)果確定是否通過驗收,并填寫驗收報告。驗收報告應(yīng)包括以下方面:程序是否在指定的平臺上正常安裝運行、測試例題是否正確運行、交付物是否完整。軟件驗收后,應(yīng)將全部工作產(chǎn)品轉(zhuǎn)入產(chǎn)品庫進行歸檔。
軟件通過驗收后由軟件維護人員部署在目標平臺,供用戶使用,并發(fā)布到相應(yīng)軟件庫中進行管理。此外還應(yīng)組織用戶進行程序的使用培訓。如條件允許應(yīng)為程序提供適用過渡期,在過渡期內(nèi)新舊平臺上的程序均可正常運行,便于用戶對不同平臺的運行過程及結(jié)果進行比較,及時發(fā)現(xiàn)問題。
通過對反應(yīng)堆專業(yè)程序的適應(yīng)性維護過程、工作內(nèi)容進行總結(jié)和分析,并應(yīng)用軟件工程理論和方法,建立了較規(guī)范的工作流程和方法。該項研究成果在國防技術(shù)基礎(chǔ)科研基金項目中開展應(yīng)用,完成了10余個反應(yīng)堆專業(yè)程序的移植,實踐證明可有效降低工作難度,提高工作效率,對提升移植軟件的質(zhì)量也起到了很大的積極作用。
[1] 張海藩.軟件工程導論[M].3版.北京:清華大學出版社,1998.
[2] 石柱.軟件工程標準手冊[M].北京:中國標準出版社,2004.
[3] Pressman R S.軟件工程:實踐者的研究方法[M].鄭人杰,馬素霞,白曉穎,等譯.6版.北京:機械工業(yè)出版社,2007.