首頁  >  文章  >  後端開發  >  go語言編譯快嗎

go語言編譯快嗎

青灯夜游
青灯夜游原創
2021-06-07 14:00:083169瀏覽

go語言編譯速度快,原因:1.使用了import的引用管理方式;2、沒有模板的編譯負擔;3、1.5版本後的自舉編譯器優化;4、更少的關鍵字,Go語言中的關鍵字一共有25個,可以簡化在編譯過程中的程式碼解析。

go語言編譯快嗎

本教學操作環境:windows10系統、GO 1.11.2、Dell G3電腦。

現在Go的幾個主要特點,編譯速度、執行速度、記憶體管理以及並發程式設計。

Go的編譯為什麼快

當然,設計Go語言也不是完全從零開始,最初Go的團隊嘗試設計實現一個Go語言的編譯前端,由基於C的gcc編譯器來編譯成機器碼,這個面向gcc的前端編譯器也就是目前的Go編譯器之一的gccgo。

與其說Go的編譯為什麼快,不如先說C 的編譯為什麼慢,C 也可以用gcc編譯,編譯速度的大部分差異很有可能來自語言設計本身。

在討論問題之前,其中需要先說明的一點是:這裡比較的編譯速度都是在靜態編譯下的。

靜態編譯和動態編譯的差異

靜態編譯:編譯器在編譯執行檔時,要把使用到的連結函式庫提取出來,連結打包進可執行檔中,編譯結果只有一個可執行檔。
動態編譯:可執行檔需要附帶獨立的函式庫文件,不打包庫到執行檔中,減少可執行檔體積,在執行的時候再呼叫函式庫即可。

兩種方式有各自的優點和缺點,前者不需要去管理不同版本庫的兼容性問題,後者可以減少記憶體和儲存的佔用(因為可以讓不同程式共享同一個函式庫),兩種方式孰優孰弱,要對應到具體的工程問題上,Go預設的編譯方式是靜態編譯。

回到我們要討論的問題:C 的編譯為什麼慢?

C 編譯慢的主要兩個大頭原因:

1、頭檔的include方式 

2、模板的編譯

C 使用include方式引用頭文件,會讓需要編譯的程式碼有乘數級的增加,例如當同一個頭檔被同一個專案下的N個檔include時,編譯器會將頭檔引入到每一份程式碼中,所以同一個頭檔會被編譯N次(這在大多數時候都是不必要的);

C 使用的模板是為了支援泛型編程,在編寫對不同類型的泛型函數時,可以提供很大的便利,但是這對於編譯器來說,會增加非常多不必要的編譯負擔。

當然C 對這兩個問題有很多後續的最佳化方法,但這對於許多開發者來說,他們不想在這上面有太多時間和精力開銷。

大部分後來的程式語言在引入檔案的方式上,使用了import module來取代include
頭檔的方式,import解決了重複編譯的問題,當然Go也是使用的import方式;在模板的編譯問題上,由於Go在設計理念上遵循從簡入手,所以沒有將泛函編程納入到設計框架中,所以天生的沒有模版編譯帶來的時間開銷(沒有泛型支持也是很多人不滿Go語言的理由)。

所以在我看來,Go編譯速度快,主要有四個原因:

1、使用了import的引用管理方式; 

#2、沒有模板的編譯負擔; 

3、1.5版本後的自舉編譯器最佳化; 

4、更少的關鍵字。

Go語言中的關鍵字總共有25 個:

elsefallthrough
break default  #func interface select
case #defer go map
# #struct chan
goto package switch const
if######range######type###########continue#### ###for######import######return######var#############

之所以刻意地將Go語言中的關鍵字保持的這麼少,是為了簡化在編譯過程中的程式碼解析。和其它語言一樣,關鍵字不能夠作標識符使用。

所以為了加快編譯速度、放棄C 而轉入Go的同時,也要考慮一下是否要 放棄泛型程式設計的優點。

註:泛型可能在Go 2版本獲得支援。

note:
Go雖然還無法達到C 那樣的極致性能,但是在大部分情況下已經很接近了;
Go和Java在演算法的時間開銷上難分伯仲,但在記憶體的開銷上Java就要高得多了;
Go在上述的絕大部分情況下,至少時間和記憶體開銷都比Python優秀得多;

推薦學習:Golang教學

以上是go語言編譯快嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn