軟件構建的通常過程:java
軟件構建的狹義過程(Build):程序員
總結編程
(1)編程
構建語言可根據如下兩種原則分類:小程序
語言的目的瀏覽器
語言的形式安全
(1)編程語言服務器
編程工具
集成開發環境(IDE):爲程序員提供軟件開發的綜合設施。
IDE一般由如下部分組成:架構
Eclipse做爲IDE的例子
Eclipse IDE:用於Java的開放源代碼IDE,但不限於C / C ++,PHP,Python等,最初是做爲專有IBM產品開發的(Visual age for Smalltalk / Java)框架
Eclipse IDE的核心組件
運行時核心編程語言
資源管理
Eclipse IDE的核心組件
工做臺UI核心
Java開發工具(JDT)
插件開發環境(PDE)
(2)建模語言
建模語言是可用於表達信息或知識或系統的任何人造語言,該結構由一組一致的規則定義,目標是可視化,推理,驗證和傳達系統設計。
UML:Unified Modeling Language統一建模語言
(3)配置語言
配置文件配置程序的參數和初始設置。
目的示例:
配置語言示例:
(2)回顧和靜態代碼分析
審查和靜態分析/檢查
代碼審查是對源代碼的系統審查(同行評議)。
正式的代碼審查
正式的代碼審查,例如Fagan檢查,涉及多個參與者和多個階段的仔細和詳細的過程。
輕量級代碼審查
輕量級代碼審查一般比正式的代碼檢查要求更少的開銷,但若是正確完成,它能夠一樣有效。
輕量級審查一般做爲正常開發過程的一部分進行:
靜態代碼分析
靜態代碼分析是在沒有實際執行程序的狀況下執行的計算機軟件分析(對執行程序執行的分析稱爲動態分析)。
該過程提供了對代碼結構的理解,並有助於確保代碼符合行業標準。
自動化工具能夠幫助程序員和開發人員進行靜態分析。
(3)動態代碼分析/性能分析
動態程序分析是經過執行程序執行的軟件分析。
目標程序必須執行足夠的測試輸入以產生有趣的行爲。
使用諸如代碼覆蓋率之類的軟件測試措施有助於確保已經觀察到該程序的一組可能行爲的足夠部分。
性能分析(「程序性能分析」,「軟件性能分析」)是一種動態程序分析的形式,用於度量程序的空間(內存)或時間複雜度,特定指令的使用狀況,函數調用的頻率和持續時間。
(4)調試和測試
什麼是測試?
軟件測試是一項調查,旨在爲利益相關者提供有關被測產品或服務質量的信息。
測試技術包括執行程序或應用程序的過程,目的是查找軟件錯誤(錯誤或其餘缺陷),並驗證軟件產品是否適合使用。
軟件測試涉及執行軟件組件或系統組件來評估一個或多個感興趣的屬性。
什麼是調試?
調試是識別錯誤的根本緣由並對其進行糾正的過程。與測試造成對比,測試是最初檢測錯誤的過程,調試是做爲成功測試的結果而發生的。
像測試同樣,調試不是提升軟件質量的方法,但它是診斷缺陷的一種方法。
(5)重構
重構是改變軟件系統的過程,它不會改變代碼的外部行爲,但會改進其內部結構。
重構包括:
重構不只僅是舊的重組
2軟件構建的狹義過程(Build)
粗略理解build:build-time到run-time 藉助於工具,將軟件構造各階段的活動「自動化」 (編譯、打包、靜態分析、測試、生成文檔、部署、…) 儘量脫離「手工做業」,提升構造效率。
(1)構建系統
典型的BUILD場景
用傳統編譯語言編寫的軟件,如C,C ++,Java和C#。
用諸如Perl和Python之類的解釋性語言編寫的軟件的打包和測試。
編譯和打包基於Web的應用程序。
執行單元測試以驗證軟件的一小部分與代碼的其他部分隔離。
執行靜態分析工具來識別程序源代碼中的錯誤。 這個構建系統的輸出是一個錯誤報告文檔,而不是一個可執行程序。
生成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)構建系統的組件
版本控制工具
源代碼樹:程序的源代碼被存儲爲多個磁盤文件。 將這些文件安排到不一樣的地方稱爲源代碼樹。 源代碼樹的結構一般反映了軟件的體系結構。
對象樹:一個單獨的樹層次結構,用於存儲由構建過程構建的任何對象文件或可執行程序。
編譯工具:將可讀的源文件轉換爲機器可讀的可執行程序文件的程序。
構建系統的組件
構建工具:一種在編譯工具之上的級別上運行的程序。 它必須對源文件和目標文件之間的關係有足夠的瞭解,以便它能夠編排整個構建過程。 構建工具調用必要的編譯工具來產生最終的構建輸出。
構建機器:編譯和構建工具執行的機器。
發佈打包和目標機器:生成能夠實際安裝在用戶機器上的東西。
包裝類型:
(3)構建過程和構建描述
構建過程:構建工具調用每一個編譯工具來完成工做,這是一個端到端的事件序列。
構建語言(構建說明)
構建工具須要構建描述以基於文本的格式編寫。
例如,使用Make時,將以規則的形式指定文件間依賴關係信息,這些規則存儲在名爲Makefile的文件中。
您能夠手動編寫描述或經過IDE生成描述。
如何使用構建系統
開發人員(或私人)構建:開發人員檢出了VCS的源代碼並正在專用工做區中構建軟件。
發佈版本:爲測試組提供一個完整的軟件包供驗證。 當測試人員確信軟件的質量足夠高時,就能夠爲客戶提供相同的軟件包。
可用性構建:構建過程肯定當前的源代碼是否沒有錯誤而且經過了一套基本的可用性測試。 這種構建能夠天天發生屢次,而且趨向於徹底自動化。
(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程序須要執行兩件事情:
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的構建工具:
總結
軟件構建的通常過程:設計->編程/重構->調試->測試->構建->發佈
軟件構建的狹義過程(Build):驗證->編譯->連接->測試->軟件包->安裝->部署