问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

编译器本身是如何进行测试的?2

发布网友 发布时间:2023-10-11 11:34

我来回答

2个回答

热心网友 时间:2024-12-01 09:12

编译器最重要的性质就是保证语义的正确。比如,从高级语言翻译到机器指令之后,指令必须正确的表达原来程序的意思。所以一般编译器测试都包含一些源程序,用来覆盖可能出现的各种情况。基本的原则是:原来程序的结果 = 编译后机器指令运行的结果。机器指令运行的结果很容易知道,运行一下就知道了。可是原来程序的结果你怎么知道呢?
为了解决这个“原来程序语义”的问题,最好是写一个解释器,准确无误的表达原来的代码的语义。所以我们的要求就是:
高级语言解释器(源程序) = 机器执行(机器代码)
由于处理器其实就是一个用来执行机器代码的解释器,这里有一个很美好的对称关系:
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 的正确性了。
这些是基本的语义测试原理。另外除了语义,可能还有一些“表面”一些的测试,它们看代码本身,而不只看它的语义。比如尾递归优化的测试应该确保输出程序的尾递归得到正确的处理,等等。这些是语义测试检查不到的,因为尾递归没有正确处理的程序大部分也能输出正确的结果。
普通的单元测试方法也可以用来测试一些编译器里的辅助函数,但那些不是编译器特有的,所以就不讲了。
另外,就像所有测试的局限性一样,你没法枚举所有可能出现的输入,所以以上的测试方法其实也不能保证编译器的完全正确。

热心网友 时间:2024-12-01 09:12

编辑完一段代码后编译器会自动生成运行程序,通过程序的运行来测试代码是否正常。
编译器:将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...爱你你是我的罗密欧 , 我愿意变成你的朱丽叶' 谁知 有句歌词是“我爱你你是我的朱丽叶,我愿意变成你的梁山伯”是哪... 为什么打印出来的文档页码和原来的不一样 ...两台电脑用路由器上网一台是W7一台是XP如何实现两台电脑共享文件 win7怎么联另一台电脑win7怎么让网络和另一台电脑共享 w7的系统怎么共享电脑w7系统里面文件怎么共享另一台电脑 共享win7电脑w7系统里面文件怎么共享另一台电脑 翡翠有收藏价值吗,我们玩家如何去投资 价格一两万元的翡翠如何挑选 ppt怎么转换成视频?简单四步法,轻松搞定ppt微课录制 华生灶具怎样18 我想问下java sdk 是干嘛的? 编译和运行java程序... 他吗的,我的Mac被Safari提示中毒了...怎么办?? i34160相当于amd的那个系列,我要参数3 《爸爸去哪儿》播出9年,3对夫妻已离婚,其他几对现在过得怎么样?_百度... Intel Core i3-4160和AMD A6-6400...5 中华传统文化核心层包括哪几家学派的思想?13 如何编译 MTK 的模拟器2 i34160好还是配amd的cpu? 中国传统文化以什么主体为传统文化1 英特尔i3跟amd速龙ll x4 640四核比一比这两个CP...6 新车才1 万公里,四个轮胎上都有一样的均匀小裂纹正常吗? i34170和速龙x4 640 哪个好1 2018年东风本田crv什么时候出新款50 都说怀孕六个月梦见蛇都会生女儿是真的吗37 奔驰GLK快过保修期了,需要延长保修期么 宝骏510,开了一万公里,车前胎都已经有很明显的裂纹了,有什么影响么,需 ... 富士XS10选择了连续自动对焦,半按快门时对焦点固定在一个点上,不会自 ... 1N=多少kg713 利用全微分计算(1.97)^1.05的近似值(取In2=0....50 华生抽油烟机怎么样28 电影《青春派》中李飞的一句话:花样的年华不让我们赏花。是什么...6 都说怀孕六个月梦见蛇都会生女儿是真的吗37 你好 OPPOR9手机清理手机时不小心把缓存的视频全部删了 ... 西安市南院门市委家属院邮编 mcgs做调试界面? 如果论文中多处引用同一本书的内容该如何标注参考文献?642 求一本重生小说,主角重生到越南战场上带领独立团的1 大学导函数应用中有求sin29度的近似值 有哪位高手知道怎么...8 高数上,求第9题的详细过程,谢谢啦 高数导数求sin 30°30'的近似值?3 高数上,求这道题的详细过程,谢谢啦 谁能用最通俗的语言帮我解释一下最高额抵押权的概念?93 高数导数求sin 30°30'的近似值? 30‘叫什么?怎么... sin29tan46用全微分求近似值怎么做45 湖南黄焖黑山羊的做法1 成人高考报哪些学校2 成人高考可以报考哪些院校?102 动画教育机构当中有人听说过ACG-CCTV这个词吗?听说是央...7 绿碳化硅微粉的用途?