【问题标题】:why golang chose syscall rather than libc [closed]为什么 golang 选择 syscall 而不是 libc [关闭]
【发布时间】:2018-03-21 07:43:44
【问题描述】:

Go 将所有 syscall-s 包装在包 syscall 中,就像我理解正确时 libc 所做的一样。

我研究了几种语言,

  • Haskell,在编译器中使用 libc,库通常也使用它,尽管有一些库为用户包装系统调用。

  • Java 和几乎所有 JVM 语言都选择 libc。

脚本语言就不用说了,比如lua、ruby或python,它们需要可移植,所以需要libc作为POSIX的实现。

最近没用rust,不过也有人说rust也是用libc的。

那么,为什么 golang 决定首先实现一个 syscall 包。它不可移植,移植到每个内核甚至同一内核的每个主要版本都需要花费更多的人。

【问题讨论】:

  • 这只是一个猜测,但golang的一大卖点是它可以轻松进行静态构建,并且可以构建不依赖libc的执行二进制文件,所以他们可能决定不依赖libc。
  • 除了易于进行静态构建之外,还有一点是 Go 使用不同的调用约定,与 C 不兼容。直接实现系统调用可以节省大量开销。
  • 这是 Go 团队的问题,而不是 StackOverflow。试试 Go 邮件列表。

标签: go system-calls libc


【解决方案1】:

因为 Go 在 Go 运行时管理的 goroutine 中管理其进程,该运行时是用 C 编写的,并在链接阶段静态链接到已编译的用户代码。由于 go 使用自己的运行时管理其系统调用,而不是直接在操作系统中,这就是它实现自己的系统调用包的原因。

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2010-12-17
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2023-01-13
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多