最近在看 APUE,发现 UnixManual 和 Posix 的 API 设计与 Golang 差距好大,为什么 Golang 要这么设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
这是一个创建于 3531 天前的主题,其中的信息可能已经有所发展或是发生改变。

主要是有几点:

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

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

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

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

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

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

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

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

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

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

毕竟是拿来干活的,就这样吧
Mirana
    6/div>
Mirana  
   2016-04-29 17:57:06 +08:00
就算是写 c,也要把网络的各种具体操作抽象出来
xxxcat
    7
xxxcat  
   2016-04-29 18:48:50 +08:00
我觉得应该是因为事件模型不同吧, unix 暴露的接口是面向 C 的,只能采用回调的形式,而 Golang 因为有 goroutine ,在编写同步形式的代码的同时还能获得异步的好处,也就没有必要再弄一套回调版的 API ,所以 Go 的 API 精简了很多。
vinceguo
    8
vinceguo  
   2016-04-30 17:27:58 +08:00 via Android
看的是第几版?
sjtlqy
    9
sjtlqy  
OP
   2016-04-30 18:50:26 +08:00
@vinceguo 第三版
yegle
    10
yegle  
   2016-05-03 03:39:39 +08:00
Golang 不仅仅跑在 POSIX 系统里,所以不能直接把系统调用级别的细节暴露给语言?
hucsmn
    11
hucsmn  
   2016-05-04 10:38:14 +08:00   1
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
    12
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
    13
reus  
   2016-05-09 15:52:52 +08:00
跨 os 当然要这样设计。
特定系统的系统调用,用这个 https://godoc.org/golang.org/x/sys
sjtlqy
    14
sjtlqy  
OP
   2016-05-09 22:09:06 +08:00
@reus 多谢,以前没看到,还需要好好看文档
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3295 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 26ms UTC 11:02 PVG 19:02 LAX 03:02 JFK 06:02
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86