百科问答小站 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内核会不会是一个挺有意义的工程?

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




  

相关话题

  Rust 语言现在什么情况,为什么知乎上不怎么讨论Rust语言了呢? 
  C语言中for语句的赋初值用int i=1和i=1有什么区别? 
  为什么知乎用户 vczh 不建议初学编程的人把 C 作为入门语言? 
  如何评价某985老师所说的「C语言至少学10年才能懂」? 
  谭浩强在程序员圈子里的口碑如何?为什么? 
  为什么我用c++写的游戏那么简陋? 
  写库函数供他人用的原理是什么? 
  求BAT代码或C语言代码如何自动复制剪切板文本并分行保存一个txt? 
  求十亿内所有质数的和,怎么做最快? 
  将一个double型(int型)格式化输出为int型(double型)时发生了什么? 

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





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利