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

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




  

相关话题

  如何对一个元素只有0和1的数组进行排序? 
  为什么说C++的main函数最后不写 return 0; 是不好的习惯? 
  有哪些较好的 C 语言程序源码可供新手临摹参考? 
  fopen()的第二个参数为什么会采用字符串形式? 
  完成了c语言程序设计初步学习,大概了解了数据类型,循环,判断,数组,函数和指针。接下来该学什么(书)? 
  为什么 C 语言没有被 C++ 取代? 
  学C++之前需要先学C吗? 
  C 语言枚举 end 是做什么用的? 
  如何让自己孩子生下来学会的第一门语言是C语言? 
  一门编程语言,先将代码编译为C,再由C编译器编译为可执行文件,是否可行? 

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





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