banner
SlhwSR

SlhwSR

热爱技术的一名全栈开发者
github
bilibili

平台與架構

2.1 平台與架構#

Go 語言開發團隊開發了適用於以下操作系統的編譯器:

  • Linux
  • FreeBSD
  • Mac OS X(也稱為 Darwin)

目前有 2 個版本的編譯器:Go 原生編譯器 gc 和非原生編譯器 gccgo,這兩款編譯器都是在類 Unix 系統下工作 。其中,gc 版本的編譯器已經被移植到 Windows 平台上,並集成在主要發行版中,你也可以通過安裝 MinGW 從而在 Windows 平台下使用 gcc 編譯器。這兩個編譯器都是以單通道的形式工作。

你可以獲取以下平台上的 Go 1.4 源碼和二進制文件:

  • Linux 2.6+:amd64、386 和 arm 架構
  • Mac OS X (Snow Leopard + Lion) :amd64 和 386 架構
  • Windows 2000+:amd64 和 386 架構

對於非常底層的純 Go 語言代碼或者包而言,在各個操作系統平台上的可移植性是非常強的,只需要將源碼拷貝到相應平台上進行編譯即可,或者可以使用交叉編譯來構建目標平台的應用程序。但如果你打算使用 cgo 或者類似文件監控系統的軟件,就需要根據實際情況進行相應地修改了。

  1. Go 原生編譯器 gc:

    主要基於 Ken Thompson 先前在 Plan 9 操作系統上使用的 C 工具鏈。

    Go 語言的編譯器和鏈接器都是使用 C 語言編寫並產生本地代碼,Go 不存在自我引導之類的功能。因此如果使用一個有不同指令集的編譯器來構建 Go 程序,就需要針對操作系統和處理器架構(32 位操作系統或 64 位操作系統)進行區別對待。( 譯者註:Go 從 1.5 版本開始已經實現自舉。Go 語言的編譯器和鏈接器都是 Go 語言編寫的

    這款編譯器使用非分代、無壓縮和並行的方式進行編譯,它的編譯速度要比 gccgo 更快,產生更好的本地代碼,但編譯後的程序不能夠使用 gcc 進行鏈接。

    編譯器目前支持以下基於 Intel 或 AMD 處理器架構的程序構建。

    圖2.1 gc 編譯器支持的處理器架構

    當你第一次看到這套命名系統的時候你會覺得很奇葩,不過這些命名都是來自於 Plan 9 項目。

     g = 編譯器:將源代碼編譯為項目代碼(程式文本)
     l = 鏈接器:將項目代碼鏈接到可執行的二進制文件(機器代碼)
    

    (相關的 C 編譯器名稱為 6c、8c 和 5c,相關的彙編器名稱為 6a、8a 和 5a)

    標記 (Flags) 是指可以通過命令行設置可選參數來影響編譯器或鏈接器的構建過程或得到一個特殊的目標結果。

    可用的編譯器標記如下:

     flags:
     -I 針對包的目錄搜索
     -d 打印聲明信息
     -e 不限制錯誤打印的個數
     -f 打印堆疊結構
     -h 發生錯誤時進入恐慌(panic)狀態
     -o 指定輸出文件名 // 詳見第3.4節
     -S 打印產生的彙編代碼
     -V 打印編譯器版本 // 詳見第2.3節
     -u 禁止使用 unsafe 包中的代碼
     -w 打印歸類後的語法解析樹
     -x 打印 lex tokens
    

    從 Go 1.0.3 版本開始,不再使用 8g8l 之類的指令進行程序的構建,取而代之的是統一的 go buildgo install 等命令,而這些指令會自動調用相關的編譯器或鏈接器。

  2. gccgo 編譯器:

    一款相對於 gc 而言更加傳統的編譯器,使用 GCC 作為後端。GCC 是一款非常流行的 GNU 編譯器,它能夠構建基於眾多處理器架構的應用程序。編譯速度相對 gc 較慢,但產生的本地代碼運行要稍微快一點。它同時也提供一些與 C 語言之間的互操作性。

    從 Go 1 版本開始,gc 和 gccgo 在編譯方面都有等價的功能。

  3. 文件擴展名與包 (package):

    Go 語言源文件的擴展名很顯然就是 .go

    C 文件使用後綴名 .c,彙編文件使用後綴名 .s。所有的源代碼文件都是通過包 (packages) 來組織。包含可執行代碼的包文件在被壓縮後使用擴展名 .a(AR 文檔)。

    Go 語言的標準庫包文件在被安裝後就是使用這種格式的文件。

    注意 當你在創建目錄時,文件夾名稱永遠不應該包含空格,而應該使用下劃線 "_" 或者其它一般符號代替。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。