㈠ 軟體體系結構如何考慮 考慮哪些因素 採用什麼結構
軟體的體系結構是由某一專業(科、課)的體系決定的,實質是是考慮本專業內重要的信息流轉的方式、方法或者是工作流程,這是寫軟體時要的分層、分級管理的決策程序;一般是採用自上而下(決策點)或是自下而上(信息點)相結合的方法。這種層級關系即是結構,信息點與決策點就是重點因素。
由此而建立的模型就是軟體的輪廓!
語言方面千奇百怪,只是實現模型的工具而已。
㈡ 程序編譯器的體系結構適合使用什麼體系結構
計算機體系結構(ComputerArchitecture)是程序員所看到的計算機的屬性,即概念性結構與功能特性。按照計算機系統的多級層次結構,不同級程序員所看到的計算機具有不同的屬性。
一般來說,低級機器的屬性對於高層機器程序員基本是透明的,通常所說的計算機體系結構主要指機器語言級機器的系統結構。
經典的關於「計算機體系結構(computerarchitecture)」的定義是1964年C.M.Amdahl在介紹IBM360系統時提出的,其具體描述為「計算機體系結構是程序員所看到的計算機的屬性,即概念性結構與功能特性」 。
㈢ 什麼是編譯器
編譯器
編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。
[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。
一個現代編譯器的主要工作流程如下:
* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)
工作原理
編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
編譯器種類
編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。
預處理器(preprocessor)
作用是通過代入預定義等程序段將源程序補充完整。
編譯器前端(frontend)
前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。
編譯器後端(backend)
編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。
編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。
常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。
上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。
機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。
㈣ 編譯器採用什麼軟體體系結構風格
軟體架構:整個軟體系統的各個模塊之間的結構設計,是軟體工程范疇的概念,就象設計一棟房子由幾個什麼樣的板塊組成一樣。
軟體體系結構:是軟體編程風格範疇的一個通俗概念,比如說用C++、PoworBuild、Delphi等來進行軟體設計是面向對象的編程語言體系結構,而Basic、C、Foxbase的軟體體系結構特點是面向任務流程的(不是面向對象的編程語言)。
㈤ java虛擬機採用什麼軟體體系結構
JAVA虛擬機的生命周期
一個運行時的Java虛擬機實例的天職是:負責運行一個java程序。當啟動一個Java程序時,一個虛擬機實例也就誕生了。當該程序關閉退出,這個虛擬機實例也就隨之消亡。如果同一台計算機上同時運行三個Java程序,將得到三個Java虛擬機實例。每個Java程序都運行於它自己的Java虛擬機實例中。
Java虛擬機實例通過調用某個初始類的main()方法來運行一個Java程序。而這個main()方法必須是共有的(public)、靜態的(static)、返回值為void,並且接受一個字元串數組作為參數。任何擁有這樣一個main()方法的類都可以作為Java程序運行的起點。
Java語言中的所有基本類型同樣也都是Java虛擬機中的基本類型。但是boolean有點特別,雖然Java虛擬機也把boolean看做基本類型,但是指令集對boolean只有很有限的支持,當編譯器把Java源代碼編譯為位元組碼時,它會用int或者byte來表示boolean。在Java虛擬機中,false是由整數零來表示的,所有非零整數都表示true,涉及boolean值的操作則會使用int。另外,boolean數組是當做byte數組來訪問的,但是在「堆」區,也可以被表示為位域。
Java虛擬機還有一個只在內部使用的基本類型:returnAddress,Java程序員不能使用這個類型,這個基本類型被用來實現Java程序中的finally子句。該類型是jsr, ret以及jsr_w指令需要使用到的,值是JVM指令的操作碼的指針。returnAddress類型不是簡單意義上的數值,不屬於任何一種基本類型,並且值是不能被運行中的程序所修改的。
Java虛擬機的引用類型被統稱為「引用(reference)」,有三種引用類型:類類型、介面類型、以及數組類型,值都是對動態創建對象的引用。類類型的值是對類實例的引用;數組類型的值是對數組對象的引用,在Java虛擬機中,數組是個真正的對象;而介面類型的值,則是對實現了該介面的某個類實例的引用。還有一種特殊的引用值是null,表示該引用變數沒有引用任何對象。
㈥ 編譯器是什麼。
1、 visual c++6.0 (win8系統下不好用,C/C++)-Microsoft Visual C++ ;
2、 visual studio (2005、2008、2010、2012、2013)- Microsoft Visual Studio ;
3、 win-tc非常方便:不騙你,2000/XP/7都可以用 ;
4、 Code::Blocks(win7、8都可以用);
5、 Turb C(只能編譯C語言) ;
6、 gcc (GNU編譯器套件) ;
7、 DEV C++;
8、 C-Free;
9、 Borland C++、WaTCom C++、Borland C++ Builder、GNU DJGPP C++、Lccwin32 C Compiler3.1、High C、My Tc等,由於C語言比較成熟,所以編程環境很多;
10、還常用souceinsight ,在工作中還用Labwindows編程,直接調試運行,不過那是有工程背景,有工作經驗的技術人員用的。
㈦ 軟體體系結構的體系風格
軟體體系結構是具有一定形式的結構化元素,即構件的集合,包括處理構件、數據構件和連接構件。處理構件負責對數據進行加工,數據構件是被加工的信息,連接構件把體系結構的不同部分組組合連接起來。這一定義注重區分處理構件、數據構件和連接構件,這一方法在其他的定義和方法中基本上得到保持。
㈧ 為什麼在系統架構中散試架構使用得最多
系統架構中三四架構使用的最多那肯定是散是的,加工人們需要的多,所以它的使用就是最多的了。
㈨ 有哪些體系結構模式
一、體系結構定義:
體系結構是一個計算機術語,由G. Amdahl於1964年首次提出體系結構概念,為以後計算機系統的設計與開發奠定了良好的基礎。體系結構包括數據流系統、調用-返回系統、獨立部件、虛擬機、以數據為中心的系統(庫)、特殊領域風格、特殊結構風格、不同風格合成建立的異構結構、最初始最基本的主程序/子程序九大內容。
二、體系結構由來:
在傳統的程序設計領域中,人們使用流程圖來表達系統的基本功能和實現的具體邏輯,但是,流程圖實際上僅僅是源程序的圖形化表示,無法給系統的分析和開發者提供更多的信息,所以沒有在實際的系統開發過程中得到廣泛的應用。隨著軟體系統的規模和復雜性的增加,對軟體系統的整體結構(數據和控制的邏輯)進行分析和描述成為大型系統開發的一個不可缺少的重要部分,顯然,使用流程圖是無法達到這個目標的,我們必須使用新的方法和概念來對系統的整體結構進行把握。
三、體系結構的分類:
1.數據流系統,包括順序批處理、管道和過濾器;
2. 調用-返回系統,包括主程序和子程序、面向對象系統、層次結構;
3. 獨立部件,包括通信進程、事件隱式調用;
4.虛擬機,包括解釋器、規則基系統;
5. 以數據為中心的系統(庫),包括資料庫、超文本系統、黑板系統;
6. 特殊領域風格;例如過程式控制制、模擬器;
7. 特殊結構的風格,例如分布式處理、狀態轉移系統;
8. 不同風格合成建立的異構結構;
9. 最初始、最基本的主程序/子程序。
四、結構範式:
1.管道和過濾器
每個組件具有輸入和輸出的集合,從流中讀出數據作為輸入,產生輸出數據的流。整個系統可以看成多個過濾器復合形成的數據處理組件。
過濾器A
過濾器B
過濾器C
管道
特點:
過濾器之間是相互獨立的(不能共享狀態),其中一個過濾器的操作和行為不能影響另外過濾器的操作和行為,流的傳送沒有副作用。
過濾器對所輸入流的來源和輸出流的去向不關心,不需要知道流的來源和流的去向,來源和去向對於過濾器的數據處理沒有任何影響。
過濾和流的傳送可以是並發的,可以同時有多個流的傳送存在於系統之中。
實例:
一個最著名的實例是unix的shell編程,多個對數據進行處理的程序(組件)通過管道聯結起來,產生總和的效果;還有傳統的編譯器,源代碼經過詞法分析、語法分析、中間代碼生成、目標代碼生成等步驟生成輸出的目標代碼。
優點:
整個系統的功能是多個過濾器作用的總和,這樣可以簡化系統的分析和設計,可以經過需求的分析之後將整個系統作為一個過濾器處理,然後再逐步的細化成為多個相互連接的過濾器。
支持組件的重用,同一個過濾器可以多次出現在系統的不同位置。
易於維護和增強,過濾器可以被替換,可以增加新的過濾器到系統中而不改變原有的過濾器,不改變原來系統的基本功能。
本質上的並發性支持,這種體系結構由於本質上是與各個獨立的過濾器的狀態無關的,與並行的流的通過次序也是無關的,所以並發是一個基本的體系結構自然具有的特性。
缺點:
由於過濾器之間本質上是獨立的,所以設計者必須獨立考慮每一個過濾器的輸入、處理和輸出的過程,對於過濾器邏輯上的共同點和相互關系無法在設計中加以體現。
由於這種體系的批處理特性,所以不適合開發和用戶交互的應用程序。
系統的多個處理流之間的共同特性無法提取、多個過濾器之間的共同特性也無法提取,所以增加了設計的復雜性。
2.面向對象的體系
在這種體系中,數據和數據上的操作被封裝成抽象數據類型或者對象。系統由大量的對象組成,在物理上,對象之間通過函數或者過程調用相互作用;在邏輯上,對象之間通過集成、復合等方式實現設計的復用。
對象D
對象B
對象A
對象E
對象C
對象調用
對象調用
對象調用
類A
類B
類C
類G
對象A
對象E
類F
復合
繼承
物理結構邏輯結構
特點:
面向對象系統分析和設計的資料已經太多,這里就不再詳細說明了。
優點:
由於封裝,實現了靈活性和擴充性,隱藏了實現的細節,提高代碼的質量;
使用繼承和多態、提高了軟體的可重用性。
缺點:
最主要的缺點是,由於對象之間的交互是通過明確的對象函數調用進行的,所以當一個對象需要實現一個特定功能的時候,必須知道哪一個對象提供這種服務,這就降低了系統的靈活性。管道和過濾器模型不需要明確指明數據的來源和去向。
事件驅動的體系
對象E
對象E
對象E
事件分發的匯流排
事件的創建
事件接收者的注冊的創建
對象E
這是面向對象和數據抽象體系的一種變形,系統同樣是由大量的對象組成的,但是對象之間的交互不是通過明確指明對象的函數或者過程調用進行的,相反,系統提供事件的創建和發布的機制,對象產生事件,一個或者多個對象通過向系統注冊關注這個事件並由此觸發出相應的行為或者產生新的事件。
實例:
一個最著名的例子是GUI的模型,滑鼠、鍵盤或者其他輸入設備產生各種事件,窗口、程序或者其他對象有這些事件所觸發,產生新的事件、進行數據處理或者其他操作。
優點:
用於函數和過程的調用調用不需要指明特定的對象,所以系統具有非常好的靈活性和擴展性,新的組件只需要向系統的事件處理部分注冊就可以立刻加入系統中,同樣,老的組件也可以方便的從系統中刪除。對於動態性要求特別高的系統,特別是如果需要在運行時對系統進行擴充,應該採用該結構。
缺點:
由於函數調用是通過事件發送進行的,所以,發出事件的對象不能確認是否有對象處理了這個事件、是否是期望的對象處理了這個事件、是否獲得期望的結果,同樣也無法控制事件發生的次序,系統的邏輯和時序的正確性必須通過復雜的時序邏輯和前後條件的斷言加以保證。
3.分層次的體系
將系統功能和組件分成不同的功能層次,一般而言,只有最上層的組件和功能可以被系統外的使用者訪問,只有相鄰的層次之間才能夠有函數調用。
下面是一個基本的商務處理系統的層次結構:
用戶界面層
事務邏輯層
核心層
實例:
顯然,ISO的OSI(開放系統互連)參考模型是最著名的層次模型的例子,通過將開放系統的功能和組件劃分成7個層次,定義清晰的(很多時候是過於復雜的)層次之間的介面,實現復雜的互操作性。
優點:
系統的開發和設計可以逐步的分層次的進行,從底層的簡單的功能逐步建立高層的復雜和抽象的功能。
靈活性和擴展性,由於相鄰層次之間通過清晰的介面交互,所以特定的層次可以被替換和增強,甚至可以增加新的層次。
缺點:
不是所有的系統都可以分解成為清楚的層次
劃分清晰、邏輯上一致的層次是非常困難的(OSI的失敗和TCP/IP的成功說明了這一點)
嚴格的層次調用結構會降低系統的性能。
4.知識庫體系
使用一個中心數據結構表示系統的當前狀態,一組相互獨立的組件在中心資料庫上進行操作。如果組件負責對中心數據進行選擇、處理,這種體系就是傳統的資料庫模型;如果中心數據結構自主的引發一系列的行為,則這種體系可以看成一個黑板模型。
中心資料庫(知識庫)
客戶組件A
客戶組件B
客戶組件C
實例:
大量的傳統資料庫應用程序實際上就是這一體系的具體實例。在很多研究系統中,使用的基於知識庫的黑板模型,實際上也是這種體系
優點:
以數據為中心的體系結構,可以自然的表示大量的數據和事務處理的邏輯,適合表達以數據為重新的應用程序。
缺點:
只有很少一部分簡單的資料庫存儲應用可以完全採用這種體系結構表示,在大量實際的商業應用中,完成師傅處理和其他邏輯的應用程序必須採用其他的體系結構表達
5.解釋器體系
用戶
如果應用程序的邏輯非常復雜,例如,AutoCAD的各種繪圖指令,而且,用戶可能以非常復雜的方式使用這個系統,一個較好的體系就是提供面向領域的一組指令(語言),系統解釋這種語言,產生相應的行為,用戶使用這種指令(語言)完成復雜的操作。
使用虛擬機語言描述的業務邏輯
虛擬機解釋器
完成實際操作任務的基本指令
實際的問題領域
實例:
大量的開發工具、二次開發工具體現了這一思想:微軟在其產品中大量使用的Visual Basic for Application,以及在AutoDesk產品中大量使用的AutoLisp語言,實際上就是給用戶提供了一種面向領域的語言,然後核心解釋執行這一語言的指令和指令序列。從而擴充產品的功能,方便用戶按照自己的需要定製系統。
優點:
非常好的擴展性,用戶可以實現對軟體系統的二次開發
缺點:
軟體開發復雜,特別是這種指令集的設計非常困難。
是否可以採用一種成熟的語言作為二次開發的基礎(例如,基於Java)