㈠ 編譯器本身是如何進行測試的
編譯器最重要的性質就是保證語義的正確。比如,從高級語言翻譯到機器指令之後,指令必須正確的表達原來程序的意思。所以一般編譯器測試都包含一些源程序,用來覆蓋可能出現的各種情況。基本的原則是:原來程序的結果 = 編譯後機器指令運行的結果。機器指令運行的結果很容易知道,運行一下就知道了。可是原來程序的結果你怎麼知道呢?
為了解決這個「原來程序語義」的問題,最好是寫一個解釋器,准確無誤的表達原來的代碼的語義。所以我們的要求就是:
高級語言解釋器(源程序) = 機器執行(機器代碼)
由於處理器其實就是一個用來執行機器代碼的解釋器,這里有一個很美好的對稱關系:
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 的正確性了。
這些是基本的語義測試原理。另外除了語義,可能還有一些「表面」一些的測試,它們看代碼本身,而不只看它的語義。比如尾遞歸優化的測試應該確保輸出程序的尾遞歸得到正確的處理,等等。這些是語義測試檢查不到的,因為尾遞歸沒有正確處理的程序大部分也能輸出正確的結果。
普通的單元測試方法也可以用來測試一些編譯器里的輔助函數,但那些不是編譯器特有的,所以就不講了。
另外,就像所有測試的局限性一樣,你沒法枚舉所有可能出現的輸入,所以以上的測試方法其實也不能保證編譯器的完全正確。
㈡ 編譯器的測試
我告訴你,內容太多。我加你 慢慢回答!
㈢ C語言中編譯 生成 調試 測試 運行各是什麼意思有什麼區別
C語言中編譯 生成 調試 測試 運行的區別如下:
區別一:
從編譯方面來看:
編譯依賴於編譯器,英文是compile, vc中這一過程是將源代碼轉換成目標文件,如:obj文件,rc文件等。
區別二:
從生成方面來看:
生成指的是連接的過程,英文是build,依賴於鏈接器。vc中在這一階段將所有的目標文件和所有需要用到的組件組合成一個整體,例如需要生成的是windows系統下的PE可執行文件,鏈接器會依照特定格式將目標文件組合,最後生成PE格式的,exe或dll文件。
區別三:
從調試方面來看:
調試是所有或部分代碼編寫完成後,讓程序在調試器中運行,用這種手段對程序進行分析,找出並修正潛在問題。
區別四:
從運行方面來看:
運行就是讓程序在系統中運行。
C語言的介紹:
C語言是目前流行的通用程序設計語言,是計算機專業人員和計算機愛好者開發軟體的首選開發工具。C語言源程序必須經過某種編譯工具翻譯成為目標機器語言程序才能夠在計算機上執行。
然而隨著程序編寫規模的擴大,順利編寫出正確的程序絕非一件容易的事情,早期的許多編譯工具僅僅提供翻譯功能,已滿足不了應用的要求,編程人員需要-種功能全面並高度集成的編譯環境。
程序是一段具有一定功能的代碼,編寫程序的目的是解決問題。當程序人員寫完程序後,其實並不起作用,只有當編寫的程序經過一系列的處理後,能夠解決問題時。
序才成為真正的程序,這一系列的處理過程,-般就是編輯、編譯、連接、調試與運行等。目前最成熟的C語言集成環境主要有Turbo C2.0和Turbo C 3.0( 簡稱TC30)或Borland C++3.1( 簡稱BC31)以及Visual C++ 6.0。
㈣ 怎麼測試Microsoft Visual Studio寫的C程序
你可以按照以下步驟在vc++6.0中進行編譯調試
1、打開vc++6.0編譯器,選擇「File」->「New」菜單,新建一個Project。
2、在「New」對話框中選擇「Projects」,並在其中選擇「Win32ConsoleApplication」(一個Win32控制台程序),然後在「Projectname」中輸入你要給控制台程序取的名字,在「Location」中選擇控制台程序要保存的位置,默認文章是vc++6.0安裝目錄下的「MyProjects」文件夾中。最後選「OK」按鈕進入下一步。
3、單擊「OK」後,出現一個選擇對話框,選擇你要創建的控制台程序類型,選擇「Asimpleapplication」即可,然後單擊「Finish」按鈕。這樣,一個簡單控制台程序就建立好了。
4、如下圖所示:單擊右邊「WOrkSpace」中的Globals,會看見main()函數,雙擊main()函數右邊就可以出現程序編輯區,然後在裡面編輯你自己的代碼。編輯完代碼後,選擇「Build」—>「BulidTestC.exe」進行編譯連接,生成可執行程序。然後選擇「ExecuteTestC.exe」執行就可以看到結果。或者按照圖中標示的進行操作也可以的。
如果還不懂的話,建議你看一看visualc++編程的書籍,祝你好運!
㈤ 用VS2005怎麼測試純C++編寫的程序
vs編譯c++程序還是很好的,至少比什麼破vc 6++好多了,樓主不要說只有vs,vs也是c++編譯器,不過不是專門只能用c++而已
測試?找到c++,估計你一般寫的是控制台程序,創建win32控制台程序吧,建立空項目,然後在解決資源管理器里有個資源文件夾,右鍵添加,把你的代碼文件加進來就可以了
㈥ linux平台下,想測試各種c編譯器編譯出來的程序的質量,哪位高手能提供一個比較公平的小程序源碼
hello world!
㈦ 如何測試編譯器支持openmp
現在的集成開發環境很好的支持了市面上的多數多核CPU,比如在intel雙核CPU的系統上安裝好vs2008後,
第一,在項目屬性-c++-語言中選擇支持openmp
第二,在環境變數中加入OMP_NUM_THREADS變數賦值2
可以了,打開vs2008,新建一個console程序。
敲入下面的例子,相信我們都能看懂的:
[cpp] view plain
/************************************************************************/
/* 利用Monte Carlo演算法求圓周率pi */
/************************************************************************/
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <ctime>
#include <omp.h>
㈧ c語言編程怎麼測試程序的對錯
編譯器會根據C語言的規則來判斷你是否有語法錯誤,但是不能判斷語意錯誤,即設計錯誤。
㈨ 在VS2010的VC++中如何編譯、鏈接、運行、調試程序
在vc2010中看不到像VC6.0顯式的編譯、連接按鈕了。只有工具欄(啟動調試)和菜單欄(測試)
這些功能包含編譯、鏈接、運行(調試)所有步驟,都一鍵完成。
實際上這些功能是編譯器使用以下工具實現的:
編譯器CL.EXE,將.c/.cpp源代碼編譯成目標代碼.obj,
連接器LINK.EXE,將目標代碼和庫連接生成最終文件;
資源編譯器RC.EXE(.rc)將資源編譯,最終通過連接器存入最終文件.
注意編譯准備:VCVARS32.bat拷貝到當前的workspace下在cmd下執行之後就可以
直接使用這些編譯工具在cmd下編譯.
-----------------------------------------------------------
例子:記事本編輯hello.c,在按照上面要求拷貝到當前目錄下,打開cmd
CL.EXE /c hello.c只編譯不連接
LINK.EXE hello.obj 用到的庫文件,生成可執行文件.如:
LINK.EXE hello.obj user32.lib
RC.EXE Hello.rc
-----------------------------------------
CL.EXE,LINK.EXE,vcvars32.bat所在目錄:假定VS2010使用默認安裝路徑
C:Program FilesMicrosoft Visual Studio 10.0VCin
rc.exe所在路徑:
C:Program FilesMicrosoft SDKsWindowsv7.1ABin
注意:
(1)這些EXE文件在vs2010下可能存在多個不同路徑,但都是一樣的,可以通用
(2)如果電腦上安裝了不同的VS版本,這些文件會不同,注意區分。使用同一VS版本下的文件。