<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 2.2 Go 程序編譯流程 ## 2.2.1 第一階段:詞法和語法分析 * `cmd/compile/internal/syntax`(詞法分析器,解析器,語法樹) 在編譯的第一階段,源代碼被 token 化(詞法分析),解析(語法分析),并為每個源構造語法樹文件。每個語法樹都是相應源文件的精確表示對應于源的各種元素的節點,如表達式,聲明和陳述。語法樹還包括位置信息用于錯誤報告和調試信息的創建。 ~~~ main -> gc.Main -> amd64.Init -> amd64.LinkArch.Init -> typecheck -> typecheck -> saveerrors -> typecheckslice -> checkreturn -> checkMapKeys -> capturevars -> typecheckinl -> inlcalls -> escapes -> newNowritebarrierrecChecker -> transformclosure ~~~ ## 2.2.2 第二階段:語義分析 * `cmd/compile/internal/gc`(類型檢查,AST變換) 對 AST 進行類型檢查。第一步是名稱解析和類型推斷,它們確定哪個對象屬于哪個標識符,以及每個表達式具有的類型。類型檢查包括某些額外的檢查,例如 “聲明和未使用” 以及確定函數是否終止。 在 AST 上也進行了某些轉換。一些節點基于類型信息被細化,例如從算術加法節點類型分割的字符串添加。其他一些例子是死代碼消除,函數調用內聯和轉義分析。 語義分析的過程中包含幾個重要的操作:逃逸分析、變量捕獲、函數內聯、閉包處理。 ## 2.2.3 第三階段:SSA 生成 * `cmd/compile/internal/gc`(轉換為SSA) * `cmd/compile/internal/ssa`(SSA 傳遞與規則) 在此階段,AST將轉換為靜態單一分配(SSA)形式,這是一種具有特定屬性的低級中間表示,可以更輕松地實現優化并最終從中生成機器代碼。 在此轉換期間,將應用函數內在函數。 這些是特殊功能,編譯器已經教導它們根據具體情況用大量優化的代碼替換。 在AST到SSA轉換期間,某些節點也被降級為更簡單的組件,因此編譯器的其余部分可以使用它們。 例如,內置復制替換為內存移動,并且范圍循環被重寫為for循環。 其中一些目前發生在轉換為SSA之前,由于歷史原因,但長期計劃是將所有這些都移到這里。 然后,應用一系列與機器無關的傳遞和規則。 這些不涉及任何單個計算機體系結構,因此可以在所有`GOARCH`?變體上運行。 這些通用過程的一些示例包括消除死代碼,刪除不需要的零檢查以及刪除未使用的分支。通用重寫規則主要涉及表達式,例如用常量值替換某些表達式,以及優化乘法和浮點運算。 ~~~ initssaconfig -> peekitabs -> funccompile -> finit -> compileFunctions -> compileSSA -> buildssa -> genssa -> -> typecheck -> checkMapKeys -> dumpdata -> dumpobj ~~~ ## 2.2.4 第四階段:機器碼生成 * `cmd/compile/internal/ssa`(底層SSA和架構特定的傳遞) * `cmd/internal/obj`(生成機器碼) 編譯器的機器相關階段以“底層”傳遞開始,該傳遞將通用值重寫為其機器特定的變體。例如,在 amd64 存儲器操作數上是可能的,因此可以組合許多加載存儲操作。 請注意,較低的通道運行所有特定于機器的重寫規則,因此它當前也應用了大量優化。 一旦SSA“降低”并且更加特定于目標體系結構,就會運行最終的代碼優化過程。這包括另一個死代碼消除傳遞,移動值更接近它們的使用,刪除從未讀取的局部變量,以及寄存器分配。 作為此步驟的一部分完成的其他重要工作包括堆棧框架布局,它將堆棧偏移分配給局部變量,以及指針活動分析,它計算每個 GC 安全點上的堆棧指針。 在SSA生成階段結束時,Go 函數已轉換為一系列`obj.Prog`?指令。它們會被傳遞給裝載器(`cmd/internal/obj`),將它們轉換為機器代碼并寫出最終的目標文件。目標文件還將包含反射數據,導出數據和調試信息。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看