golang需要依賴作業系統嗎?底層呼叫了庫的api嗎?

時間 2021-05-06 17:28:44

1樓:

依賴底層作業系統。

比如golang runtime層的netpoller利用了OS提供的非阻塞IO訪問模式,並配合epll/kqueue等IO事件監控機制,為彌合OS的非同步機制與Golang介面的差異,而在runtime上做的一層封裝。以此來實現網路IO優化。

2樓:

一方面肯定需要依賴作業系統。

有syscall 的包來完成系統呼叫。

另一方面。go可以被裸機執行。這時候之後的事情是可以說他不依賴作業系統。但這之前他一定是在某個作業系統上被交叉編譯成二進位制可執行檔案的。

3樓:剻恩

Emmm

程式語言基本都依賴作業系統

不過go也是有不同系統的安裝版本,但是可以交叉編譯要說呼叫api,go是編譯成二進位制執行的,系統呼叫肯定有,可以說是呼叫了作業系統的api吧

4樓:韓樸宇

無論是否使用cgo, go語言的原始碼都是由go編譯器自己直接編譯到機器碼的。

> ls /usr/lib/go/pkg/tool/linux_amd64/

addr2line api asm buildid cgo compile cover dist doc fix link nm objdump oldlink pack pprof test2json trace vet

go有自己的聯結器和彙編器,彙編語法用的是plan 9的彙編(因為開發go的那幫人就是之前開發plan 9系統的)

Linux 上CGO=0直接呼叫syscall, 因為Linux核心的syscall的介面是穩定的,而且有詳細的文件和原始碼描述了syscall的作用。使用了cgo就會鏈結到libc。

使用file可以看乙個檔案是不是靜態鏈結的,如果是靜態鏈結的,大概率沒有使用cgo.

> file /usr/lib/go/bin/gofmt

/usr/lib/go/bin/gofmt: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=7CNMUy5mt536qu9YRy6P/7Frsz27gZ2vNGF0UDT5K/-A0KysgXH51w2QhNF0CJ/np15rFrPY-jUKUXGqAas, not stripped

> file /usr/lib/go/bin/go

/usr/lib/go/bin/go: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.

1, Go BuildID=hzq3ywu7Vz9lE7wfr3Ir/oJO_d3mxhOdJI_d4t7Wi/9_PaQ_NYnSFzwQSJLlht/x6yO94PaewRCgn55gRae, not stripped

macOS是閉源系統,syscall及內部細節經常變動,所有軟體(包括go語言寫的)必須鏈結到/usr/lib/libSystem.B.dylib以及其他framework.

Windows是閉源系統,雖然比較注重二進位制相容性,且Windows的系統呼叫雖然經過人們對ntoskrnl.exe和win32k.sys的逆向都了解其引數和作用,但是Windows各個版本的系統呼叫號是不固定的(具體資料詳見 j00ru/windows-syscalls ),因此無法直接發起系統呼叫(因為無法在執行前確定系統版本)。

除了驅動和病毒之外的Windows程式都使用介面穩定的kernel32.dll 等win32 api

所以:golang需要依賴作業系統。(拿go寫作業系統除外)

除cgo=0+Linux平台之外,go編譯的程式需要呼叫系統庫的api

5樓:Tony Bai

go無論是自身編譯器還是編譯出的應用程式都是要執行在某個os之上的,因此肯定要依賴os;

go編譯出的應用程式底層是否呼叫了庫api(我理解你說的是libc的api或類libc的執行時api)這個要視平台和編譯型別而定。在一些平台(如macos、openbsd)上,以前的go還是可以做純靜態編譯的,即編譯出的go應用可以不依賴os的執行時api,而是直接進行系統呼叫;但是隨著這些os(mac, openbsd)新版本的要求(安全性、相容性),go不得不呼叫這些os提供的執行時api,即必須依賴執行時api才能執行;但是在go應用主要執行的linux os上,go既可以實現靜態編譯(不依賴執行時api),亦可以動態編譯(即依賴os的執行時api)。

6樓:PJXRocks

需要。編譯器本身不就是在作業系統上執行的嗎。你寫golang難道不是在作業系統上寫的?總不會是通過乙個開關把0和1組成的.go寫入機器吧?

但Golang是一門跨平台的程式語言,機器不相關的部分在什麼作業系統上寫和執行都一樣。

不單是Go語言,其他的程式語言(至少我所聽過的都是),沒有乙個完全不依賴作業系統的,就算是組合語言,也是在作業系統上寫好,進行彙編(和鏈結)的。

作業系統排程如何實現?

the gc 系統裡的程序可以理解為乙個鍊錶,每個節點都儲存了對應程序的資訊,然後定時器會定時觸發中斷,中斷處理程式會判斷當前程序的時間片是否用完,是否處於就緒狀態等等,然後找到乙個可執行的程序,切換上下文。細節挺多的。 用心閣 一般來說,多工有搶占式多工和協作式多工。前者就是到了乙個時間片,作業系...

哪種作業系統可以相容另乙個作業系統的應用,但又不 基於 它?

linux,macos通過wine專案,不基於windows,相容exe。黑莓系統,曾經相容過安卓。好像諾基亞也相容過安卓。windows有個專案要相容安卓。windows 的wsl2 桃花島主 FreeBSD啊,可以通過Linux相容層跑Linux應用 不需要重新編譯 也可以直接載入Windows...

為什麼要學作業系統?

JavaGuide 作業系統中的很多思想 很多經典的演算法,你都可以在我們日常開發使用的各種工具或者框架中找到它們的影子。比如說我們開發的系統使用的快取 比如 Redis 和作業系統的快取記憶體就很像。CPU 中的快取記憶體有很多種,不過大部分都是為了解決CPU處理速度和記憶體處理速度不對等的問題。...