百科问答小站 logo
百科问答小站 font logo



Rust是不是就相当于新时代的C语言? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

这个问题,让我想起来之前CTO跟我们闲聊的一个话题,如果有足够的钱,你想(用公司的产品)做什么?

当时各种头脑风暴里就有一条:用Rust或者Go语言把我们的操作系统(VxWorks)重写一遍。

理论上说,任何语言都可以拿来写操作系统。几年前我回答:



有很多人尝试过用非C语言的方式去写一个简单的操作系统,所以本质上说,操作系统并没有特别严格的语言限制。编写操作系统的语言选择更多的是一种工程上的选择:

1. 方便操作硬件;
2. 方便跨平台;
3. 性能要好一些;
4. 不依赖操作系统的运行库

工程上最困难的其实是最后一条:不依赖操作系统的运行库。在Linux内核里,各种最基础的运行库都是不依赖操作系统的,比如memcpy, strcmp, printf, malloc这些C语言里最最基础的东西。因为没有比操作系统更底层的东西,所以操作系统自身要实现所有最基础的工作。

其它语言往往都是用现成的glibc/msvc库,然后走系统调用完成实际的操作。但是操作系统就是系统调用的提供者,自然就只能自己搞定这些工作。C++的异常处理,Java的资源回收等等,这些东西如果放到内核里,都需要重新实现一套。

经过了这么多年的发展,C语言已经有在内核中完整的一套运行库,其它语言么要想重写操作系统,就要自己重写一遍(重复造轮子),这种工程上的开销非常巨大,并非技术上做不到。

完全使用另外一种语言重写内核这件事,我个人是不太赞同的,因为C语言本身特别贴硬件,任何太高级的语言都多少有一些限制。

比如,访问空指针(NULL),在很多语言里是非法的,但在内核中,不一定是非法的:x86实模式下,0地址上放的是中断向量表,是一个合法且有效的地址。类似的例子还有很多,比如调度器的调度函数实际上是永远不会返回的;中断处理程序里很多高级语言的保护动作都会失灵;创建进程的过程中,某些资源可能是父进程申请、子进程释放;内核最初的内存不是申请来的,有些是拿来直接用的等等。

如果其它语言要写一个完整的操作系统,那么就需要对一些特殊的场景提供特殊的特性支持。C语言限制少,所以C语言在这方面比较灵活。

一种合理的假设是在内核中支持Rust(也可以是别的语言)开发的驱动程序,这种可能性是存在的,对于新写的模块,使用Rust来开发,可以兼顾安全性和兼容性。这种情况是也就是现实情况,比如Windows驱动可以用C++开发,Linux内核里貌似也有用Rust开发的驱动。

回到题主的问题:

Rust是不是就相当于新时代的C语言?

我觉得不算,语言之间没有类比性。最多就是特性相似,但跟C最相似的应该算是C++吧。

话说用Rust重写一个Linux内核会不会是一个挺有意义的工程?

意义说不上来,但很烧钱是真的




  

相关话题

  java的引用明明和指针没什么本质区别,java为什么还宣称没有指针并把这个当作语言的优点? 
  为什么MSVC比GCC/Clang差(功能支持也差,译后性能也差),微软做不好一个C语言编译器吗? 
  为什么8bit限制是-128到127而不是-127到128? 
  用链表的目的是什么?省空间还是省时间? 
  你工作中最推荐的 C/C++ 程序库有哪些,为什么? 
  开源代码里某个函数很长,这种代码能否认为是好的? 
  如果有两颗药丸,一颗吃了让你写代码100%不出错,另一颗吃了能让你100%发现并修改bug,选哪颗? 
  内存为啥要分堆栈在编程里,要是全部只用堆或者全部只用栈,行不行? 
  既然谭浩强的c语言教材那么烂,那么应该选择什么书作为c语言教材? 
  如果要改进C语言,您最希望添加哪些语言特性,移除哪些语言特性? 

前一个讨论
如何看待京津铁路推出 30 日定期、20 次计次新型票制产品?将对京津跨城生活工作的乘客产生哪些影响?
下一个讨论
世界上不用公元纪年的国家都使用什么纪年方法?





© 2025-04-22 - tinynew.org. All Rights Reserved.
© 2025-04-22 - tinynew.org. 保留所有权利