導航:首頁 > 源碼編譯 > 缺陷編譯器

缺陷編譯器

發布時間:2022-03-31 05:41:17

編譯器二:LLVM和GCC的區別

GCC: GNU Compiler Collection
GCC屬於傳統編譯器,傳統編譯器的工作原理基本上都是三段式的,可以分為前端(Frontend)、優化器(Optimizer)、後端(Backend)。前端負責解析源代碼,檢查語法錯誤,並將其翻譯為抽象的語法樹(Abstract Syntax Tree)。優化器對這一中間代碼進行優化,試圖使代碼更高效。後端則負責將優化器優化後的中間代碼轉換為目標機器的代碼,這一過程後端會最大化的利用目標機器的特殊指令,以提高代碼的性能。
事實上,不光靜態語言如此,動態語言也符合上面這個模型,例如java。Java Virtual Machine也利用上面這個模型,將Java代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個前端就可以了。當需要支持多種目標機器時,只需要添加多個後端就可以了。對於中間的優化器,我們可以使用通用的中間代碼。
這種三段式的結構還有一個好處,開發前端的人只需要知道如何將源代碼轉換為優化器能夠理解的中間代碼就可以了,他不需要知道優化器的工作原理,也不需要了解目標機器的知識。這大大降低了編譯器的開發難度,使更多的開發人員可以參與進來。
雖然這種三段式的編譯器有很多有點,並且被寫到了教科書上,但是在實際中這一結構卻從來沒有被完美實現過。做的比較好的應該屬Java和.NET虛擬機。虛擬機可以將目標語言翻譯為bytecode,所以理論上講我們可以將任何語言翻譯為bytecode,然後輸入虛擬機中運行。但是這一動態語言的模型並不太適合C語言,所以硬將C語言翻譯為bytecode並實現垃圾回收機制的效率是非常低的。
GCC也將三段式做的比較好,並且實現了很多前端,支持了很多語言。但是上述這些編譯器的致命缺陷是,他們是一個完整的可執行文件,沒有給其它語言的開發者提供代碼重用的介面。即使GCC是開源的,但是源代碼重用的難度也比較大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的縮寫,定位是一個虛擬機,但是是比較底層的虛擬機。它的出現正是為了解決編譯器代碼重用的問題,LLVM一上來就站在比較高的角度,制定了LLVM IR這一中間代碼表示語言。LLVM IR充分考慮了各種應用場景,例如在IDE中調用LLVM進行實時的代碼語法檢查,對靜態語言、動態語言的編譯、優化等。
LLVM與GCC在三段式架構上並沒有本質區別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個XYZ語言的優化器,我自己實現了PassXYZ演算法,用以處理XYZ語言與其它語言差別最大的地方。而LLVM優化器提供的PassA和PassB演算法則提供了XYZ語言與其它語言共性的優化演算法。那麼我可以選擇XYZ優化器在鏈接的時候把LLVM提供的演算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。

⑵ 解釋器與編譯器的區別

編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

⑶ 編譯器和解釋器的主要區別是什麼他們相對於對方各自的優點

解釋器是解釋執行的源代碼,編譯器是將源代碼編譯成目標代碼

他們最大的區別是程序運行時需要解釋器邊解釋邊執行,而編譯器則在運行時是完全不需要的

解釋器的優點是比較容易讓用戶實現自己跨平台的代碼,比如java,php等,同一套代碼可以在幾乎所有的操作系統上執行,而無需根據操作系統做修改;
編譯器的目的就是生成目標代碼再由連接器生成可執行的機器碼,這樣的話需要根據不同的操作系統編制代碼,雖然有像Qt這樣的源代碼級跨平台的編程工具庫,但在不同的平台上仍然需要重新編譯連接成可執行文件,但其執行效率要遠遠高於解釋運行的程序。
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.
這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

⑷ 面向過程編程和面向對象編程各自的優缺點

面向對象程序設計

作者:佚名 文章來源:不詳 點擊數:11677 更新時間:2005-10-14

作者:Ramchandra Garge

軟體危機(Software Crisis)
軟體技術總是處於不斷發展變化中,新工具、新技術相繼產生。這就要求軟體產業和軟體工程師們不停的尋求軟體設計和開發的新途徑。由於日益增長的軟體系統的復雜性和軟體產業內部愈演愈烈的競爭,這種要求變得更加緊迫。為了克服這種要求帶來的軟體危機,必須解決以下問題:
1、在系統設計中,如何表現問題的真實實體?
2、如何以開放的界面(interface)設計系統?
3、如何保證模塊(mole)的可重用性(reusability)和可擴展性(extensibility)?
4、如何開發能夠容忍(tolerant)未來可能的變化模塊?
5、如何提高軟體的生產力和減少軟體開銷?
6、如何管理進度表?
7、如何提高軟體質量?
8、如何將軟體開發過程工業化?
當軟體產品在未完成時、未被使用時或者帶著各種各樣的錯誤發布時,問題就會出現。另外,用戶需求的改變已經成為一個重要問題。多份關於軟體實現的報告顯示,在軟體產品發布和使用之前,需要仔細進行質量評估。通常狀態評估中應該考慮的質量因素包括:
1、正確性(Correctness)
2、可維護性(Maintainability)
3、可重用性(Reusability)
4、開放性(Openness)和可解釋性(Interpretability)
5、可移植性(Portability)
6、安全性(Security)
7、完整性(Integrity)
8、用戶友好性(User friendliness)

軟體演化(Software Evolution)
Ernest Tello——人工智慧領域的著名作家——將軟體技術的演化比喻為樹的生長。和樹一樣,軟體的演化具有明顯的階段性,這些階段稱為層(layer)。過去四十年中,這些層逐步被建立起來,每一個層都由前一個層發展而成。圖1顯示了這個過程。但是關於樹的比喻在遇到層的生命期的問題時失敗了。在軟體系統中,每個層都在持續的發揮作用,而在樹中,只有最上層的層才有用。
面向對象程序設計(OOP)是完成程序設計工作的新方法。自從計算機發明以來,為了適應程序復雜性的不斷增長,程序設計的方法有了戲劇性的變化。匯編語言被發明出來以後,程序員們總算可以用符號表示那些機器指令,從而可以編寫更長、更復雜的程序。當程序規模繼續不停增長的時候,高級語言被引入,為程序員們提供了更多工具對付日益增加的復雜性。第一個被普遍使用的語言是FORTRAN。不過雖然FORTRAN邁出了重大的第一步,但用它寫出的代碼很難說是清晰的和容易理解的。

1960年結構化程序設計思想誕生。C和Pascal等語言都大力提倡這種程序設計的方法。結構化程序設計語言使得編寫較復雜的程序變得容易。但是,一旦某個項目達到一定規模,即使使用結構化程序設計的方法,局勢仍將變得不可控制。
在程序設計方法發展過程中,每一次重大突破都使得程序員可以應對更大的復雜性。在這條道路上邁出的每一步中,新的方法都運用和發展了以前的方法中最好的理念。今天,許多項目的規模又進一步發展。為了解決這個問題,面向對象程序設計方法應運而生。
在詳細介紹面向對象程序設計之前,讓我們簡單了解一下面向過程程序設計的方法。在面向過程的程序設計方法中,問題被看作一系列將被完成的任務,如讀、計算和列印。許多函數用於完成這些任務。問題的焦點集中於函數。圖2顯示了一個典型的面向過程的程序結構。分層分解的技術被用來確定一系列需要被完成的任務,以解決特定的問題。

面向過程程序設計的基本任務是編寫計算機執行的指令序列,並把這些指令以函數的方式組織起來。通常我們使用流程圖組織這些行為(action),並描述從一個行為到另一個行為的控制流。
當我們集中精力開發函數的時候,很少會去注意那些被多個函數使用的數據(data)。在這些數據身上發生了什麼事情?那些使用這些數據的函數又對它們產生了什麼影響?
在多函數(multi-function)程序中,許多重要的數據被放置在全局數據區,這樣它們可以被所有的函數訪問。每個函數都可以具有它們自己的局部數據。圖3顯示了一個面向過程程序中函數和數據的關系。

面向對象程序設計模式
發明面向對象程序設計方法的主要出發點是彌補面向過程程序設計方法中的一些缺點。OOP把數據看作程序開發中的基本元素,並且不允許它們在系統中自由流動。它將數據和操作這些數據的函數緊密的連結在一起,並保護數據不會被外界的函數意外的改變。OOP允許我們將問題分解為一系列實體——這些實體被稱為對象(object),然後圍繞這些實體建立數據和函數。面向對象程序設計中的數據和函數的組織結構如圖4所示。

一個對象的數據不能訪問其它對象的函數,而一個對象的函數可以訪問其它對象的函數。
面向對象程序設計的一些顯著的特性包括:
·程序設計的重點在於數據而不是過程;
·程序被劃分為所謂的對象;
·數據結構為表現對象的特性而設計;
·函數作為對某個對象數據的操作,與數據結構緊密的結合在一起;
·數據被隱藏起來,不能為外部函數訪問;
·對象之間可以通過函數溝通;
·新的數據和函數可以在需要的時候輕而易舉的添加進來;
·在程序設計過程中遵循由下至上(bottom-up)的設計方法。
面向對象程序設計在程序設計模式中是一個新的概念,對於不同的人可能意味著不同的內容。因此在我們繼續下面的內容之前,最好給面向對象程序設計下一個定義。我們對面向對象程序設計的定義是「面向對象程序設計是一種方法,這種方法為數據和函數提供共同的獨立內存空間,這些數據和函數可以作為模板以便在需要時創建類似模塊的拷貝。這樣的程序設計方法稱為面向對象程序設計。」
從以上定義可以看到,一個對象被認為是計算機內存中的一個獨立區間,在這個區間中保存著數據和能夠訪問數據的一組操作。因為內存區間是相互獨立的,所以對象可以不經修改就應用於多個不同的程序中。

什麼是面向對象程序設計?
面向對象程序設計(OOP)技術汲取了結構化程序設計中好的思想,並將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工作提供了一種全新的方法。通常,在面向對象的程序設計風格中,你會將一個問題分解為一些相互關聯的子集,每個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分為不同等級,而一個對象就是已定義的某個類型的變數。當你定義了一個對象,你就隱含的創建了一個新的數據類型。

面向對象程序設計中的基本概念
「面向對象」作為一個術語,在不同的人群中有著不同的解釋。因此,了解一些在面向對象程序設計中廣泛應用的概念是必須的。本節我們討論以下這些內容:
1、對象(Object)
2、類(Class)
3、數據抽象(Data abstraction)
4、繼承(Inheritance)
5、動態綁定(Dynamic binding)
6、數據封裝(Data encapsulation)
7、多態性(Polymorphism)
8、消息傳遞(Message passing)

對象
在一個面向對象的系統中,對象是運行期的基本實體。它可以用來表示一個人或者說一個銀行帳戶,一張數據表格,或者其它什麼需要被程序處理的東西。它也可以用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析一般以對象及對象間的自然聯系為依據。如前所述,對象在內存中佔有一定空間,並且具有一個與之關聯的地址,就像Pascal中的record和C中的結構一樣。
當一個程序運行時,對象之間通過互發消息來相互作用。例如,程序中包含一個「customer」對象和一個「account」對象,而customer對象可能會向account對象發送一個消息,查詢其銀行帳目。每個對象都包含數據以及操作這些數據的代碼。即使不了解彼此的數據和代碼的細節,對象之間依然可以相互作用,所要了解的只是對象能夠接受的消息的類型,以及對象返回的響應的類型,雖然不同的人會以不同的方法實現它們。


我們剛才提到,對象包含數據以及操作這些數據的代碼。一個對象所包含的所有數據和代碼可以通過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(class type)的變數。一旦定義了一個類,我們就可以創建這個類的多個對象,每個對象與一組數據相關,而這組數據的類型在類中定義。因此,一個類就是具有相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行為相同。比如創建一個類對象的語法和創建一個整數對象的語法一模一樣。如果fruit被定義為一個類,那麼語句
fruit mango;
就創建了一個fruit類的對象mango。

數據抽象和封裝
把數據和函數包裝在一個單獨的單元(稱為類)的行為稱為封裝。數據封裝是類的最典型特點。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的介面。避免數據被程序直接訪問的概念被稱為「數據隱藏」。
抽象指僅表現核心的特性而不描述背景細節的行為。類使用了抽象的概念,並且被定義為一系列抽象的屬性如尺寸、重量和價格,以及操作這些屬性的函數。類封裝了將要被創建的對象的所有核心屬性。因為類使用了數據抽象的概念,所以它們被稱為抽象數據類型(ADT)。

封裝
封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創建對象。簡單的說,一個對象就是一個封裝了數據和操作這些數據的代碼的邏輯實體。
在一個對象內部,某些代碼和(或)某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。

繼承
繼承是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬於飛鳥類,也屬於鳥類。就像圖5中描繪的那樣,這種分類的原則是,每一個子類都具有父類的公共特性。

在OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,我們可以向一個已經存在的類中添加新的特性,而不必改變這個類。這可以通過從這個已存在的類派生一個新類來實現。這個新的類將具有原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在於它允許程序員利用已經存在的類(接近需要,而不是完全符合需要的類),並且可以以某種方式修改這個類,而不會影響其它的東西。
注意,每個子類只定義那些這個類所特有的特性。而如果沒有按級分類,每類都必須顯式的定義它所有的特性。

多態
多態是OOP的另一個重要概念。多態的意思是事物具有不同形式的能力。舉個例子,對於不同的實例,某個操作可能會有不同的行為。這個行為依賴於所要操作數據的類型。比如說加法操作,如果操作的數據是數,它對兩個數求和。如果操作的數據是字元串,則它將連接兩個字元串。
圖6演示了一個函數處理不同數量、不同類型的參數。就像某個單詞在不同的上下文中具有不同的含義。

多態機制使具有不同內部結構的對象可以共享相同的外部介面。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。多態在實現繼承的過程中被廣泛應用。
面向對象程序設計語言支持多態,術語稱之為「one interface multiple method(一個介面,多個實現)」。簡單來說,多態機制允許通過相同的介面引發一組相關但不相同的動作,通過這種方式,可以減少代碼的復雜度。在某個特定的情況下應該作出怎樣的動作,這由編譯器決定,而不需要程序員手工干預。
在多函數程序中,許多重要的數據被聲明為全局變數,這樣它們才可以被所有的函數訪問。每個函數又可以具有它自己的局部變數。全局變數很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每個函數都使用了哪些變數。如果我們需要修改某個外部數據的結構,我們就要修改所有訪問這個數據的函數。這很容易導致bug的產生。
在結構化程序設計中,另一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是因為函數都是面向過程的,而不是真正的對應於問題中的各個元素。
面向過程的程序設計的一些特點如下:
·強調做(演算法);
·大程序被分隔為許多小程序,這些小程序稱為函數;
·大多數函數共享全局數據;
·數據開放的由一個函數流向另一個函數。函數把數據從一種形式轉換為另一種形式。
採用由上至下的程序設計方法。

動態綁定
綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期才可知。它與多態和繼承的聯系極為緊密。一個多態引用的函數調用決定於這個引用的動態類型。
考慮圖6中的「draw」方法。通過繼承,每個對象都具備了這個過程。但是,對於不同的對象它的演算法是不同的,因此,draw過程必須在每一個類中重新定義。在運行期,當前引用對象所對應的代碼將被調用。

消息傳遞
一個面向對象的程序由許多對象組成,這些對象之間需要相互溝通。因此,在面向對象程序設計語言中,程序設計的主要步驟如下:
1、創建類,這些類定義了對象及其行為;
2、由類定義創建對象;
3、建立對象之間的通訊。
對象之間通過收發信息相互溝通,這一點類似於人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易於和建立系統交流。
對於某個特定對象來說,消息就是請求執行某個過程,因此,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,需要調用的函數的名字,以及必要的信息。
對象就有一個生命周期。它們可以被創建和銷毀。只要對象正處於其生存期,就可以與其進行通訊。

OOP的優點
OOP具有許多優點,無論是對於程序設計者或者用戶來說都是如此。面向對象為軟體產品擴展和質量保證中的許多問題提供了解決辦法。這項技術能夠大大提高程序員的生產力,並可提高軟體的質量以及降低其維護費用。其主要的優點陳列於下:
1、通過繼承,我們可以大幅減少多餘的代碼,並擴展現有代碼的用途;
2、我們可以在標準的模塊上(這里所謂的「標准」指程序員之間彼此達成的協議)構建我們的程序,而不必一切從頭開始。這可以減少軟體開發時間並提高生產效率;
3、數據隱藏的概念幫助程序員們保護程序免受外部代碼的侵襲;
4、允許一個對象的多個實例同時存在,而且彼此之間不會相互干擾;
5、允許將問題空間中的對象直接映射到程序中;
6、基於對象的工程可以很容易的分割為獨立的部分;
7、以數據為中心的設計方法允許我們抓住可實現模型的更多細節;
8、面向對象的系統很容易從小到大逐步升級;
9、對象間通訊所使用的消息傳遞技術與外部系統介面部分的描述更簡單;
10、更便於控制軟體復雜度。
當需要將以上所說的所有特性有機的結合於一個面向對象系統中,它們之間的相對重要性就取決於工程的類型和程序員的喜好。為了獲得上述的某些優勢,必須考慮很多事情。例如,對象庫必須可以被重用。技術還在不停的發展,現有的產品也會很快的更新換代。如果重用沒有能夠實現,那麼就需要進行嚴格的控制和管理。
易於使用的開發軟體往往難以編寫。面向對象程序設計工具有望解決這個問題。

面向對象程序設計語言
面向對象技術並不是某個特定語言的特權。如同結構化程序設計一樣,OOP概念可以在很多語言比如C和Pascal中實現。但是,當程序越來越大時,程序設計工作會變得拙劣而混亂。而一個支持OOP概念的程序設計語言則可以讓一切變得簡單。
一個語言必須支持幾個主要的OOP概念才能稱其是面向對象的。根據所支持的OOP特性,語言可以分為以下兩類:
1、基於對象的程序設計語言;
2、面向對象的程序設計語言。
基於對象的程序設計語言僅支持封裝和對象辨識。
一個面向對象的程序設計語言所要支持的重要特性如下:
·數據封裝
·數據隱藏和訪問機制
·對象的自動初始化和清除
·操作符重載
支持對象風格程序設計的語言稱為基於對象的程序設計語言。它們不支持繼承和動態綁定。
Ada就是一個典型的基於對象的程序設計語言。
面向對象的程序設計不僅僅包含基於對象程序設計的特性,還支持繼承和動態綁定。
OOP的應用
OOP最有前途的應用領域如下:
1、實時系統;
2、模擬和建模;
3、面相對象資料庫;
4、超文本、超媒體和擴展文本;
5、AI和專家系統;
6、神經網路和並行程序設計;
7、決策支持和辦公自動化系統;
8、CIM/CAM/CAD系統。

⑸ C++,缺點

我認為,沒有缺點,只有區別:
1.說到難起步,LISP等語言會更難起步,汽車比摩托車難起步難道汽車就比自行車差么,應用領域不同,難度就沒有可比性。
2.雖然指針操作麻煩危險,但是它高效,簡潔,沒有聽說哪個熟練使用C++的程序員會說指針操作麻煩危險,不應該把對語言的理解程度不同而造成的問題說成語言自身的問題。同樣,對於JAVA新手來說,JAVA的對象引用(其實就是指針)的難度往往是致命的而不是出個語法錯誤那麼簡單了。
3.JAVA脫離完整的官方架構和庫支持,想寫一個網頁插件不比C++容易多少,而C++如果有好的庫(這方面的庫很多),寫個網頁插件會更容易。這點是把語言和整個開發環境2個概念弄混淆了。BASIC通過VB的詮釋,其能力不是QBASIC能體現的。
3.JAVA依賴虛擬機實現的跨平台的確C++是沒辦法比的,但是由於這個關系JAVA只有C++ 1/50的運行速度也是沒辦法改變的。
4.C++支持OO,PO,甚至即將到來的AO,只能是其語言強大的表現,何來缺點之有?不是所有編程OO都實用的,有個話說的好:存在即真理。

言語刻薄,呵呵,PP

------------------------------------------------------
樓上1。說到OO不徹底,我的意見是這樣應該是更好的,OO作為一個程序設計理念,它不是萬能的,在某些應用場合,比如單片機,作為一個純面向對象的語言,類的概念只會給程序編寫帶來束縛,原因還是那樣,綁在一棵樹上,就是等死。靈活運用OO不是說應該把思想禁錮在OO中,"遇事皆OO",那是90年代學術上的迂腐思想了,實際應用,只要靈活,有效,我們就應該說它是能較好解決問題的,而不應該過分強調沒有使用某種設計理念,這點上,我不認為OO是OP的進化,他們是平行的才對。說道main,難道JAVA想運行起來就不需要main了么?

樓上2:這點的確C/C++是沒有辦法避免的,我自己也是很頭痛的(總是要在三個系統中處理這些無聊問題),但是,還是那樣的,事物總有2面性,解決了移植帶來了速度問題,雖然SUN一再強調VM可以做到編譯級速度,而且我們自己實現的VM也已經達到了客戶的即時響應標准,但是,在速度上的犧牲這個不管怎麼掩蓋也是一個弊端,可能隨著硬體的進步,這個弊端越來越不明顯了吧。事情總是向好的地方發展。

樓上3。指針,總是所有人極力想避諱的話題,其實你想想,雖然JAVA有效的避免了越界,野指,假如我的越界和野指是我自己的需求該怎麼辦,犧牲了靈活性,事物的2面性再次體現。

樓上4說道GC,呵呵不知道有沒想過,這個才是JAVA真正的郁悶,事實上,你不知道你的對象什麼時候被確定銷毀了,雖然這個在小應用程序中可能不需要在意,但是在稀缺資源設備上,這個是致命的,以至於很多好的特性不能使用,被迫回到原始時代呵呵,雖然C++會難免造成遺忘釋放,但是,我知道我釋放了這個對象,那麼它就真的釋放了,我對它的所有引用都不再有效了,而JAVA卻是不一定的,在多線程交互的程序中尤為明顯。還是2面性的問題呵呵。

樓上5我維持我自己觀點,還是混淆了語言和平台,其實你那樣比較跟拿BASIC和VB比較沒什麼2樣,同樣,你是拿帶JDK的JAVA和沒有帶任何庫的C++來比較,我只能說,利用成型的庫,使用C++來構建不會比JAVA難的,如果你不import,自己利用自己寫的代碼來構建。。。

我這么說不是說C++就是完美的,也不是批判JAVA的憤青,只是,在編程語言中,我們不能隨便的比較某2個語言,語言是依賴環境而存在的,單一的語言,都是沒有什麼價值的,事物的2面性,讓很多說這個語言好,那個語言差的言論是沒有根據的,所以我想,區別比缺點更能說明一些問題.

⑹ C語言編程時的功能缺陷的解決

先刷新一下緩沖區,然後再getch();需要的頭文件是#include <conio.h>,出現這種情況跟編譯器有關,添加代碼注釋中給出:

#include<stdio.h>
#include<conio.h>/////////////////////////////
intmain()
{
intday;
printf("Whatdayisittoday? ");
scanf("%d",&day);
fflush(stdin);///////////////////////////////
switch(day)
{
case1:
case2:
case3:
case4:
case5:
printf("Today,youmustgotoschool. ");
break;
case6:
printf("Haveagoodrest!!!ButDon'tforgettodoyourhomework. ");
break;
case7:
printf("Didyoufinishyourhomework?Tomorrowyouhavetogotoschool.checkitandyoucanalsoplay. ");
break;
default:
printf("Don'tdothis.youknowaweekhavesevendays,no%d.",day);
break;

}
getch();/////////////////////////////////////////
return0;
}

⑺ 軟體缺陷的產生原因

在軟體開發的過程中,軟體缺陷的產生是不可避免的。那麼造成軟體缺陷的主要原因有哪些?從軟體本身、團隊工作和技術問題等角度分析,就可以了解造成軟體缺陷的主要因素。
軟體缺陷的產生主要是由軟體產品的特點和開發過程決定的。
1.需求不清晰,導致設計目標偏離客戶的需求,從而引起功能或產品特徵上的缺陷。
2.系統結構非常復雜,而又無法設計成一個很好的層次結構或組件結構,結果導致意想不到的問題或系統維護、擴充上的困難;即使設計成良好的面向對象的系統,由於對象、類太多,很難完成對各種對象、類相互作用的組合測試,而隱藏著一些參數傳遞、方法調用、對象狀態變化等方面問題。
3.對程序邏輯路徑或數據范圍的邊界考慮不夠周全,漏掉某些邊界條件,造成容量或邊界錯誤。
4.對一些實時應用,要進行精心設計和技術處理,保證精確的時間同步,否則容易引起時間上不協調,不一致性帶來的問題。
5.沒有考慮系統崩潰後的自我恢復或數據的異地備份、災難性恢復等問題,從而存在系統安全性、可靠性的隱患。
6.系統運行環境的復雜,不僅用戶使用的計算機環境千變萬化,包括用戶的各種操作方式或各種不同的輸入數據,容易引起一些特定用戶環境下的問題;在系統實際應用中,數據量很大。從而會引起強度或負載問題。
7.由於通信埠多、存取和加密手段的矛盾性等,會造成系統的安全性或適用性等問題。
8.新技術的採用,可能涉及技術或系統兼容的問題,事先沒有考慮到。
1.系統需求分析時對客戶的需求理解不清楚,或者和用戶的溝通存在一些困難。
2.不同階段的開發人員相互理解不一致。例如,軟體設計人員對需求分析的理解有偏差,編程人員對系統設計規格說明書某些內容重視不夠,或存在誤解。
3.對於設計或編程上的一些假定或依賴性,相關人員沒有充分溝通。
4.項目組成員技術水平參差不齊,新員工較多,或培訓不夠等原因也容易引起問題。
1.演算法錯誤:在給定條件下沒能給出正確或准確的結果。
2.語法錯誤:對於編譯性語言程序,編譯器可以發現這類問題;但對於解釋性語言程序,只能在測試運行時發現。
3.計算和精度問題:計算的結果沒有滿足所需要的精度。
4.系統結構不合理、演算法選擇不科學,造成系統性能低下。
5.介面參數傳遞不匹配,導致模塊集成出現問題。
1.缺乏質量文化,不重視質量計劃,對質量、資源、任務、成本等的平衡性把握不好,容易擠掉需求分析、評審、測試、等時間,遺留的缺陷會比較多。
2.系統分析時對客戶的需求不是十分清楚,或者和用戶的溝通存在一些困難。
3.開發周期短,需求分析、設計、編程、測試等各項工作不能完全按照定義好的流程來進行,工作不夠充分,結果也就不完整、不準確,錯誤較多;周期短,還給各類開發人員造成太大的壓力,引起一些人為的錯誤。
4.開發流程不夠完善,存在太多的隨機性和缺乏嚴謹的內審或評審機制,容易產生問題。
5.文檔不完善,風險估計不足等。

⑻ 誰知道c語言各個編譯器優缺點越詳細越好

編譯器種類很多,最主流的還是turbo和VC,主流的東西可參考資料多,建議用這兩個。但VC好用些,圖形環境。

⑼ 如何解決嵌入式軟體的缺陷

嵌入式軟體中,ARM架構下的編譯器會頻繁的使用堆棧,堆棧用於存儲函數的返回值、AAPCS規定的必須保護的寄存器以及局部變數,包括局部數組、結構體、聯合體和C++的類。從堆棧中分配的局部變數的初值是不確定的,因此需要運行時顯式初始化該變數。一旦離開局部變數的作用域,這個變數立即被釋放,其它代碼也就可以使用它,因此堆棧中的一個內存位置可能對應整個程序的多個變數。
局部變數必須顯式初始化,除非你確定知道你要做什麼。下面的代碼得到的溫度值跟預期會有很大差別,因為在使用局部變數sum時,並不能保證它的初值為0。編譯器會在第一次運行時清零堆棧區域,這加重了此類Bug的隱蔽性。

⑽ Intel C++ Compiler與gcc對比有什麼優缺點

icc 是Intel公司專門為Wintel平台設計,有針對性的做了優化,缺陷也很顯然,既然有針對性,也就不具備通用性。使用icc編譯,可能會使編譯出來的程序有更好的執行效率,但也可能使其在非Intel CPU上運行異常。並且,在某些情況下,即使在Wintel平台上也會崩潰。
gcc的優勢在於其通用性,目前主流的所有平台,它基本上都支持。使用-O3優化編譯後的執行效率,也不錯。
在Win平台上,編譯後執行效率最好的,依然是微軟的vs,這可能與win系統是他們家出的有關。
使用icc帶來的優勢,並不突出,還是建議不要用了。
如果限定在win平台上開發,使用vc或gcc更合適一些。我個人推薦gcc,vc的ide環境過於龐大,不太喜歡,但win平台上主流的c開發工具還是vc,有不少開源的工程都使用它,如果你用到了這些開源代碼,就不得不用了。

閱讀全文

與缺陷編譯器相關的資料

熱點內容
jar線上編譯 瀏覽:111
程序員論壇代碼被懟 瀏覽:992
win7文件夾選項注冊表 瀏覽:778
中央編譯局常艷博士照片 瀏覽:304
濡沫江湖安卓怎麼下載 瀏覽:952
陝西省電信dns伺服器雲伺服器 瀏覽:826
美輯編譯多長時間潤色好 瀏覽:466
伺服器心跳地址是什麼 瀏覽:981
編譯原理與區別 瀏覽:978
安利微購app怎麼樣 瀏覽:931
ios程序員適合什麼鍵盤 瀏覽:722
如何把加密pdf轉換成excel 瀏覽:621
文件夾7z如何壓縮成rar 瀏覽:870
android藍牙低功耗 瀏覽:277
如何下載好大夫app 瀏覽:966
linux查看txt 瀏覽:155
linux硬碟格式化命令 瀏覽:520
神舞幻想存檔放哪個文件夾 瀏覽:652
怎樣把pdf轉為圖片 瀏覽:338
51單片機指令jz 瀏覽:93