基于龙芯架构的操作系统ubuntu编译运行
立即下载
资源介绍:
MOS操作系统
# 评测说明
本目录维护用于 MOS 的自动部署和评测工具,以及各课下测试点的评测数据。
## 评测数据
评测数据用于定义一个测试点的评测逻辑,由 MOS 评测程序 [judges/tools/judge.py](judges/tools/judge.py) 解析。评测数据位于本仓库和 [quizs](http://git.os.buaa.edu.cn/star_os/quizs) 仓库的 `judges/` 或 `judges/.py`,对应的测试目录通常为 `tests/`,其中 `` 需匹配正则表达式 `lab[1-6]_[a-z0-9_]+`(对于课下测试则为 `lab[1-6]_(\d+)`,`(\d+)` 部分从 `1` 开始编号)。
如果 `judges/` 是目录,评测程序会识别其中的下列文件:
- `standard` :定义期望输出或自定义评测逻辑的文本文件,用于检查被测程序的输出(下称**学生输出**);
- 若该文件不存在,则不会检查学生输出:只要被测程序以返回值 0 退出,即视为评测通过。
- `run` :定义被测程序运行方式的**可执行文件**,用于代替被测程序的运行命令。
- 若该文件不存在,则使用 `make run` 运行被测程序。
如果 `judges/` 是普通文件,或仅存在 `judges/.py`,评测程序会将其视为以上的 `standard` 文件。
### `standard` 文件
以下介绍 `standard` 文件的内容规范。
一个 `standard` 文件可以包含一个或多个 Case,各 Case 间使用一行 `:` 分隔,每个 Case 需要包含一个或多个**标准文本行**,表示期望学生输出中包含的文本。评测学生输出时,各 Case 内的标准文本行必须依次出现,不同 Case 内的文本行可以任意顺序出现,类似多个并发的用户进程的输出行为。学生输出的每一行至多匹配一个标准文本行。
以标点符号或 `def `、`class ` 或 `from ` 开头的标准文本行需要被括在一对单引号之间,其中嵌套的单引号需要使用 `\'` 转义。其他情况下,是否使用单引号均可。
如果将标准文本行括在一对双引号之间,则该标准文本行是**宽松的**。对于宽松的标准文本行,允许在学生输出的任意部分进行匹配;对于非宽松的标准文本行,只会在学生输出的**可信部分**中进行匹配。可信部分包括:
- 测试目录(`tests/lab`)下的用户程序通过 `debugf`、`user_panic`、`user_halt` 进行的输出;
- 测试目录定义的 `init-override`(通常为 `tests/lab/init.c`)中的代码通过 `printk`、`panic` 进行的输出。
由于评测前会将测试点提供的测试目录覆盖到 `tests` 下,上述的可信部分一定是由测试程序本身输出的,因此在期望输出公开后,这一机制可以防止学生在被测程序中伪造输出,欺骗评测程序,其具体实现可见 `tools/preload` 目录和 `mk/tests.mk` 中的构建过程。
课上测试点与课下测试不同,不会向学生下发实际评测使用的所有测试目录,所以评测数据需要支持自定义的评测规则和反馈信息,以帮助学生判断问题。目前的设计如下:
- 支持在 Case 的顶部使用 Python 的 `def` 语法定义该 Case 的初始化函数,该函数将在评测前**解析该 Case 时**被调用,不传入任何参数。
- 初始化函数中的 `def` 行可省略,省略后将被视为 `def _():` ,但函数体中必须使用 4 个空格缩进。
- 定义初始化函数后,可以省略 Case 前的分隔行 `:`,同时函数的名称将被作为该 Case 的 id。若函数名称为 `_` 或未定义初始化函数,其 id 将被自动生成。
- 初始化函数中可访问这些接口(名称):
- `name(s: str)` :可设置当前 Case 的名称。
- 对于定义了名称的 Case,评测结束后,将会向学生(stderr)反馈它们的名称和评测结果。
- `score(s: str)` :可设置当前 Case 的得分。
- 目前这个得分并没有被使用,可能需要等待 http://git.os.buaa.edu.cn/osome/quartz-judger/-/issues/30 完成后使用新的接口向 quartz 反馈测试点(对应一个 OSome 定义的 case)的得分。
- `post(f: Callable[[str]])` :可设置当前 Case 的后处理函数(post hook),该 hook 将在**评测结束后**被调用,传入的参数是完整学生输出中的**可信部分**。
- `permissive()`:可设置当前 Case 为宽松模式,即将其中所有标准文本行都视为**宽松的**,无论是否使用了双引号。
- `self`: 当前 Case 对应的 Python 对象,可以手动设置其他属性,如动态生成其标准文本行列表 `self.lines: list[str]` 。
- `utils.py` 中定义的输出函数,如 `red`、`green`、`bred`、`bgreen`。以 `b` 开头的函数会向 stderr 输出,可用于向学生反馈信息。
- 在 post hook 函数中,除了上述接口和传入的可信输出 `str`,还可以访问以下接口:
- `cases: dict[str, Case]` :所有 `Case` 的字典,将 Case 的 id 对应到其 `Case` 对象。
- `self.passed: bool` :当前 Case 是否通过(学生输出中依次出现了所有的标准文本行),可以通过对该属性赋值来强制设置当前 Case 的评测结果。
- `judges/tools` 目录下提供了一个 `mostd.py`,定义了以上接口名称。可以在 `standard` 文件顶部 `from mostd import *`,使其符合 Python 脚本的语法,便于编辑器的语法高亮和代码提示。
- 以 `#` 开头的行、空行和 `from mostd import *` 行会被忽略,不会被解析为标准文本行。
资源文件列表:
la32r_ans.zip 大约有438个文件