最近在看 APUE,发现 UnixManual 和 Posix 的 API 设计与 Golang 差距好大,为什么 Golang 要这么设计?

2016-04-29 12:14:44 +08:00
 sjtlqy

主要是有几点:

简化了: Socket 等 TCP 层的网络操作都被简化了; Signal 等的 IPC 交互都被简化了,还有很多等等。

添加了: 关于添加的其实没有让我难懂的,只是好奇这些 Package 添加的界线是什么呢?很多都是工具级别的,和 Rust ( Core+Std )有很大的差别。

去掉了: IO 复用貌似被隐藏了,或者用户是调用不到了。

最后搞得我有点怀疑 Unix/Linux 的设计哲学了,我不知道这是不是在延续 Plan 9 的设计哲学? 还是很多 System V 的 API 就是设计的太复杂了?

这样下去,是不是更加脱离了操作系统呢?不是很理解被简化得这么多了,主要还是这一点。

2299 次点击
所在节点    Go 编程语言
14 条回复
neoblackcap
2016-04-29 15:29:55 +08:00
上层 API 必须要将底层的 API 封装好,这个不是很正常嘛?
就算是 socket 也是有封装的,基本上你用到的都是网络层的东西,这就是封装。很正常
至于 IO 复用,当前版本的 go runtime 已经将其集成了。用 Goroutine 就可以了,调度器会自己去调度。
darasion
2016-04-29 15:50:03 +08:00
我认为:
1. 首先 golang 应该并没有打算完全替代 c ;
2. unix 设计也不是完美的,它也有各种历史遗留问题;
3. 各种计算机上古时代硬件条件限制而做出的设计并不一定符合当代现实。
sjtlqy
2016-04-29 16:18:12 +08:00
@darasion 你说的很有道理,这也许就是这些差别的根本驱动力。

但是我们如何确定现在的设计是一个优秀的在一定时间内都合理的设计呢?

在很多已经被淘汰的软件里面,应该是可以找到一些线索的。

都是好事情, 自然生长,共同维护

@neoblackcap C++没做好这方面的抽象, 也是历史所然
neoblackcap
2016-04-29 16:38:06 +08:00
@sjtlqy 我觉得 C++就压根不打算做这部分抽象工作,谁知道你想怎么样去调用底层部件。用 C++,你可以仅用轻量级线程去做网络编程,也可以用 IO 复用加系统线程去做网络编程。 C++是不假设你要干什么,它提供你自用,语言的作者本意就是不将个人的喜好强加于用户,喜欢面向对象的就去,喜欢元编程的就上。
因此我觉得这个也谈不上没做好,语言设计理念不一样。
sjtlqy
2016-04-29 17:02:16 +08:00
@neoblackcap 确实, rust 和 C++也很像, 只有一个 Core+Std 等。

毕竟是拿来干活的,就这样吧
Mirana
2016-04-29 17:57:06 +08:00
就算是写 c,也要把网络的各种具体操作抽象出来
xxxcat
2016-04-29 18:48:50 +08:00
我觉得应该是因为事件模型不同吧, unix 暴露的接口是面向 C 的,只能采用回调的形式,而 Golang 因为有 goroutine ,在编写同步形式的代码的同时还能获得异步的好处,也就没有必要再弄一套回调版的 API ,所以 Go 的 API 精简了很多。
vinceguo
2016-04-30 17:27:58 +08:00
看的是第几版?
sjtlqy
2016-04-30 18:50:26 +08:00
@vinceguo 第三版
yegle
2016-05-03 03:39:39 +08:00
Golang 不仅仅跑在 POSIX 系统里,所以不能直接把系统调用级别的细节暴露给语言?
hucsmn
2016-05-04 10:38:14 +08:00
golang 与 plan 9 的亲缘关系更近,和 *nix 的距离相对较远。例如 net.Dial 就是照着 plan 9 的 api 来做的, bufio 也是仿 的 plan 9 bio 库,还有 image/* 等等。所以, golang 和 *nix 的差异很大程度上体现的是 plan 9 与 *nix 的差异。 cat-v.org 上有很多关于 plan 9 的资料,感兴趣可以看看。
hucsmn
2016-05-04 10:51:14 +08:00
golang 标准库的功能划分有一些是仿照 plan 9 c 方言的标准库来的,去浏览一下 plan 9 的 man pages 就明白了。
还有就是, golang 是一门新语言,又是 gc 又是 interface 又是 goroutine 的,也实在没必要和 *nix api / c 那套保持一致。
reus
2016-05-09 15:52:52 +08:00
跨 os 当然要这样设计。
特定系统的系统调用,用这个 https://godoc.org/golang.org/x/sys
sjtlqy
2016-05-09 22:09:06 +08:00
@reus 多谢,以前没看到,还需要好好看文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/275292

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX