如何在golang中實(shí)現(xiàn)自舉-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元溪湖做網(wǎng)站,已為上家服務(wù),為溪湖各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

這篇文章運(yùn)用簡(jiǎn)單易懂的例子給大家介紹如何在golang中實(shí)現(xiàn)自舉,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

golang實(shí)現(xiàn)自舉的方法:首先安裝【Go 1.4】或更高版本;然后使用現(xiàn)有的Go工具鏈創(chuàng)建【Go 1.5】工具鏈的一個(gè)基本版本;最后進(jìn)一步用它構(gòu)建【go_bootstrap】和其余的標(biāo)準(zhǔn)庫(kù)和標(biāo)準(zhǔn)組件。

golang實(shí)現(xiàn)自舉的方法:

自舉(Bootstrapping) 是這樣的過(guò)程,“用要編譯的目標(biāo)編程語(yǔ)言編寫(xiě)其編譯器(或匯編器)”。一般而言,自舉有幾個(gè)優(yōu)勢(shì),比如:

  • 用于測(cè)試被自舉的語(yǔ)言;

  • 支持使用通常更為高級(jí)、提供更多高級(jí)抽象的語(yǔ)言來(lái)編寫(xiě)編譯器;

  • 編譯器也可以得益于語(yǔ)言層面的任何改進(jìn)。

如前所述,Google在一年前就開(kāi)始了從Go源碼樹(shù)中去除C代碼的努力,轉(zhuǎn)換計(jì)劃分為5個(gè)步驟:

  • 第1階段——開(kāi)發(fā)一個(gè)從C語(yǔ)言到Go語(yǔ)言的翻譯器,將現(xiàn)有的C編譯器翻譯成Go語(yǔ)言的。這一階段利用了一個(gè)事實(shí):原來(lái)的編譯器沒(méi)有大量使用一些很難移植到Go語(yǔ)言的特性,比如宏、聯(lián)合和指針運(yùn)算等。

  • 第2階段——轉(zhuǎn)換編譯器的源碼樹(shù),得到一個(gè)Go語(yǔ)言的編譯器,但是比較原始,而且是C風(fēng)格的。

  • 第3階段——將前面得到的編譯器轉(zhuǎn)換為符合Go語(yǔ)言習(xí)慣的程序,主要通過(guò)識(shí)別包,添加文檔和單元測(cè)試實(shí)現(xiàn)。

  • 第4階段——優(yōu)化編譯器,解決編譯器和CPU的內(nèi)存使用問(wèn)題,可能引入并行化。此外,嘗試在今天使用的不依賴架構(gòu)的無(wú)序樹(shù)(Node*s)和依賴架構(gòu)的有序列表(Prog*s)之間引入一個(gè)新的中間表示,目的是改進(jìn)編譯器在消除冗余的nil檢查和邊界檢查等情況下的優(yōu)化能力。

  • 第5階段——用最新版的go/parser和go/types替換前端。

Russ提到,他們還考慮了一些替代方案,不過(guò)基于各種因素都排除了,在一年前的這份文檔中都有描述。

Go的自舉

編譯器的自舉通常會(huì)引發(fā)“先有雞還是先有蛋”的問(wèn)題,必須提供一種方式來(lái)編譯我們要?jiǎng)?chuàng)建的語(yǔ)言。

Go的情況是,要構(gòu)建Go 1.5,必須先安裝Go 1.4或更高版本,然后使用現(xiàn)有的Go工具鏈創(chuàng)建Go 1.5工具鏈的一個(gè)基本版本。一旦有了(Go 1.4)編譯的Go 1.5工具鏈,就可以再用它來(lái)構(gòu)建自身了,可以進(jìn)一步用它構(gòu)建go_bootstrap和其余的標(biāo)準(zhǔn)庫(kù)和標(biāo)準(zhǔn)組件。這個(gè)過(guò)程加入了一個(gè)中間步驟——生成的工具鏈再被用于構(gòu)建其自身,它可以應(yīng)用于未來(lái)的任何Go版本。

為進(jìn)一步了解Go實(shí)現(xiàn)自舉的計(jì)劃,InfoQ采訪了Russ。

實(shí)現(xiàn)自舉看上去是Go語(yǔ)言的一個(gè)很大的里程碑。在語(yǔ)言的演進(jìn)過(guò)程中,為什么決定在這個(gè)階段做這個(gè)事情呢,可以詳細(xì)介紹一下嗎?

Go是一門不錯(cuò)的通用語(yǔ)言,但在設(shè)計(jì)時(shí)考慮的適用場(chǎng)合是編寫(xiě)大規(guī)模、高并發(fā)的服務(wù)端軟件,就像運(yùn)行在Google的服務(wù)器上的那些。如果更早實(shí)現(xiàn)自舉,Go編譯器就是第一個(gè)大型的Go語(yǔ)言程序,這對(duì)語(yǔ)言設(shè)計(jì)存在不利影響,會(huì)讓我們遠(yuǎn)離真正的目標(biāo)。

沒(méi)有更早實(shí)現(xiàn)自舉,還有一些技術(shù)原因,比如可移植性,從源代碼編譯比自舉更容易,而且我們也能盡早有一個(gè)穩(wěn)定的編譯器實(shí)現(xiàn)。

使用Go來(lái)構(gòu)建Go,與使用C相比,你認(rèn)為對(duì)哪些具體領(lǐng)域有較為明顯的改進(jìn)?

Ken Thompson曾經(jīng)對(duì)我說(shuō),用Go編寫(xiě)程序感覺(jué)比用C更簡(jiǎn)單。一個(gè)原因是,Go消除了好幾類常見(jiàn)的C bug,比如懸掛指針、內(nèi)存泄漏、緩沖區(qū)溢出、深度遞歸時(shí)的棧溢出、誤用void*和意外的數(shù)值轉(zhuǎn)換等。

與任何標(biāo)準(zhǔn)的C工具鏈相比,標(biāo)準(zhǔn)的Go工具鏈對(duì)模塊化、單元測(cè)試和性能分析支持更好,不過(guò)讓我最興奮的是在修改內(nèi)部API或重構(gòu)時(shí),應(yīng)用自動(dòng)化程序重寫(xiě)(如gofix)的前景。

在“Go 1.3+ Compiler Overhaul”這篇文檔中,你描述了分5個(gè)步驟將現(xiàn)有的編譯器從C遷移到Go的過(guò)程。請(qǐng)問(wèn)到目前為止,已經(jīng)完成了哪些步驟了?其余步驟打算何時(shí)完成?

對(duì)Go項(xiàng)目而言,將語(yǔ)言的運(yùn)行時(shí)從C轉(zhuǎn)換到Go更為重要,所以我們先做了這個(gè)。現(xiàn)在我們正回到編譯器。

從文檔角度看,我們目前處于第2階段。翻譯器已經(jīng)完成,而且?guī)椭覀冝D(zhuǎn)換了運(yùn)行時(shí)。我們正在將其應(yīng)用于編譯器。我們希望完成Go 1.5編譯器的轉(zhuǎn)換。清理工作會(huì)在Go 1.5之后的項(xiàng)目中進(jìn)行。

關(guān)于如何在golang中實(shí)現(xiàn)自舉就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章名稱:如何在golang中實(shí)現(xiàn)自舉-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://muchs.cn/article18/cdshdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、ChatGPT、網(wǎng)站內(nèi)鏈、Google、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)