編譯器如何測試循環
『壹』 搞不清while循環的用法,編譯器在while循環里的執行順序是怎樣的
當low小於high時,執行裡面的循環,一直到條件不成立
『貳』 編譯器怎麼識別if和while
while (i <= 100) {
if (i == 50) {
Sleep(1000);
break;
}
if (i != 50)
Sleep(2000);
i++;
}
兩個 if 語句,不管程序會不會執行者兩個 if 語句,程序都會在一次循環中檢查兩個 if 語句,而不會一定執行這兩個語句,如上所述,兩個 if 語句在一個 while 循環中並不會同時執行,上述代碼中的第二個 if 語句完全可以使用 else代替,但是為了保持你問題的效果,我用了 if 語句,兩個產生效果是相同的。
總之:
1. if 語句不會同時執行,你可以將條件同時寫入 if 語句分參數中來達到同時執行的目的。
2. 在循環中的 if 語句,不論有幾個 if 語句,編譯器都會檢查這幾個 if 語句而非執行,如你所知,只有當條件判斷符合是才會執行 if 語句
『叄』 C語言中怎樣將變數進行循環
用數組就可以實現了。
int
a[n];
就是定義了一個類型為int型的數組。分別為a[0],a[1],a[2]......a[n-1];
注意,在C中,數組的長度是從0到n-1的。
然後就可以用循環語句來實現控制了。
『肆』 python 編譯器/解釋器具不具備檢查任意python程序中是否存在無限循環功能 程序中有了i
肯定不可能,應該是任何語言都不可能。當然,除非少數情況可以很容易的推斷出來外。
『伍』 編譯器本身是如何進行測試的
編譯器最重要的性質就是保證語義的正確。比如,從高級語言翻譯到機器指令之後,指令必須正確的表達原來程序的意思。所以一般編譯器測試都包含一些源程序,用來覆蓋可能出現的各種情況。基本的原則是:原來程序的結果 = 編譯後機器指令運行的結果。機器指令運行的結果很容易知道,運行一下就知道了。可是原來程序的結果你怎麼知道呢?
為了解決這個「原來程序語義」的問題,最好是寫一個解釋器,准確無誤的表達原來的代碼的語義。所以我們的要求就是:
高級語言解釋器(源程序) = 機器執行(機器代碼)
由於處理器其實就是一個用來執行機器代碼的解釋器,這里有一個很美好的對稱關系:
interp1(L1) = interp2(L2)
另外還有一個問題,就是編譯器一般需要經過多個轉化步驟(叫做 pass)才能最後編譯為機器指令。比如,
L2 = pass1(source)
L3 = pass2(L2)
L4 = pass3(L3)
Ln = passN(Ln-1)
machine_code = codegen(Ln)
由於源程序經過了很多步驟猜得到最後的機器指令,如果你使用上面的公式,就會出現以下一些情況:
1. 知道結果錯了,但是卻不知道到底是哪一個 pass 錯了。
2. 結果沒有錯,但是中間卻有 pass 實際上是錯的。但是由於之前的 pass 把輸入程序的一些結構給「優化」掉了,所以錯的那個 pass 其實沒能得到觸發錯誤的那個數據結構。所以測試沒能發現錯誤。如果以後前面的那個 pass 被修改,錯誤就會暴露出來。這是非常難以發現的潛伏的危險。
為了防止這些情況出現,一些編譯器(比如 Chez Scheme 和 Kent Dybvig 的課程編譯器)使用了對每一個 pass 進行測試的做法。具體的方法就是為每一個中間語言都寫一個解釋器,把這語言的語義完全的表示出來。這樣我們就需要檢查一組等式:
L2 = pass1(source)
高級語言編譯器(源程序) = interp2(L2) // 測試 pass1 的正確性
L3 = pass2(L2)
interp2(L2) = interp3(L3) // 測試 pass2 的正確性
這樣一來我們就能獨立的判斷每一個 pass 的正確性了。
這些是基本的語義測試原理。另外除了語義,可能還有一些「表面」一些的測試,它們看代碼本身,而不只看它的語義。比如尾遞歸優化的測試應該確保輸出程序的尾遞歸得到正確的處理,等等。這些是語義測試檢查不到的,因為尾遞歸沒有正確處理的程序大部分也能輸出正確的結果。
普通的單元測試方法也可以用來測試一些編譯器里的輔助函數,但那些不是編譯器特有的,所以就不講了。
另外,就像所有測試的局限性一樣,你沒法枚舉所有可能出現的輸入,所以以上的測試方法其實也不能保證編譯器的完全正確。
『陸』 pascal里死循環怎麼辦編譯器能判斷出來嗎
不論什麼語言
屬於邏輯錯誤的目前市面上的常用編譯器都不能進行判斷!
除非特定的編譯器..不過那也不太現實
..死循環只有在運行期間才能表現出來
編譯器如何判斷?
嘿..好像話不能說死了..像WIN系統就能檢測防止死鎖(死鎖與死循環在一定程度上是屬於同種類型)
『柒』 什麼是軟體設計
面向對象技術,特別是C++,似乎給軟體界帶來了不小的震動。出現了大量的論文和書籍去描述如何應用這項新技術。總的來說,那些關於面向對象技術是否只是一個騙局的問題已經被那些關於如何付出最小的努力即可獲得收益的問題所替代。面向對象技術出現已經有一段時間了,但是這種爆炸式的流行卻似乎有點不尋常。人們為何會突然關注它呢?對於這個問題,人們給出了各種各樣的解釋。事實上,很可能就沒有單一的原因。也許,把多種因素的結合起來才能最終取得突破,並且這項工作正在進展之中。盡管如此,在軟體革命的這個最新階段中,C++本身看起來似乎成為了一個主要因素。同樣,對於這個問題,很可能也存在很多種理由,不過我想從一個稍微不同的視角給出一個答案:C++之所以變得流行,是因為它使軟體設計變得更容易的同時,也使編程變得更容易。
雖然這個解釋好像有點奇特,但是它卻是深思熟慮的結果。在這篇論文中,我就是想要關注一下編程和程序設計之間的關系。近10年來,我一直覺得整個軟體行業都沒有覺察到做出一個軟體設計和什麼是真正的軟體設計之間的一個微妙的不同點。只要看到了這一點,我認為我們就可以從C++增長的流行趨勢中,學到關於如何才能成為更好的軟體工程師的意義深遠的知識。這個知識就是,編程不是構建軟體,而是設計軟體。
幾年前,我參見了一個討論會,其中討論到軟體開發是否是一門工程學科的問題。雖然我不記得了討論結果,但是我卻記得它是如何促使我認識到:軟體業已經做出了一些錯誤的和硬體工程的比較,而忽視了一些絕對正確的對比。其實,我認為我們不是軟體工程師,因為我們沒有認識到什麼才是真正的軟體設計。現在,我對這一點更是確信無疑。
任何工程活動的最終目標都是某些類型的文檔。當設計工作完成時,設計文檔就被轉交給製造團隊。該團隊是一個和設計團隊完全不同的群體,並且其技能也和設計團隊完全不同。如果設計文檔正確地描繪了一個完整的設計,那麼製造團隊就可以著手構建產品。事實上,他們可以著手構建該產品的許多實物,完全無需設計者的任何進一步的介入。在按照我的理解方式審查了軟體開發的生命周期後,我得出一個結論:實際上滿足工程設計標準的惟一軟體文檔,就是源代碼清單。
對於這個觀點,人們進行了很多的爭論,無論是贊成的還是反對的都足以寫成無數的論文。本文假定最終的源代碼就是真正的軟體設計,然後仔細研究了該假定帶來的一些結果。我可能無法證明這個觀點是正確的,但是我希望證明:它確實解釋了軟體行業中一些已經觀察到的事實,包括C++的流行。
在把代碼看作是軟體設計所帶來的結果中,有一個結果完全蓋過了所有其他的結果。它非常重要並且非常明顯,也正因為如此,對於大多數軟體機構來說,它完全是一個盲點。這個結果就是:軟體的構建是廉價的。它根本就不具有昂貴的資格;它非常的廉價,幾乎就是免費的。如果源代碼是軟體設計,那麼實際的軟體構建就是由編譯器和連接器完成的。我們常常把編譯和連接一個完整的軟體系統的過程稱為「進行一次構建」。在軟體構建設備上所進行的主要投資是很少的——實際需要的只有一台計算機、一個編輯器、一個編譯器以及一個連接器。一旦具有了一個構建環境,那麼實際的軟體構建只需花費少許的時間。編譯50 000行的C++程序也許會花費很長的時間,但是構建一個具有和50 000行C++程序同樣設計復雜性的硬體系統要花費多長的時間呢?
把源代碼看作是軟體設計的另外一個結果是,軟體設計相對易於創作,至少在機械意義上如此。通常,編寫(也就是設計)一個具有代表性的軟體模塊(50至100行代碼)只需花費幾天的時間(對它進行完全的調試是另外一個議題,稍後會對它進行更多的討論)。我很想問一下,是否還有任何其他的學科可以在如此短的時間內,產生出和軟體具有同樣復雜性的設計來,不過,首先我們必須要弄清出如何來度量和比較復雜性。然而,有一點是明顯的,那就是軟體設計可以 極為迅速地變得非常龐大。
假設軟體設計相對易於創作,並且在本質上構建起來也沒有什麼代價,一個不令人吃驚的發現是,軟體設計往往是難以置信的龐大和復雜。這看起來似乎很明顯,但是問題的重要性卻常常被忽視。學校中的項目通常具有數千行的代碼。具有10 000行代碼(設計)的軟體產品被它們的設計者丟棄的情況也是有的。我們早就不再關注於簡單的軟體。典型的商業軟體的設計都是由數十萬行代碼組成的。許多軟體設計達到了上百萬行代碼。另外,軟體設計幾乎總是在不斷地演化。雖然當前的設計可能只有幾千行代碼,但是在產品的生命期中,實際上可能要編寫許多倍的代碼。
盡管確實存在一些硬體設計,它們看起來似乎和軟體設計一樣復雜,但是請注意兩個有關現代硬體的事實。第一,復雜的硬體工程成果未必總是沒有錯誤的,在這一點上,它不存在像軟體那樣讓我們相信的評判標准。多數的微處理器在發售時都具有一些邏輯錯誤:橋梁坍塌,大壩破裂,飛機失事以及數以千計的汽車和其他消費品被召回——所有的這些我們都記憶猶新,所有的這些都是設計錯誤的結果。第二,復雜的硬體設計具有與之對應的復雜、昂貴的構建階段。結果,製造這種系統所需的能力限制了真正能夠生產復雜硬體設計公司的數目。對於軟體來說,沒有這種限制。目前,已經有數以百計的軟體機構和數以千計的非常復雜的軟體系統存在,並且數量以及復雜性每天都在增長。這意味著軟體行業不可能通過仿效硬體開發者找到針對自身問題的解決辦法。倘若一定要說出有什麼相同之處的話,那就是,當CAD和CAM可以做到幫助硬體設計者創建越來越復雜的設計時,硬體工程才會變得和軟體開發越來越像。
設計軟體是一種管理復雜性的活動。復雜性存在於軟體設計本身之中,存在於公司的軟體機構之中,也存在於整個軟體行業之中。軟體設計和系統設計非常相似。它可以跨越多種技術並且常常涉及多個學科分支。軟體的規格說明往往不固定、經常快速變化,這種變化常常在正進行軟體設計時發生。同樣,軟體開發團隊也往往不固定,常常在設計過程的中間發生變化。在許多方面,軟體都要比硬體更像復雜的社會或者有機系統。所有這些都使得軟體設計成為了一個困難的並且易出錯的過程。雖然所有這些都不是創造性的想法,但是在軟體工程革命開始將近30年後的今天,和其他工程行業相比,軟體開發看起來仍然像是一種未受過訓練(undisciplined)的技藝。
一般的看法認為,當真正的工程師完成了一個設計,不管該設計有多麼復雜,他們都非常確信該設計是可以工作的。他們也非常確信該設計可以使用公認的技術建造出來。為了做到這一點,硬體工程師花費了大量的時間去驗證和改進他們的設計。例如,請考慮一個橋梁設計。在這樣一個設計實際建造之前,工程師會進行結構分析——他們建立計算機模型並進行模擬,他們建立比例模型並在風洞中或者用其他一些方法進行測試。簡而言之,在建造前,設計者會使用他們能夠想到的一切方法來證實設計是正確的。對於一架新型客機的設計來說,情況甚至更加嚴重;必須要構建出和原物同尺寸的原型,並且必須要進行飛行測試來驗證設計中的種種預計。
對於大多數人來說,軟體中明顯不存在和硬體設計同樣嚴格的工程。然而,如果我們把源代碼看做是設計,那麼就會發現軟體工程師實際上對他們的設計做了大量的驗證和改進。軟體工程師不把這稱為工程,而稱它為測試和調試。大多數人不把測試和調試看作是真正的「工程」——在軟體行業中肯定沒有被看作是。造成這種看法的原因,更多的是因為軟體行業拒絕把代碼看作設計,而不是任何實際的工程差別。事實上,試驗模型、原型以及電路試驗板已經成為其他工程學科公認的組成部分。軟體設計者之所以不具有或者沒有使用更多的正規方法來驗證他們的設計,是因為軟體構建周期的簡單經濟規律。
第一個啟示:僅僅構建設計並測試它比做任何其他事情要廉價一些,也簡單一些。我們不關心做了多少次構建——這些構建在時間方面的代價幾乎為零,並且如果我們丟棄了構建,那麼它所使用的資源完全可以重新利用。請注意,測試並非僅僅是讓當前的設計正確,它也是改進設計的過程的一部分。復雜系統的硬體工程師常常建立模型(或者,至少他們把設計用計算機圖形直觀地表現出來)。這就使得他們獲得了對於設計的一種「感覺」,而僅僅去檢查設計是不可能獲得這種感覺的。對於軟體來說,構建這樣一個模型既不可能也無必要。我們僅僅構建產品本身。即使正規的軟體驗證可以和編譯器一樣自動進行,我們還是會去進行構建/測試循環。因此,正規的驗證對於軟體行業來說從來沒有太多的實際意義。
這就是現今軟體開發過程的現實。數量不斷增長的人和機構正在創建著更加復雜的軟體設計。這些設計會被先用某些編程語言編寫出來,然後通過構建/測試循環進行驗證和改進。過程易於出錯,並且不是特別的嚴格。相當多的軟體開發人員並不想相信這就是過程的運作方式,也正因為這一點,使問題變得更加復雜。
當前大多數的軟體過程都試圖把軟體設計的不同階段分離到不同的類別中。必須要在頂層的設計完成並且凍結後,才能開始編碼。測試和調試只對清除建造錯誤是必要的。程序員處在中間位置,他們是軟體行業的建造工人。許多人認為,如果我們可以讓程序員不再進行「隨意的編碼(hacking)」並且按照交給他們的設計去進行構建(還要在過程中,犯更少的錯誤),那麼軟體開發就可以變得成熟,從而成為一門真正的工程學科。但是,只要過程忽視了工程和經濟學事實,這就不可能發生。
例如,任何一個現代行業都無法忍受在其製造過程中出現超過100%的返工率。如果一個建造工人常常不能在第一次就構建正確,那麼不久他就會失業。但是在軟體業中,即使最小的一塊代碼,在測試和調試期間,也很可能會被修正或者完全重寫。在一個創造性的過程中(比如:設計),我們認可這種改進不是製造過程的一部分。沒有人會期望工程師第一次就創建出完美的設計。即使她做到了,仍然必須讓它經受改進過程,目的就是為了證明它是完美的。
即使我們從日本的管理方法中沒有學到任何東西,我們也應該知道由於在過程中犯錯誤而去責備工人是無益於提高生產率的。我們不應該不斷地強迫軟體開發去符合不正確的過程模型,相反,我們需要去改進過程,使之有助於而不是阻礙產生更好的軟體。這就是「軟體工程」的石蕊測試。工程是關於你如何實施過程的,而不是關於是否需要一個CAD系統來產生最終的設計文檔。
關於軟體開發有一個壓倒性的問題,那就是一切都是設計過程的一部分。編碼是設計,測試和調試是設計的一部分,並且我們通常認為的設計仍然是設計的一部分。雖然軟體構建起來很廉價,但是設計起來卻是難以置信的昂貴。軟體非常的復雜,具有眾多不同方面的設計內容以及它們所導致的設計考慮。問題在於,所有不同方面的內容是相互關連的(就像硬體工程中的一樣)。我們希望頂層設計者可以忽視模塊演算法設計的細節。同樣,我們希望程序員在設計模塊內部演算法時不必考慮頂層設計問題。糟糕的是,一個設計層面中的問題侵入到了其他層面之中。對於整個軟體系統的成功來說,為一個特定模塊選擇演算法可能和任何一個更高層次的設計問題同樣重要。在軟體設計的不同方面內容中,不存在重要性的等級。最低層模塊中的一個不正確設計可能和最高層中的錯誤一樣致命。軟體設計必須在所有的方面都是完整和正確的,否則,構建於該設計基礎之上的所有軟體都會是錯誤的。
為了管理復雜性,軟體被分層設計。當程序員在考慮一個模塊的詳細設計時,可能還有數以百計的其他模塊以及數以千計的細節,他不可能同時顧及。例如,在軟體設計中,有一些重要方面的內容不是完全屬於數據結構和演算法的范疇。在理想情況下,程序員不應該在設計代碼時還得去考慮設計的這些其他方面的內容。
但是,設計並不是以這種方式工作的,並且原因也開始變得明朗。軟體設計只有在其被編寫和測試後才算完成。測試是設計驗證和改進過程的基礎部分。高層結構的設計不是完整的軟體設計;它只是細節設計的一個結構框架。在嚴格地驗證高層設計方面,我們的能力是非常有限的。詳細設計最終會對高層設計造成的影響至少和其他的因素一樣多(或者應該允許這種影響)。對設計的各個方面進行改進,是一個應該貫穿整個設計周期的過程。如果設計的任何一個方面內容被凍結在改進過程之外,那麼對於最終設計將會是糟糕的或者甚至無法工作這一點,就不會覺得奇怪了。
如果高層的軟體設計可以成為一個更加嚴格的工程過程,那該有多好呀,但是軟體系統的真實情況不是嚴格的。軟體非常的復雜,它依賴於太多的其他東西。或許,某些硬體沒有按照設計者認為的那樣工作,或者一個庫常式具有一個文檔中沒有說明的限制。每一個軟體項目遲早都會遇到這些種類的問題。這些種類的問題會在測試期間被發現(如果我們的測試工作做得好的話),之所以如此是因為沒有辦法在早期就發現它們。當它們被發現時,就迫使對設計進行更改。如果我們幸運,那麼對設計的更改是局部的。時常,更改會波及到整個軟體設計中的一些重要部分(莫非定律)。當受到影響的設計的一部分由於某種原因不能更改時,那麼為了能夠適應影響,設計的其他部分就必須得遭到破壞。這通常導致的結果就是管理者所認為的「隨意編碼」,但是這就是軟體開發的現實。
例如,在我最近工作的一個項目中,發現了模塊A的內部結構和另一個模塊B之間的一個時序依賴關系。糟糕的是,模塊A的內部結構隱藏在一個抽象體的後面,而該抽象體不允許以任何方法把對模塊B的調用合入到它的正確調用序列中。當問題被發現時,當然已經錯過了更改A的抽象體的時機。正如所料,所發生的就是把一個日益增長的復雜的「修正」集應用到A的內部設計上。在我們還沒有安裝完版本1時,就普遍感覺到設計正在衰退。每一個新的修正很可能都會破壞一些老的修正。這是一個正規的軟體開發項目。最後,我和我的同事決定對設計進行更改,但是為了得到管理層的同意,我們不得不自願無償加班。
在任何一般規模的軟體項目中,肯定會出現像這樣的問題,盡管人們使用了各種方法來防止它的出現,但是仍然會忽視一些重要的細節。這就是工藝和工程之間的區別。如果經驗可以把我們引向正確的方向,這就是工藝。如果經驗只會把我們帶入未知的領域,然後我們必須使用一開始所使用的方法並通過一個受控的改進過程把它變得更好,這就是工程。
我們來看一下只是作為其中很小一點的內容,所有的程序員都知道,在編碼之後而不是之前編寫軟體設計文檔會產生更加准確的文檔。現在,原因是顯而易見的。用代碼來表現的最終設計是惟一一個在構建/測試循環期間被改進的東西。在這個循環期間,初始設計保持不變的可能性和模塊的數量以及項目中程序員的數量成反比。它很快就會變得毫無價值。
在軟體工程中,我們非常需要在各個層次都優秀的設計。我們特別需要優秀的頂層設計。初期的設計越好,詳細設計就會越容易。設計者應該使用任何可以提供幫助的東西。結構圖表、Booch 圖、狀態表、PDL等等——如果它能夠提供幫助,就去使用它。但是,我們必須記住,這些工具和符號都不是軟體設計。最後,我們必須創建真正的軟體設計,並且是使用某種編程語言完成的。因此,當我們得出設計時,我們不應該害怕對它們進行編碼。在必要時,我們必須應該樂於去改進它們。
至今,還沒有任何設計符號可以同時適用於頂層設計和詳細設計。設計最終會表現為以某種編程語言編寫的代碼。這意味著在詳細設計可以開始前,頂層設計符號必須被轉換成目標編程語言。這個轉換步驟耗費時間並且會引入錯誤。程序員常常是對需求進行回顧並且重新進行頂層設計,然後根據它們的實際去進行編碼,而不是從一個可能沒有和所選擇的編程語言完全映射的符號進行轉換。這同樣也是軟體開發的部分現實情況。
也許,如果讓設計者本人來編寫初始代碼,而不是後來讓其他人去轉換語言無關的設計,就會更好一些。我們所需要的是一個適用於各個層次設計的統一符號。換句話說,我們需要一種編程語言,它同樣也適用於捕獲高層的設計概念。C++正好可以滿足這個要求。C++是一門適用於真實項目的編程語言,同時它也是一個非常具有表達力的軟體設計語言。C++允許我們直接表達關於設計組件的高層信息。這樣,就可以更容易地進行設計,並且以後可以更容易地改進設計。由於它具有更強大的類型檢查機制,所以也有助於檢測到設計中的錯誤。這就產生了一個更加健壯的設計,實際上也是一個更好的工程化設計。
最後,軟體設計必須要用某種編程語言表現出來,然後通過一個構建/測試循環對其進行驗證和改進。除此之外的任何其他主張都完全沒有用。請考慮一下都有哪些軟體開發工具和技術得以流行。結構化編程在它的時代被認為是創造性的技術。Pascal使之變得流行,從而自己也變得流行。面向對象設計是新的流行技術,而C++是它的核心。現在,請考慮一下那些沒有成效的東西。CASE工具,流行嗎?是的;通用嗎?不是。結構圖表怎麼樣?情況也一樣。同樣地,還有Warner-Orr圖、Booch圖、對象圖以及你能想起的一切。每一個都有自己的強項,以及惟一的一個根本弱點——它不是真正的軟體設計。事實上,惟一一個可以被普遍認可的軟體設計符號是PDL,而它看起來像什麼呢?
這表明,在軟體業的共同潛意識中本能地知道,編程技術,特別是實際開發所使用的編程語言的改進和軟體行業中任何其他東西相比,具有壓倒性的重要性。這還表明,程序員關心的是設計。當出現更加具有表達力的編程語言時,軟體開發者就會使用它們。
同樣,請考慮一下軟體開發過程是如何變化的。從前,我們使用瀑布式過程。現在,我們談論的是螺旋式開發和快速原型。雖然這種技術常常被認為可以「消除風險」以及「縮短產品的交付時間」,但是它們事實上也只是為了在軟體的生命周期中更早地開始編碼。這是好事。這使得構建/測試循環可以更早地開始對設計進行驗證和改進。這同樣也意味著,頂層軟體設計者很有可能也會去進行詳細設計。
正如上面所表明的,工程更多的是關於如何去實施過程的,而不是關於最終產品看起來的像什麼。處在軟體行業中的我們,已經接近工程師的標准,但是我們需要一些認知上的改變。編程和構建/測試循環是工程軟體過程的中心。我們需要以像這樣的方式去管理它們。構建/測試循環的經濟規律,再加上軟體系統幾乎可以表現任何東西的事實,就使得我們完全不可能找出一種通用的方法來驗證軟體設計。我們可以改善這個過程,但是我們不能脫離它。
最後一點:任何工程設計項目的目標是一些文檔產品。顯然,實際設計的文檔是最重要的,但是它們並非惟一要產生的文檔。最終,會期望某些人來使用軟體。同樣,系統很可能也需要後續的修改和增強。這意味著,和硬體項目一樣,輔助文檔對於軟體項目具有同樣的重要性。雖然暫時忽略了用戶手冊、安裝指南以及其他一些和設計過程沒有直接聯系的文檔,但是仍然有兩個重要的需求需要使用輔助設計文檔來解決。
輔助文檔的第一個用途是從問題空間中捕獲重要的信息,這些信息是不能直接在設計中使用的。軟體設計需要創造一些軟體概念來對問題空間中的概念進行建模。這個過程需要我們得出一個對問題空間中概念的理解。通常,這個理解中會包含一些最後不會被直接建模到軟體空間中的信息,但是這些信息卻仍然有助於設計者確定什麼是本質概念以及如何最好地對它們建模。這些信息應該被記錄在某處,以防以後要去更改模型。
對輔助文檔的第二個重要需要是對設計的某些方面的內容進行記錄,而這些方面的內容是難以直接從設計本身中提取的。它們既可以是高層方面的內容,也可以是低層方面內容。對於這些方面內容中的許多來說,圖形是最好的描述方式。這就使得它們難以作為注釋包含在代碼中。這並不是說要用圖形化的軟體設計符號代替編程語言。這和用一些文本描述來對硬體科目的圖形化設計文檔進行補充沒有什麼區別。
決不要忘記,是源代碼決定了實際設計的真實樣子,而不是輔助文檔。在理想情況下,可以使用軟體工具對源代碼進行後期處理並產生出輔助文檔。對於這一點,我們可能期望過高了。次一點的情況是,程序員(或者技術方面的編寫者)可以使用一些工具從源代碼中提取出一些特定的信息,然後可以把這些信息以其他一些方式文檔化。毫無疑問,手工對這種文檔保持更新是困難的。這是另外一個支持需要更具表達力的編程語言的理由。同樣,這也是一個支持使這種輔助文檔保持最小並且盡可能在項目晚期才使之變成正式的理由。同樣,我們可以使用一些好的工具;不然的話,我們就得求助於鉛筆、紙以及黑板。
總結如下:
實際的軟體運行於計算機之中。它是存儲在某種磁介質中的0和1的序列。它不是使用C++語言(或者其他任何編程語言)編寫的程序。
程序清單是代表軟體設計的文檔。實際上把軟體設計構建出來的是編譯器和連接器。
構建實際軟體設計的廉價程度是令人難以置信的,並且它始終隨著計算機速度的加快而變得更加廉價。
設計實際軟體的昂貴程度是令人難以置信的,之所以如此,是因為軟體的復雜性是令人難以置信的,並且軟體項目的幾乎所有步驟都是設計過程的一部分。
編程是一種設計活動——好的軟體設計過程認可這一點,並且在編碼顯得有意義時,就會毫不猶豫的去編碼。
編碼要比我們所認為的更頻繁地顯現出它的意義。通常,在代碼中表現設計的過程會揭示出一些疏漏以及額外的設計需要。這發生的越早,設計就會越好。
因為軟體構建起來非常廉價,所以正規的工程驗證方法在實際的軟體開發中沒有多大用處。僅僅建造設計並測試它要比試圖去證明它更簡單、更廉價。
測試和調試是設計活動——對於軟體來說,它們就相當於其他工程學科中的設計驗證和改進過程。好的軟體設計過程認可這一點,並且不會試圖去減少這些步驟。
還有一些其他的設計活動——稱它們為高層設計、模塊設計、結構設計、構架設計或者諸如此類的東西。好的軟體設計過程認可這一點,並且慎重地包含這些步驟。
所有的設計活動都是相互影響的。好的軟體設計過程認可這一點,並且當不同的設計步驟顯示出有必要時,它會允許設計改變,有時甚至是根本上的改變,
許多不同的軟體設計符號可能是有用的——它們可以作為輔助文檔以及工具來幫助簡化設計過程。它們不是軟體設計。
軟體開發仍然還是一門工藝,而不是一個工程學科。主要是因為缺乏驗證和改善設計的關鍵過程中所需的嚴格性。
最後,軟體開發的真正進步依賴於編程技術的進步,而這又意味著編程語言的進步。C++就是這樣的一個進步。它已經取得了爆炸式的流行,因為它是一門直接支持更好的軟體設計的主流編程語言。
C++在正確的方向上邁出了一步,但是還需要更大的進步
『捌』 編譯器/解釋器能否檢查python程序中是否存在無限循環
不能,有些無限循環是故意的.
你也可以試一下
while True:
pass
『玖』 怎麼用C語言編寫cmd無限循環
第1步,先找個編譯器,用編譯器編譯你的C源文件,如果有報語法或鏈接錯,則繼續改源代碼
編譯成功後進行第2步,運行一個CMD.exe進程,即命令行窗口
第三步是切換盤符和路徑,
如程序在在D盤上,就輸入 D: (回車) 如果程序在C盤上就輸入 C:
CD \
CD PATH(程序所在目錄)
查看文件:
DIR
看到目錄下有文件則進行第4步:
鍵入C編譯生成的文件名
命令名 (回車)
『拾』 用DEV編譯器編譯後,為什麼循環報錯啊,求解答
for循環基本格式如下:for ( e1 ; e2 ; e3 ) //這里括弧中的分號,至少要有兩個,你程序問題就出在這里{}括弧中的e1,e2,e3表達式都可以不輸入(根據程序情況確定), 如:for( ; ; ) 表示一個for死循環e1是初始化,只執行一次e2是判斷結束條件,當e2為真時,循環,為假則跳出循環e3是循環變數變化區,每循環一次都會執行一次這里的操作。另:1、你的printf("%d", n );寫到了continue;之後,而且在同一個{}中,這樣,你的程序運行起來就會是什麼顯示都沒有!2、devC++不會自動暫停輸出顯示,為了看清楚屏幕輸出結果,請在return 0;之前加一個:system("pause"); //暫停一下用DEV編譯器編譯後,為什麼循環報錯啊,求解答