您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

为什么不用Go开发操作系统?

时间:2023-05-25 13:31:28  来源:OSC开源社区  作者:

出品 | OSC开源社区(ID:oschina2013)

本文整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探讨了为什么像 C 这样的编程语言在 OS 开发中占据优势,以及是否可以使用 Go 编写 OS。此外还提到了用 Go 开发操作系统的可行性、局限性,以及目前的部分成果。

操作系统 (OS) 是计算机系统的心脏和灵魂,它管理着计算机的硬件和软件资源,并为用户提供与计算机交互的方式。传统上,C 和 Assembly 等语言因其低开销和 “接近机器码” 的特性而被用于开发操作系统。

但诸如 Go 等高级语言的兴起引入了一些特性,这些特性或许可以使开发操作系统等复杂软件变得更加容易。例如, 类型安全、错误处理和并发性在开发操作系统时应该是有益的。

因此,采用像 Go 这样的高级语言来开发操作系统理应是自然选择,但为什么并没有成功的案例?

操作系统由不同的组件构成,它们负责不同的功能,可以使用不同的编程语言编写。

操作系统的核心是内核 (Kernel),它负责与硬件交互 —— 几乎都是采用 C 或汇编语言编写。至于面向用户的组件(例如 GUI 应用程序),可以采用任何语言编写。

例如,Android 采用 JAVA 编写用户层的组件,如 GUI 框架和系统应用程序(相机、电话等)。相对应的,其内核采用 C 和汇编语言编写;底层系统组件 —— 库,则是用 C++ 编写。

C 语言 “统治” 内核的主要原因:

  • 可直接管理内存
  • 缺少抽象
  • 无需依赖运行时
  • 可移植性

Go 作为高级语言提供了许多令人满意的特性。从这方面来看,它似乎可以成为开发操作系统的绝佳选择:

  • 某些类型的错误在高级语言中出现的可能性要小得多
  • 并发性:在高级语言中处理并发更容易,因为几乎每种高级语言都内置处理并发所需的机制
  • 类型安全:防止像 C 的宽松类型强制执行

不过尽管 Go 提供了令人满意的特性,可以让操作系统开发者的工作更轻松,但它也有一些局限性。

作为一种具有垃圾回收功能的语言,Go 并不真正适合操作系统开发。使用 Go 编写内核意味着需要小心翼翼地绕过 Go 的垃圾收集。正如 Reddit 论坛中开发者提到的,鼠标滞后可能是因为中断处理程序分配了触发垃圾回收的内存。

此外,Go 还需要大量的 runtime 才能执行,这意味着它不能直接在硬件上运行。尽管 TinyGo 可以将 Go 编译为在裸机上运行,但与 C 相比,它只支持少量的架构,而 C 几乎可以在任何架构上运行。

总的来说,使用 Go 开发一个不是 “玩具性质” 的操作系统几乎是不可能。尤其是要求支持在多种架构上运行、支持不同设备(如显卡或网卡),并符合 POSIX 标准,这更是极具挑战性。

最后看一下探索用 Go 开发操作系统的案例。

Biscuit 是一个用 Go 开发的操作系统,运行在 64 位 X86 架构上。它使用经过修改的 Go 1.10 运行时实现,其中添加了更多汇编代码来处理系统调用和中断处理程序的引导和进入 / 退出。

Biscuit 为用户进程提供 POSIX 接口,支持 fork、exec 等。它实现了支持核心 POSIX 文件系统调用的文件系统。Biscuit 为用 Go 编写的 Intel PCI-Express 以太网 NIC 实现了 TCP/IP 堆栈和驱动程序。使用 POSIX 接口,Biscuit 可以在不修改源代码的情况下运行许多 linux C 程序。

然而,Biscuit 缺少许多功能,例如调度优先级、换出页面或磁盘,以及安全功能,例如用户、访问控制列表和地址空间随机化。

相关链接:https://blog.jetbrains.com/go/2023/05/16/os-in-go-why-not/



Tags:Go   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
出品 | OSC开源社区(ID:oschina2013)本文整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探讨了为什么像 C 这样的编程语言在 OS 开发中占据优势,以及是否可以使用 Go...【详细内容】
2023-05-25  Tags: Go  点击:(0)  评论:(0)  加入收藏
最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一探究竟,了解一下MongoDB的特点和基本用法。三分钟你将学会: Mongo...【详细内容】
2023-05-24  Tags: Go  点击:(6)  评论:(0)  加入收藏
0.1、索引https://waterflow.link/articles/16640805249861、未知的枚举值我们现在定义一个类型是unit32的Status,他可以作为枚举类型,我们定义了3种状态type Status uint32co...【详细内容】
2023-05-24  Tags: Go  点击:(7)  评论:(0)  加入收藏
1. 引言反射是现代编程语言中非常重要的一个特性,尤其是在面向对象编程语言中此前的文章中,我们看到 golang 如何实现面向对象的封装: 通过 GoLang 实现面向对象思想如果能够...【详细内容】
2023-05-24  Tags: Go  点击:(6)  评论:(0)  加入收藏
原型设计模式是面向对象编程中的一种设计模式,它的主要目的是通过复制现有对象来创建新对象,从而避免昂贵的对象创建过程,提高程序的性能和效率。原型设计模式包括深拷贝和浅拷...【详细内容】
2023-05-22  Tags: Go  点击:(7)  评论:(0)  加入收藏
1. hello-worldpackage mainimport "fmt"func main(){fmt.Println("Hello world, Go Go!");fmt.Printf("type of Hello is %T\n", "Hello")}package main--每一个Go文件都应...【详细内容】
2023-05-20  Tags: Go  点击:(5)  评论:(0)  加入收藏
在go语言中,数据类型分为**静态类型**和**底层类型**,感觉底层类型是golang实现的时候所使用的c语言的类型,而静态类型仅仅是针对于go语言本身而言所定义好的类型。具体的信息...【详细内容】
2023-05-20  Tags: Go  点击:(7)  评论:(0)  加入收藏
golang 命令详解github地址1. build 编译包和依赖项2. clean 删除对象文件和缓存的文件3. doc与godoc 显示包文档4. env 打印Go语言的环境信息5. fix与go tool fix 会把指定...【详细内容】
2023-05-20  Tags: Go  点击:(8)  评论:(0)  加入收藏
Win10_VSCode_Go环境配置一、环境配置1.1 安装Golang链接:golang.google.cn/dl/下载完成运行,安装到指定路径检查:在cmd或者powershell上,输入命令 shell 复制代码 go version 1...【详细内容】
2023-05-19  Tags: Go  点击:(8)  评论:(0)  加入收藏
在遍历 Map 时,并不是固定地从 0 号 Bucket 开始遍历,每次都是从一个随机值序号的 Bucket 开始遍历,并且是从这个 Bucket 的一个随机序号的 Cell 开始遍历。Go 语言中的 map 是...【详细内容】
2023-05-19  Tags: Go  点击:(13)  评论:(0)  加入收藏
▌简易百科推荐
出品 | OSC开源社区(ID:oschina2013)本文整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探讨了为什么像 C 这样的编程语言在 OS 开发中占据优势,以及是否可以使用 Go...【详细内容】
2023-05-25    OSC开源社区  Tags:Go   点击:(0)  评论:(0)  加入收藏
0.1、索引https://waterflow.link/articles/16640805249861、未知的枚举值我们现在定义一个类型是unit32的Status,他可以作为枚举类型,我们定义了3种状态type Status uint32co...【详细内容】
2023-05-24  干饭人小羽    Tags:go语言   点击:(7)  评论:(0)  加入收藏
1. 引言反射是现代编程语言中非常重要的一个特性,尤其是在面向对象编程语言中此前的文章中,我们看到 golang 如何实现面向对象的封装: 通过 GoLang 实现面向对象思想如果能够...【详细内容】
2023-05-24  干饭人小羽  今日头条  Tags:golang   点击:(6)  评论:(0)  加入收藏
原型设计模式是面向对象编程中的一种设计模式,它的主要目的是通过复制现有对象来创建新对象,从而避免昂贵的对象创建过程,提高程序的性能和效率。原型设计模式包括深拷贝和浅拷...【详细内容】
2023-05-22  阿琪说    Tags:Go   点击:(7)  评论:(0)  加入收藏
1. hello-worldpackage mainimport "fmt"func main(){fmt.Println("Hello world, Go Go!");fmt.Printf("type of Hello is %T\n", "Hello")}package main--每一个Go文件都应...【详细内容】
2023-05-20  干饭人小羽  今日头条  Tags:golang   点击:(5)  评论:(0)  加入收藏
在go语言中,数据类型分为**静态类型**和**底层类型**,感觉底层类型是golang实现的时候所使用的c语言的类型,而静态类型仅仅是针对于go语言本身而言所定义好的类型。具体的信息...【详细内容】
2023-05-20  干饭人小羽    Tags:golang   点击:(7)  评论:(0)  加入收藏
golang 命令详解github地址1. build 编译包和依赖项2. clean 删除对象文件和缓存的文件3. doc与godoc 显示包文档4. env 打印Go语言的环境信息5. fix与go tool fix 会把指定...【详细内容】
2023-05-20  干饭人小羽    Tags:golang   点击:(8)  评论:(0)  加入收藏
工厂模式是面向对象编程中的一种设计模式,它的主要目的是将对象的创建与使用分离开来,从而提高程序的可维护性和可扩展性。工厂模式包括工厂方法模式、抽象工厂模式和简单工厂...【详细内容】
2023-05-20  阿琪说    Tags:工厂模式   点击:(7)  评论:(0)  加入收藏
Win10_VSCode_Go环境配置一、环境配置1.1 安装Golang链接:golang.google.cn/dl/下载完成运行,安装到指定路径检查:在cmd或者powershell上,输入命令 shell 复制代码 go version 1...【详细内容】
2023-05-19  橘子292  稀土掘金  Tags:Go语言   点击:(8)  评论:(0)  加入收藏
在遍历 Map 时,并不是固定地从 0 号 Bucket 开始遍历,每次都是从一个随机值序号的 Bucket 开始遍历,并且是从这个 Bucket 的一个随机序号的 Cell 开始遍历。Go 语言中的 map 是...【详细内容】
2023-05-19     AlwaysBeta  Tags:Go 语言   点击:(13)  评论:(0)  加入收藏
站内最新
站内热门
站内头条