本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
《深入理解计算机系统》官网:csapp.cs.cmu.edu/3e/labs.htm…
该篇文章是
实验一Data Lab的Writeup(datalab.pdf)机翻
原文:csapp.cs.cmu.edu/3e/datalab.…
在官网点击下方即可下载实验一的文件
1 介绍
此实验的目的是为了更熟悉整数和浮点数的位级表示。你可以通过解决一系列编程“难题”来做到这一点这些谜题中有很多都是人为的,但你会发现自己在解决它们的过程中会更多地考虑一些细节。
2 组织工作
这是一个个人项目。所有的管理都是电子的。澄清和更正将在课程网页上公布。
3 材料说明
特点地点:在这里插入一段解释讲师将如何向学生分发datalab-handout.tar文件。
首先将datalap -handout.tar复制到计划在其中执行工作的Linux机器上的一个(受保护的)目录。然后发出命令
这将导致在目录中解压大量文件。您需要修改和提交的唯一文件是bits.c。
bits.c文件包含13个编程难题中的每一个的框架。您的任务是只使用整数谜题的直线代码(即,没有循环或条件)和有限数量的C算术和逻辑运算符来完成每个函数框架。具体来说,您只能使用以下八个运算符
一些函数进一步限制了这个列表。此外,不允许使用任何长于8位的常量。请参阅bits.c中的注释,了解详细规则和所需编码风格的讨论。
4 谜题
本节描述您将在bits.c中解决的难题。
表1按难度顺序列出了这些谜题。“评级”字段给出了谜题的难度评级(点数),“最大操作”字段给出了你可以用于实现每个功能的最大操作数。请参阅bits.c中的注释,了解函数所需行为的更多细节。您还可以引用tests.c中的测试函数。这些函数被用作引用函数来表达函数的正确行为,尽管它们不满足函数的编码规则。
函数名 | 说明 | 评级 | 最大操作 |
---|---|---|---|
bitxor(x,y) | 实现x || y只使用&和~ | 1 | 14 |
tmin() | 返回最小的二进制的补整数 | 1 | 4 |
isTmax(x) | 只有当x是最大的二进制数是才为真 | 1 | 10 |
allOddBits(x) | 仅当x中的所有奇数位都为1时为真 | 2 | 12 |
negate(x) | 返回-x | 2 | 5 |
isAsciDigit(x) | 如果0x30<=x<=0x39返回1(ASCII码字符'0'到'9') | 3 | 15 |
conditional(x,y,z) | 和x ? y : z一样 | 3 | 16 |
isLessOrEqual(x,y) | if x<= y return 1,else return 0 | 3 | 24 |
logicalNeg(x) | 实现!操作符,使用所有合法的操作符,除了! | 4 | 12 |
howManyBits(x) | 返回在二进制的补码中表示x所需的最小位数 | 4 | 90 |
floatScale2(uf) | 返回浮点型参数uf的表达式2*f的位级等效值。 | 4 | 30 |
floatFloat2Int(uf) | 对于浮点型参数f,返回表达式(int) f的位级等效值。 | 4 | 30 |
floatPower2(x) | 对于任意32位整数x,返回表达式2.0^x(2.0的x次方)的位级等价值。 | 4 | 30 |
对于浮点谜题,您将实现一些常见的单精度浮点运算。对于这些谜题,您可以使用标准的控制结构(条件、循环),也可以使用int和unsigned数据类型,包括任意的unsigned和integer常量。不能使用任何联合、结构或数组。最重要的是,不能使用任何浮点数据类型、操作或常量。相反,任何浮点操作数都将作为无符号类型传递给函数,而任何返回的浮点值都将是无符号类型。代码应该执行实现指定浮点操作的位操作。
包含的程序fshow帮助您理解浮点数的结构。要编译fshow,请切换到讲义目录并输入:
你可以使用fshow来查看任意模式表示的浮点数:
您还可以给出fshow十六进制和浮点值,它将破译它们的位结构。
5 评价
你的分数将根据以下分布计算,最高67分: 36 正确性点。 26 性能点。 5 风格点。
正确性点。你必须解决的谜题的难度等级在1到4之间,这样它们的加权总和就是36。我们将使用btest程序对函数进行评估,这将在下一节中介绍。如果一个谜题通过了btest的所有测试,你将获得全部的积分,否则没有积分。
性能点。在这门课上,我们主要关心的是你能否得到正确的答案。然而,我们希望向你灌输一种让事情尽可能简短和简单的意识。此外,有些谜题可以通过蛮力解决,但我们希望你更聪明。因此,对于每个函数,我们已经为每个函数建立了允许使用的最大操作符数量。这个限制非常大,只设计用来捕获异常低效的解决方案。每一个满足运算符限制的正确函数,你将得到2分。
风格点。最后,我们为你们的解决方案风格和评论留了5点主观评价。你的解决方案应该尽可能的简洁和直接。你的评论应该是信息丰富的,但不必泛泛。
在你的作品上签名
我们在讲义目录中包含了一些自动升级工具——btest、dlc和driver.pl——以帮助您检查工作的正确性。
- btest:这个程序检查bits.c中的函数的功能正确性。要构建和使用它,输入以下两个命令:
注意,每次修改bits.c文件时都必须重新构建btest。 您会发现,一次处理一个函数,并对每个函数进行测试是很有帮助的。你可以使用-f标志来指示btest只测试一个函数:
你可以使用选项标志-1、-2和-3为它提供特定的函数参数:
关于运行btest程序的文档,请查看README文件。
- dlc:这是一个来自MIT CILK小组的ANSI C编译器的修改版本,你可以用它来检查每个谜题的编码规则是否符合。典型的用法是:
程序将静默运行,除非它检测到问题,例如非法操作符、太多操作符或整数谜题中的非直线代码。使用-e开关运行:
导致DLC打印每个函数使用的操作符数量的计数。输入./dlc -help以获取命令行选项列表。
- driver.pl:这是一个驱动程序,使用btest和dlc计算正确性和性能点为您的解决方案。它不带参数:
您的导师将使用driver.pl来评估您的解决方案。
6 提交指令
特点地点:在这里插入文本,告诉每个学生如何在你的学校提交他们的bits.c解决方案文件。
7建议
- 不要在bits.c文件中包含<stdio.h>头文件,因为它会混淆dlc并导致一些非直观的错误消息。您仍然可以在bits.c文件中使用printf进行调试,而不包含<stdio.h>头文件,尽管gcc将打印一个您可以忽略的警告。
- DLC程序强制执行比C++更严格的C声明形式,或者由GCC强制执行。特别是,任何声明都必须出现在非声明语句之前的块中(用大括号括起来)。例如,它会抱怨以下代码:
8 “击败教授”比赛
为了好玩,我们提供了一个可选的“击败教授”比赛,让你可以与其他学生和老师竞争,开发出最有效的谜题。目标是用最少的操作员解决每个数据实验室难题。对于每一个题目,符合或超过讲师操作员计数的学生都是赢家!
如欲提交参赛作品,请输入:
昵称限制为35个字符,可以包含字母数字、撇号、逗号、句点、破折号、下划线和&号。你可以随时提交。您最近提交的将出现在实时记分板上,仅以您的昵称识别。您可以通过将浏览器指向来查看计分板
http://$SERVER_NAME:$REQUESTD_PORT
特定地点:将$SERVER_NAME和$REQUESTD_PORT替换为您在./contest/ Contest.pm文件中设置的值。