第2章:軟件構建的過程和工具 2.2軟件構建的過程,系統和工具

大綱

軟件構建的通常過程:java

  • 編程/重構
  • 審查和靜態代碼分析
  • 調試(傾倒和記錄)和測試
  • 動態代碼分析/分析

軟件構建的狹義過程(Build):程序員

  • 構建系統:組件和過程
  • 構建變體並構建語言 - 構建工具:Make,Ant,Maven,Gradle,Eclipse

總結編程

軟件構建的通常過程

(1)編程
構建語言可根據如下兩種原則分類:小程序

語言的目的瀏覽器

  • 編程語言(例如C,C ++,Java,Python)
  • 建模語言(例如UML)
  • 配置語言(例如XML)
  • 構建語言(如XML)

語言的形式安全

  • 基於語言學的
  • 基於數學(形式語言)
  • 基於圖形(可視化)

(1)編程語言服務器

編程工具
集成開發環境(IDE):爲程序員提供軟件開發的綜合設施。
IDE一般由如下部分組成:架構

  • 帶智能代碼完成的代碼編輯器,代碼重構工具
  • 文件管理工具
  • 庫管理工具
  • 類瀏覽器,對象瀏覽器,類層次結構圖
  • 圖形用戶界面(GUI)生成器
  • 編譯器,解釋器
  • 構建自動化工具
  • 版本控制系統
  • 可經過更多外部第三方工具擴展

Eclipse做爲IDE的例子
Eclipse IDE:用於Java的開放源代碼IDE,但不限於C / C ++,PHP,Python等,最初是做爲專有IBM產品開發的(Visual age for Smalltalk / Java)框架

  • 它包含一個基礎工做區,其中包含用於編碼,構建,運行和調試應用程序的工具以及用於定製環境的可擴展插件系統。
  • 插件是爲系統貢獻功能的結構化代碼和/或數據包。功能能夠以代碼庫,平臺擴展甚至文檔的形式提供。
  • 插件能夠定義擴展點,定義明確的地方,其餘插件能夠添加功能。

Eclipse IDE的核心組件
運行時核心編程語言

  • 平臺運行時內核實現啓動平臺基礎並動態發現並運行插件的運行時引擎。
  • 插件是一個結構化組件,它使用OSGi清單(MANIFEST.MF)文件和插件清單(plugin.xml)文件向系統描述本身。該平臺維護已安裝插件的註冊表及其提供的功能。

資源管理

  • 資源管理插件定義了用於管理工具插件工件的公共資源模型。插件能夠建立和修改用於在磁盤上組織和存儲開發工件的項目,文件夾和文件。

Eclipse IDE的核心組件
工做臺UI核心

  • 該插件實現了工做臺UI,並定義了許多擴展點,容許其餘插件提供菜單和工具欄操做,拖放操做,對話框,嚮導以及自定義視圖和編輯器。
  • 標準Widget工具包(SWT)和JFace框架

Java開發工具(JDT)

  • 它經過提供用於編輯,查看,編譯,調試和運行Java代碼的功能來擴展平臺工做臺。

插件開發環境(PDE)

  • 自動建立,操做,調試和部署插件的工具。

(2)建模語言

建模語言是可用於表達信息或知識或系統的任何人造語言,該結構由一組一致的規則定義,目標是可視化,推理,驗證和傳達系統設計。

UML:Unified Modeling Language統一建模語言

(3)配置語言

配置文件配置程序的參數和初始設置。

  • 應用程序應提供工具來建立,修改和驗證其配置文件的語法;
  • 某些計算機程序僅在啓動時讀取其配置文件。其餘人按期檢查配置文件的變化。

目的示例:

  • 部署環境設置
  • 應用程序功能的變體
  • 組件之間鏈接的變體

配置語言示例:

  • 鍵值文本(.ini,.properties,.rc等)
  • XML,YAML,JSON

(2)回顧和靜態代碼分析

審查和靜態分析/檢查
代碼審查是對源代碼的系統審查(同行評議)。

  • 旨在發現初始發展階段忽視的錯誤,提升總體質量。
  • 評審以各類形式完成,如配對編程,非正式演練和正式檢查。

正式的代碼審查

正式的代碼審查,例如Fagan檢查,涉及多個參與者和多個階段的仔細和詳細的過程。

  • 正式的代碼審查是傳統的審查方式,軟件開發者一般使用材料的印刷副本逐行參加一系列會議和審查代碼。
  • 正式檢查很是完全,已被證實有效發現所審查代碼中的缺陷。

輕量級代碼審查

輕量級代碼審查一般比正式的代碼檢查要求更少的開銷,但若是正確完成,它能夠一樣有效。
輕量級審查一般做爲正常開發過程的一部分進行:

  • 在肩上(Over the shoulder)——一位開發人員從做者的肩膀上看過去,而後檢查代碼。
  • 電子郵件傳遞 - 源代碼管理系統在簽入後自動將電子郵件代碼發送給審閱者。
  • 結對編程 - 兩位做者在同一工做站上共同開發代碼,這在極限編程中很常見。
  • 工具輔助代碼審查 - 做者和審稿人使用軟件工具,非正式的例如pastebins和IRC,或專爲同行代碼審查而設計的工具。

靜態代碼分析

靜態代碼分析是在沒有實際執行程序的狀況下執行的計算機軟件分析(對執行程序執行的分析稱爲動態分析)。
該過程提供了對代碼結構的理解,並有助於確保代碼符合行業標準。
自動化工具能夠幫助程序員和開發人員進行靜態分析。

  • 例如,CheckStyle,FindBugs和PMD for Java

(3)動態代碼分析/性能分析

動態程序分析是經過執行程序執行的軟件分析。
目標程序必須執行足夠的測試輸入以產生有趣的行爲。
使用諸如代碼覆蓋率之類的軟件測試措施有助於確保已經觀察到該程序的一組可能行爲的足夠部分。
性能分析(「程序性能分析」,「軟件性能分析」)是一種動態程序分析的形式,用於度量程序的空間(內存)或時間複雜度,特定指令的使用狀況,函數調用的頻率和持續時間。

(4)調試和測試

什麼是測試?
軟件測試是一項調查,旨在爲利益相關者提供有關被測產品或服務質量的信息。
測試技術包括執行程序或應用程序的過程,目的是查找軟件錯誤(錯誤或其餘缺陷),並驗證軟件產品是否適合使用。
軟件測試涉及執行軟件組件或系統組件來評估一個或多個感興趣的屬性。

什麼是調試?
調試是識別錯誤的根本緣由並對其進行糾正的過程。與測試造成對比,測試是最初檢測錯誤的過程,調試是做爲成功測試的結果而發生的。

  • 在某些項目中,調試佔用了總開發時間的50%。
  • 對於許多程序員來講,調試是編程中最難的部分。

像測試同樣,調試不是提升軟件質量的方法,但它是診斷缺陷的一種方法。

  • 軟件質量必須從一開始就內置。構建優質產品的最佳方式是仔細開發需求,設計良好並使用高質量的編碼實踐。
  • 調試是最後的手段。

(5)重構

重構是改變軟件系統的過程,它不會改變代碼的外部行爲,但會改進其內部結構。

  • 投入短時間時間/工做成本以得到長期收益,並對系統的總體質量進行長期投資。

重構包括:

  • 重組(從新排列)代碼...
  • ...在一系列小的保留語義的轉換中......
  • ...爲了使代碼更易於維護和修改

重構不只僅是舊的重組

  • 您須要保持代碼正常工做
  • 您須要一些小步驟來保留語義
  • 您須要進行單元測試來證實代碼正常工做

2軟件構建的狹義過程(Build)

粗略理解build:build-time到run-time 藉助於工具,將軟件構造各階段的活動「自動化」 (編譯、打包、靜態分析、測試、生成文檔、部署、…) 儘量脫離「手工做業」,提升構造效率。

(1)構建系統

典型的BUILD場景
用傳統編譯語言編寫的軟件,如C,C ++,Java和C#。
用諸如Perl和Python之類的解釋性語言編寫的軟件的打包和測試。
編譯和打包基於Web的應用程序。

  • 這些包括靜態HTML頁面,使用Java或C#編寫的源代碼,使用JSP(Java Server Pages),ASP(Active Server Pages)或PHP(超文本預處理器)語法編寫的混合文件以及多種類型的配置文件。

執行單元測試以驗證軟件的一小部分與代碼的其他部分隔離。
執行靜態分析工具來識別程序源代碼中的錯誤。 這個構建系統的輸出是一個錯誤報告文檔,而不是一個可執行程序。
生成PDF或HTML文檔。 這種類型的構建系統使用一系列不一樣格式的輸入文件,但生成可讀的文檔做爲輸出。

編譯型語言

編譯型語言,如C,C ++,Java和C#。 在這個模型中,源文件被編譯成目標文件,而後連接到代碼庫或可執行程序中。
生成的文件被收集到可安裝在目標機器上的發行包中。

解釋型語言

解釋型語言的源代碼不會被編譯到目標代碼中,因此不須要對象樹。 源文件自己被收集到一個發行包中,能夠安裝在目標機器上。
編譯工具專一於轉換源文件並將它們存儲在發行包中。
編譯成機器碼不會在構建時執行,而是可能在運行時發生。

基於Web的應用程序

基於Web應用程序的構建系統是編譯代碼,解釋代碼和配置或數據文件的混合。
有些文件(如HTML文件)直接從源代碼樹複製到發行包,而其餘文件(如Java源文件)則首先編譯爲目標代碼。
靜態HTML文件,只包含標記數據以便在Web瀏覽器中顯示。 這些文件直接複製到發行包。
包含代碼的JavaScript文件將由最終用戶的Web瀏覽器解釋。 這些文件也直接複製到發行包。
JSP,ASP或PHP頁面,包含HTML和程序代碼的混合。 這些文件由Web應用程序服務器而不是構建系統編譯和執行。 這些文件也被複制到發佈包中,準備安裝到Web服務器上。
將Java源文件編譯爲目標代碼並打包爲Web應用程序的一部分。 構建系統在打包Java類文件以前執行此轉換。 Java類在Web應用程序服務器上執行,甚至在Web瀏覽器內執行(使用Java小程序)。

(2)構建系統的組件

版本控制工具
源代碼樹:程序的源代碼被存儲爲多個磁盤文件。 將這些文件安排到不一樣的地方稱爲源代碼樹。 源代碼樹的結構一般反映了軟件的體系結構。
對象樹:一個單獨的樹層次結構,用於存儲由構建過程構建的任何對象文件或可執行程序。
編譯工具:將可讀的源文件轉換爲機器可讀的可執行程序文件的程序。

  • 編譯器:源文件對象文件
  • 連接器:多個相關的目標文件可執行程序映像
  • 基於UML的代碼生成器:模型源代碼文件
  • 文件生成器:腳本文件

構建系統的組件

構建工具:一種在編譯工具之上的級別上運行的程序。 它必須對源文件和目標文件之間的關係有足夠的瞭解,以便它能夠編排整個構建過程。 構建工具調用必要的編譯工具來產生最終的構建輸出。

構建機器:編譯和構建工具執行的機器。

  • 本地編譯環境:軟件在與生成機器相同的目標機器上執行;
  • 交叉編譯環境:須要兩臺不一樣的機器,目標機器上有不一樣的操做系統或CPU。

發佈打包和目標機器:生成能夠實際安裝在用戶機器上的東西。

  • 從源和目標樹中提取相關文件並將它們存儲在發行包中。
  • 發行包應該是單個磁盤文件,而且應該進行壓縮以減小下載所需的時間。
  • 任何沒必要要的調試信息都應該被刪除,以避免它們擾亂軟件的安裝。

包裝類型:

  • 檔案文件:zip和解壓縮
  • 軟件包管理工具:UNIX風格,例如.rpm和.deb
  • 定製的GUI安裝工具:Windows風格

(3)構建過程和構建描述

構建過程:構建工具調用每一個編譯工具來完成工做,這是一個端到端的事件序列。

構建語言(構建說明)
構建工具須要構建描述以基於文本的格式編寫。

  • 它遵循特定構建語言的語法規則。

例如,使用Make時,將以規則的形式指定文件間依賴關係信息,這些規則存儲在名爲Makefile的文件中。
您能夠手動編寫描述或經過IDE生成描述。

如何使用構建系統
開發人員(或私人)構建:開發人員檢出了VCS的源代碼並正在專用工做區中構建軟件。
發佈版本:爲測試組提供一個完整的軟件包供驗證。 當測試人員確信軟件的質量足夠高時,就能夠爲客戶提供相同的軟件包。

可用性構建:構建過程肯定當前的源代碼是否沒有錯誤而且經過了一套基本的可用性測試。 這種構建能夠天天發生屢次,而且趨向於徹底自動化。

  • 每日生成/每晚構建
  • 持續集成(CI)

(4)Java編譯工具

那麼Java呢?
Java語言的一大賣點是它的「一次編寫,隨處運行」的理念。
也就是說,應該能夠在Linux機器上編譯一個Java程序,而後在Windows或Solaris機器上運行它而不作任何修改。
這是經過使用由Java虛擬機(JVM)解釋的標準字節代碼集來實現的。
因爲Java的安全特性,能夠限制執行Java程序的環境,所以能夠執行不受信任的程序而不用擔憂會損害主機。

Java中的編譯工具
Java開發工具包(JDK)
GNU Java編譯器
Eclipse Java編譯器(ECJ)

Java中的對象文件
Java類的目標文件格式稱爲類文件,其後綴爲.class。
與機器無關的字節代碼,用於描述程序的流程,而不是直接編譯爲本地機器代碼。
Java虛擬機(JVM)須要加載和解釋這些字節代碼,儘管JVM在實際執行程序以前可能首先將它們轉換爲本地機器代碼。
使用javac命令將Java源文件轉換爲類文件。

Java的可執行程序
Java編程是動態類加載。 生成可執行程序不須要構建時連接步驟。 相反,當運行的程序須要它們時,Java類會單獨加載到內存中。 沒有單個可執行程序映像須要加載。
Java程序只是一個動態庫的集合,儘管單個類一次加載一次,而不是做爲更大的共享庫的一部分。
Java程序須要執行兩件事情:

  • 必須爲JVM提供包含主方法的類的名稱。 這被用做執行的起點。
  • JVM還必須提供一個類路徑,該路徑用於標識能夠找到其餘類的位置。

Java中的庫
除了指定能夠找到.class文件的目錄列表以外,能夠將Java類放入較大的歸檔文件中,稱爲JAR文件。
大多數Java應用程序更喜歡JAR文件格式(後綴爲.jar),只是由於操做JAR文件比打包和分發大量.class文件更容易。

JAR文件一般用做分發程序的手段。
您不只能夠將本身的軟件打包爲JAR文件,還能夠經過獲取其餘人的JAR文件並將其添加到您本身的類路徑中來合併第三方軟件包。
因爲動態加載系統,您能夠隨時替換和升級JAR文件。

(5)子目標和構建變體

構造方式
是否只有一種方法能夠將每一個源文件編譯並連接到可執行程序中,而且只能生成一種類型的發佈包?
但實際上,能夠存在任意數量的變體,每一個變體都使用稍微修改的構建過程並建立一個稍微不一樣的發佈包。

三種不一樣的構建方式

構建子目標:只對構建樹的一部分進行增量更改的開發人員更願意僅重建他們正在處理的樹的部分。

構建軟件的不一樣版本:輸出是自定義的,以改變軟件的行爲。 這些變化可能包括支持天然語言或支持不一樣的產品功能組合,例如家庭版或專業版。

構建不一樣的目標體系結構:要在不一樣的目標機器上支持軟件產品,必須爲各類不一樣的CPU類型和操做系統編譯相同的源文件集。 這包括x86,MIPS和PowerPC等CPU以及Linux,Windows和Mac OS X等操做系統。

構建子目標
任何大型軟件均可以分紅許多子組件,一般採用靜態或動態庫的形式。 每一個組件僅提供程序的所有功能的一部分,而且在某種程度上獨立於其餘組件開發。
爲了不耗費時間構建整個源代碼樹來建立最終的可執行程序,最好選擇限制它們構建的子組件的數量,而不是始終重建整個源代碼樹。

構建不一樣版本的軟件
構建不一樣的版本

  • 語言和文化,本地化
  • 硬件變化
  • 訂價選項

指定構建變體:
修改代碼:

  • 逐行變化
  • 每一個變體文件
  • 每一個變體目錄
  • 每一個變體的構建描述文件

構建不一樣的目標架構
只有在編譯爲本地代碼的C和C ++等語言編程時,這種類型的變體纔有意義。
它與使用與機器無關的虛擬機的Java和C#不相關。

(6)構建工具

Java的構建工具:

  • Make
  • Ant
  • Maven
  • Gradle
  • Eclipse IDE

總結

軟件構建的通常過程:設計->編程/重構->調試->測試->構建->發佈

  • 編程/重構
  • 審查和靜態代碼分析
  • 調試(傾倒和記錄)和測試
  • 動態代碼分析/分析

軟件構建的狹義過程(Build):驗證->編譯->連接->測試->軟件包->安裝->部署

  • 構建系統:組件和過程
  • 構建變體並構建語言
  • 構建工具:Make,Ant,Maven,Gradle,Eclipse
相關文章
相關標籤/搜索