㈠ 编译器本身是如何进行测试的
编译器最重要的性质就是保证语义的正确。比如,从高级语言翻译到机器指令之后,指令必须正确的表达原来程序的意思。所以一般编译器测试都包含一些源程序,用来覆盖可能出现的各种情况。基本的原则是:原来程序的结果 = 编译后机器指令运行的结果。机器指令运行的结果很容易知道,运行一下就知道了。可是原来程序的结果你怎么知道呢?
为了解决这个“原来程序语义”的问题,最好是写一个解释器,准确无误的表达原来的代码的语义。所以我们的要求就是:
高级语言解释器(源程序) = 机器执行(机器代码)
由于处理器其实就是一个用来执行机器代码的解释器,这里有一个很美好的对称关系:
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版本下的文件。