我想知道生锈的编译代码是否包含与操作系统相关的代码。(不是说像打印一样的东西)
例如
let x = (4i,2i,3i)
let y = (3i,4i,4i)
现在,如果比较x == y
使用它的某些库,如果是,则取决于平台。
编辑: 就像在C ++中一样,我们不应该使用new,try catch或任何标准的lib。 在生锈的时候我们应该避免什么。
答案 0 :(得分:4)
您可以看到Rust编译器为自己的代码段生成的代码,而不必在本地安装Rust。
只需访问基于网络的围栏,然后在其中输入您的代码段。您可以运行该程序(从而观察它通过print语句执行的操作),或者更有用的是,在这种情况下,您可以将程序编译到生成的程序集,然后检查它以查看它是否调用了底层系统例程。
如果你转到这个链接:http://is.gd/Be6YVJ我已经将这样的程序放入了围栏中。 (有关实际的程序文本,请参阅本文的底部。)
如果按下asm按钮,则可以看到每个例程的程序集。 (我已将inline(never)
个属性添加到相关函数中,以确保它们不会被编译器优化掉。)
下面是bar
生成的程序集,这个函数调用高阶函数来获取一对3元组,然后将它们进行相等性比较:
.section .text._ZN3bar20h2bb2fd5b9c9e987beaaE,"ax",@progbits
.align 16, 0x90
.type _ZN3bar20h2bb2fd5b9c9e987beaaE,@function
_ZN3bar20h2bb2fd5b9c9e987beaaE:
.cfi_startproc
cmpq %fs:112, %rsp
ja .LBB0_2
movabsq $56, %r10
movabsq $0, %r11
callq __morestack
retq
.LBB0_2:
subq $56, %rsp
.Ltmp0:
.cfi_def_cfa_offset 64
movq %rdi, %rax
leaq 8(%rsp), %rdi
callq *%rax
movq 8(%rsp), %rcx
xorl %eax, %eax
cmpq 32(%rsp), %rcx
jne .LBB0_5
movq 40(%rsp), %rcx
cmpq %rcx, 16(%rsp)
jne .LBB0_5
movq 48(%rsp), %rax
cmpq %rax, 24(%rsp)
sete %al
.LBB0_5:
addq $56, %rsp
retq
.Ltmp1:
.size _ZN3bar20h2bb2fd5b9c9e987beaaE, .Ltmp1-_ZN3bar20h2bb2fd5b9c9e987beaaE
.cfi_endproc
所以你可以看到,它唯一要求的是一个辅助例程__morestack
,它检查堆栈溢出(或在具有分段堆栈支持的系统中分配更多堆栈)。 (因此,对于这样的示例,这是您自己需要提供的唯一核心功能;请注意,您可以让它暂停内核。)
以下是我放入围栏的程序:
#[inline(never)]
fn bar(f: fn() -> ((int, int, int), (int, int, int))) -> bool {
let (x, y) = f();
x == y
}
#[inline(never)]
fn foo_1() -> ((int,int,int), (int,int,int)) {
let x = (4i,2i,3i);
let y = (3i,4i,4i);
(x, y)
}
#[inline(never)]
fn foo_2() -> ((int,int,int), (int,int,int)) {
let x = (4i,2i,3i);
(x, x)
}
fn main() {
println!("bar(foo_1): {}", bar(foo_1));
println!("bar(foo_2): {}", bar(foo_2));
}
答案 1 :(得分:1)
Rust旨在允许用户实现操作系统内核,驱动程序或甚至没有操作系统并在裸机硬件上运行的应用程序。
目前Rust的标准运行时可以在代码中使用#![no_std]
属性禁用。您仍然可以使用某些库,例如libcore
。没有运行时你将无法获得的一件事是format!
和println!
宏,sprintf()
和printf()
等价物。
有关今天可以做的事情的示例,请查看Zinc project。