尝试用RUST写教学操作系统
尝试用RUST写教学操作系统 向勇、陈渝 清华大学计算机系 20181123 1 背景 • 用什么语言写操作系统? – 汇编 – C – C++ – GO – RUST – … 2 3 各位老师所教的课程信息统计 计算机组成原理 编译原理 操作系统 其他 A B C D 提交 多选题 1分 此题未设答案 CPU:X86、MIPS、ARM、RISC-V • 语言:汇编、C、… – 真实 • QEMU、开发板、真实系统 – 开放 • 树莓派、Edison、FPGA 4 已有的尝试 • 用C语言写OS – MIT 6.828 – Harvard cs161 – Stanford cs140/140e – Univ. of Wisc. CS-537 • MIT:用GO写OS edu/class/cs140e/ 5 内核开发需要的程序设计语言 Yu Zhang, Foundation of PLs, CSEW’18⋅ Beijing 6 我们的尝试-教学操作系统ucore 7 我们的尝试-系统类课程的协调 8 用RUST写操作系统: 2018年春季操作系统课 http://os.cs.tsinghua.edu.cn/oscourse/OS2018spring/projects#A0 码力 | 23 页 | 1.53 MB | 1 年前3Rust 程序设计语言简体中文版
指引你编写出能运 行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信 息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文 本,以判断你尝试运行的示例是否意在出错。Ferris 也将帮助你区分那些不是意在工作的代 码: Ferris 含义 这段代码无法通过编译! 9/600 Rust 程序设计语言 简体中文版 这段代码会 Panic! installed now. Great! 另外,你还需要一个 链接器(linker),这是 Rust 用来将其编译的输出连接到一个文件中的 程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常 包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装 一个 C 编译器。 在 macOS 上,你可以通过运行以下命令获得 C --open 并点击左侧导航栏中的 rand 。 新增加的第二行代码打印出了秘密数字。这在开发程序时很有用,因为可以测试它,不过在最 终版本中会删掉它。如果游戏一开始就打印出结果就没什么可玩的了! 尝试运行程序几次: $ cargo run Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished0 码力 | 600 页 | 12.99 MB | 1 年前3Rust 程序设计语言 简体中文版 1.85.0
指引你编写出能运 行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信 息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文 本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码: Ferris 含义 这段代码无法通过编译! 9/562Rust 程序设计语言 简体中文版 这段代码会 Panic! is installed now. Great! 另外,你还需要一个 链接器(linker),它是 Rust 用来将其编译的输出链接成一个文件的程 序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包 括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一 个 C 编译器。 在 macOS 上,你可以通过运行以下命令获得 C 。运行完该命令后,你 无需保留 get-dependencies 文件夹。一旦你运行了这些命令,就可以在本书之后所有的 cargo 命令中,使用 --offline 参数来使用这些缓存的版本,而不必尝试使用网络。 14/562Rust 程序设计语言 简体中文版 Hello, World! 既然安装好了 Rust,是时候来编写第一个 Rust 程序了。当学习一门新语言的时候,使用该语 言在屏幕上打印0 码力 | 562 页 | 3.23 MB | 8 天前3Apache Shiro参考手册中文版
Subject 实例代表了当前用户,但谁又是当前用户?呃, 他们是匿名的——也就是说,直到直到他们至少登录一次。那么,让我像下面这样做: 这就是了!它再简单不过了。 但如果他们的登录尝试失败了会怎样?你能够捕获各种具体的异常来告诉你到底发生了什么,并允许你去处理并作 出相应反应: 你能够检查到许多不同类型的异常,或抛出你自己的自定义条件的异常——Shiro 可能不提供的。请参见 Authenticator(org.apache.shiro.authc.Authenticator) 这里很好的解释了上面 提到的Realms Authenticator 是一个对执行及对用户的身份验证(登录)尝试负责的组件。当一个用户尝试登录时,该逻辑 被 Authenticator 执行。Authenticator 知道如何与一个或多个 Realm 协调来存储相关的用户/帐户信息。从这些 Realm 中获得的数据被用来 AuthenticationStrategy) 如果不止一个 Realm 被配置,则 AuthenticationStrategy 将会协调这些 Realm 来决定身份认证尝试成功或 失败下的条件(例如,如果一个 Realm 成功,而其他的均失败,是否该尝试成功? 是否所有的 Realm 必须成功?或只有第一个成功即可?)。 Authorizer(org.apache.shiro.authz.Authorizer)0 码力 | 92 页 | 1.16 MB | 1 年前3《Redis使用手册》(试读版)
⼀个锁实现通常会有获取(acquire)和释放(release)这两种操作: 获取操作⽤于取得资源的独占使⽤权。 在任何时候, 最多只能有⼀个进程取得锁, 我们把成功取得锁的这 个进程称之为锁的持有者。 在锁已经被持有的情况下, 所有尝试再次获取锁的操作都会失败。 释放操作⽤于放弃资源的独占使⽤权, ⼀般由锁的持有者调⽤。 在锁被释放之后, 其他进程就可以再次尝 试获取这个锁了。 代码清单 2-2 展示了⼀个使⽤字符串键实现的锁程序, self.client = client self.key = key def acquire(self): """ 尝试获取锁。 成功时返回 True ,失败时返回 False 。 """ result = self.client.set(self.key, VALUE_OF_LOCK VALUE_OF_LOCK, nx=True) return result is True def release(self): """ 尝试释放锁。 成功时返回 True ,失败时返回 False 。 """ return self.client.delete(self.key) == 10 码力 | 352 页 | 6.57 MB | 1 年前3Python 3.7.13 正则表达式 HOWTO
字符),'cat' (1 个 “’a’),` `'caaat' (3 个 'a' 字符),等等。 类似 * 这样的重复是 贪婪的;当重复正则时,匹配引擎将尝试尽可能多地重复它。如果模式的后续部分 不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。 一个逐步的例子将使这更加明显。让我们考虑表达式 a[bcd]*b。这个正则匹配字母 'a',类 [bcd] 中 的零或多个字母,最后以 'b' 结尾。现在想象一下这个正则与字符串 匹配 解释 1 a 正则中的 a 匹配。 2 abcbd 引擎尽可能多地匹配 [bcd]* ,直到字符串结束。 3 失败 引擎尝试匹配 b ,但是当前位置位于字符串结束,所以匹配失败。 4 abcb 回退一次,[bcd]* 少匹配一个字符。 5 失败 再次尝试匹配 b ,但是当前位置是最后一个字符 'd' 。 6 abc 再次回退,所以 [bcd]* 只匹配 bc 。 6 abcb 再试一次 ,所以它成功了。 正则现在已经结束了,它已经匹配了 'abcb'。这演示了匹配引擎最初如何进行,如果没有找到匹配,它 将逐步回退并一次又一次地重试正则的其余部分。它将回退,直到它为 [bcd]* 尝试零匹配,如果随后 失败,引擎将断定该字符串与正则完全不匹配。 另一个重复的元字符是 +,它匹配一次或多次。要特别注意 * 和 + 之间的区别;* 匹配 零次或更多次, 因此重复的任何东西都可能根本不存在,而0 码力 | 17 页 | 392.75 KB | 10 月前3Python 3.10.15 正则表达式 HOWTO
个 'a' )、'cat' (1 个 'a' )、'caaat' (3 个 'a' )等等。 类似 * 这样的重复是 贪婪的。当重复正则时,匹配引擎将尝试重复尽可能多的次数。如果表达式的后续部 分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。 通过一个逐步示例更容易理解这一点。让我们分析一下表达式 a[bcd]*b 。该表达式首先匹配一个字母 'a' ,接着匹配字符类 [bcd] 中的零个或更多个字母,最后以一个 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎尝试匹配 b ,但是当前位置位于字符串末尾,所以匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配 b ,但是当前位置上的字符是最后一个字符 'd' 。 6 abc 再次回退,让 [bcd]* 只匹配 bc 。 6 abcb 再次尝试匹配 b 。这一次当前位置的字符是 'b' ,所以它成功了。 compile('[a-z]+') 现在,你可以尝试匹配正则 [a-z]+ 的各种字符串。空字符串根本不匹配,因为 + 表示“一次或多次重复”。 match() 在这种情况下应返回 None,这将导致解释器不打印输出。你可以显式打印 match() 的结果,使 其清晰。: >>> p.match("") >>> print(p.match("")) None 现在,让我们尝试一下它应该匹配的字符串,例如 tempo。在这个例子中0 码力 | 18 页 | 391.85 KB | 10 月前3Python 3.8.20 正则表达式 HOWTO
个 'a' )、'cat' (1 个 'a' )、'caaat' (3 个 'a' )等等。 类似 * 这样的重复是 贪婪的。当重复正则时,匹配引擎将尝试重复尽可能多的次数。如果表达式的后续 部分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。 通过一个逐步示例更容易理解这一点。让我们分析一下表达式 a[bcd]*b 。该表达式首先匹配一个字母 'a' ,接着匹配字符类 [bcd] 中的零个或更多个字母,最后以一个 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎尝试匹配 b ,但是当前位置位于字符串末尾,所以匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配 b ,但是当前位置上的字符是最后一个字符 'd' 。 6 abc 再次回退,让 [bcd]* 只匹配 bc 。 6 abcb 再次尝试匹配 b 。这一次当前位置的字符是 'b' ,所以它成功了。 compile('[a-z]+') 现在,你可以尝试匹配正则 [a-z]+ 的各种字符串。空字符串根本不匹配,因为 + 表示“一次或多次重 复”。match() 在这种情况下应返回 None,这将导致解释器不打印输出。你可以显式打印 match() 的 结果,使其清晰。: >>> p.match("") >>> print(p.match("")) None 现在,让我们尝试一下它应该匹配的字符串,例如 tempo。在这个例子中0 码力 | 17 页 | 393.47 KB | 10 月前3Python 3.8.20 正则表达式 HOWTO
个 'a' )、'cat' (1 个 'a' )、'caaat' (3 个 'a' )等等。 类似 * 这样的重复是 贪婪的。当重复正则时,匹配引擎将尝试重复尽可能多的次数。如果表达式的后续 部分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。 通过一个逐步示例更容易理解这一点。让我们分析一下表达式 a[bcd]*b 。该表达式首先匹配一个字母 'a' ,接着匹配字符类 [bcd] 中的零个或更多个字母,最后以一个 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎尝试匹配 b ,但是当前位置位于字符串末尾,所以匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配 b ,但是当前位置上的字符是最后一个字符 'd' 。 6 abc 再次回退,让 [bcd]* 只匹配 bc 。 6 abcb 再次尝试匹配 b 。这一次当前位置的字符是 'b' ,所以它成功了。 compile('[a-z]+') 现在,你可以尝试匹配正则 [a-z]+ 的各种字符串。空字符串根本不匹配,因为 + 表示“一次或多次重 复”。match() 在这种情况下应返回 None,这将导致解释器不打印输出。你可以显式打印 match() 的 结果,使其清晰。: >>> p.match("") >>> print(p.match("")) None 现在,让我们尝试一下它应该匹配的字符串,例如 tempo。在这个例子中0 码力 | 17 页 | 393.47 KB | 10 月前3Python 3.10.15 正则表达式 HOWTO
个 'a' )、'cat' (1 个 'a' )、'caaat' (3 个 'a' )等等。 类似 * 这样的重复是 贪婪的。当重复正则时,匹配引擎将尝试重复尽可能多的次数。如果表达式的后续 部分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。 通过一个逐步示例更容易理解这一点。让我们分析一下表达式 a[bcd]*b 。该表达式首先匹配一个字母 'a' ,接着匹配字符类 [bcd] 中的零个或更多个字母,最后以一个 引擎尽可能多地匹配 [bcd]* ,直至字符串末尾。 3 失败 引擎尝试匹配 b ,但是当前位置位于字符串末尾,所以匹配失败。 4 abcb 回退,让 [bcd]* 少匹配一个字符。 5 失败 再次尝试匹配 b ,但是当前位置上的字符是最后一个字符 'd' 。 6 abc 再次回退,让 [bcd]* 只匹配 bc 。 6 abcb 再次尝试匹配 b 。这一次当前位置的字符是 'b' ,所以它成功了。 compile('[a-z]+') 现在,你可以尝试匹配正则 [a-z]+ 的各种字符串。空字符串根本不匹配,因为 + 表示“一次或多次重 复”。match() 在这种情况下应返回 None,这将导致解释器不打印输出。你可以显式打印 match() 的 结果,使其清晰。: >>> p.match("") >>> print(p.match("")) None 现在,让我们尝试一下它应该匹配的字符串,例如 tempo。在这个例子中0 码力 | 17 页 | 393.01 KB | 10 月前3
共 659 条
- 1
- 2
- 3
- 4
- 5
- 6
- 66