半空:LLM 輔助的 Go2Rust 項(xiàng)目遷移
背景
當(dāng) Rust 語言為我們展示出在「性能」、「安全」、「協(xié)作」等方面誘人的特性之后,卻因?yàn)槠涠盖偷膶W(xué)習(xí)/上手曲線拒人千里之外。是否存在一種科技,能夠幫助我們的同學(xué)在語言學(xué)習(xí)和項(xiàng)目遷移上完美并行,最終真正將 Rust 項(xiàng)目遷移這個(gè)看似美好的荊棘之果轉(zhuǎn)變?yōu)橛|手可得的「低垂果實(shí)」呢?
為了將美好的愿望轉(zhuǎn)變?yōu)閷?shí)際,我們結(jié)合 LLMs 做了一些嘗試,利用 LLMs 在編程語言上體現(xiàn)出的「涌現(xiàn)」能力,設(shè)計(jì)了一套基于 LLMs 的應(yīng)用開發(fā)基座(ABCoder),在這個(gè)基座之上進(jìn)一步演進(jìn)出了我們本篇的主角:「半空」。
ABCoder 是字節(jié)內(nèi)部一個(gè)編程向 LLMs 應(yīng)用開發(fā)基座,包含自研的 LLMs 原生解析器、工具(Tools)以及工作流(Workflows),對(duì)編程項(xiàng)目本身進(jìn)行深度解析、理解和壓縮,并將其制作為源碼知識(shí)庫(Source code as Knowledge),之后利用這類知識(shí)庫實(shí)現(xiàn)對(duì) LLMs 推理過程中所需上下文進(jìn)行補(bǔ)齊,從而構(gòu)建出高質(zhì)量、低幻覺、穩(wěn)定的編程類 LLMs 應(yīng)用。有關(guān) ABCoder 更多的介紹可以參考這里。
半空
按照 ABCoder 的設(shè)想,讓 LLMs 理解編程項(xiàng)目的入口就是結(jié)合對(duì)項(xiàng)目的解析、理解、壓縮后的知識(shí)關(guān)聯(lián)和構(gòu)建,這對(duì)于一個(gè)輕量化的應(yīng)用來說可能足夠(ABCoder 當(dāng)前已經(jīng)能夠?qū)崿F(xiàn)將一個(gè)標(biāo)準(zhǔn) Hertz 項(xiàng)目“轉(zhuǎn)述”為一個(gè) Volo-HTTP 項(xiàng)目),但對(duì)應(yīng)到實(shí)際場(chǎng)景中的業(yè)務(wù)項(xiàng)目來說(增加大量業(yè)務(wù)屬性且復(fù)雜度更高),要想真正讓 LLMs 完整理解整個(gè)項(xiàng)目,并且在有需要的時(shí)候讓 LLMs 完整的將整個(gè)項(xiàng)目“轉(zhuǎn)述”為另外一個(gè)語言的項(xiàng)目時(shí)我們就需要對(duì)我們的解析、理解、壓縮、應(yīng)用流程進(jìn)行更加細(xì)粒度的設(shè)計(jì)和優(yōu)化了。
「半空」主要討論的就是對(duì)于復(fù)雜項(xiàng)目的理解提升和輔助 LLMs 漸進(jìn)式多輪迭代構(gòu)建出一個(gè)復(fù)雜項(xiàng)目的可行性。核心需要解決的是因?yàn)轫?xiàng)目規(guī)模提升所帶來的復(fù)雜度以及上下文規(guī)模提升和 ABCoder 所制作的對(duì)應(yīng)知識(shí)庫知識(shí)密度跟不上的矛盾。
內(nèi)核簡(jiǎn)述
羅馬不是一日建成的,參考軟件工程標(biāo)準(zhǔn)的項(xiàng)目迭代方式,迭代一個(gè)越龐大的項(xiàng)目,引入的標(biāo)準(zhǔn)作業(yè)流程和所花費(fèi)的迭代周期和人力就越多。ABCoder 要想深刻的解析并理解一個(gè)大型項(xiàng)目,一口永遠(yuǎn)吃不成一個(gè)胖子。
好消息是構(gòu)建一個(gè)復(fù)雜項(xiàng)目的過程是有跡可循的的,ABCoder 需要做的其實(shí)就是逆著項(xiàng)目構(gòu)建的路徑,反向解析出項(xiàng)目構(gòu)建過程中涉及到的不同粒度的知識(shí)庫。
之后將這些知識(shí)庫輸入 LLMs 驅(qū)動(dòng)的 Workflows,通過構(gòu)建漸進(jìn)式的多輪迭代流,將原來的項(xiàng)目以任意編程語言又輸出出來,基于對(duì)知識(shí)庫的持續(xù)構(gòu)建,甚至實(shí)現(xiàn)為其他語言的項(xiàng)目:語言翻譯。
意譯 or 直譯?
相較于給 LLMs 一段代碼,讓他直接翻譯為另外一個(gè)語言(直譯),「半空」所做的類比下來更像是:幫助 LLMs 理解代碼,之后經(jīng)過抽象和設(shè)計(jì)結(jié)合我們希望它采納的知識(shí),重寫出另外一個(gè)語言實(shí)現(xiàn)的版本(意譯)。
理解和設(shè)計(jì)
按照 ABCoder 的通用處理流,一個(gè)任意龐大的項(xiàng)目我們幾乎都可以通過解析、級(jí)聯(lián)壓縮的方式構(gòu)建函數(shù)、方法、結(jié)構(gòu)體、變量的語義化映射。但僅僅通過這些散落的信息 LLMs 是沒有辦法高效的建立一個(gè)對(duì)這個(gè)項(xiàng)目系統(tǒng)深刻的理解。因此我們?cè)谧?LLMs 輔助的項(xiàng)目文檔梳理應(yīng)用的時(shí)候,就已經(jīng)開始下意識(shí)的做一些單元聚合工作了:通過將某個(gè)包(文件/模塊)中的函數(shù)、方法、結(jié)構(gòu)體、變量語義化含義進(jìn)一步抽象,得到關(guān)于這個(gè)包(文件/模塊)的語言和框架無關(guān)的高層次語義化抽象,按照這個(gè)思路,我們可以自底向上抽象,到最終項(xiàng)目維度。
舉個(gè)直觀的例子,對(duì)于 Hertz 的項(xiàng)目,任意一個(gè) Hertz 項(xiàng)目在項(xiàng)目維度都能夠抽象為形如:這個(gè)項(xiàng)目是一個(gè)基于 HTTP 應(yīng)用框架的應(yīng)用,它或許注冊(cè)了/a/b/c 路由 (Route)的 GET 方法(Method),關(guān)聯(lián)了某個(gè)對(duì)應(yīng)的邏輯(Handler) 。
仔細(xì)分析這個(gè)抽象,嘗試對(duì)其中蘊(yùn)含的細(xì)節(jié)進(jìn)行總結(jié):
- 一個(gè)基于 Hertz 的 Golang 項(xiàng)目,在經(jīng)過某個(gè)維度的抽象之后,丟掉了大量細(xì)節(jié),留下了一些在當(dāng)前維度的關(guān)鍵信息。在上述例子中,我們得到的抽象已經(jīng)不關(guān)心這個(gè)項(xiàng)目具體采用的語言實(shí)現(xiàn)和具體涉及到的應(yīng)用框架了,僅僅需要關(guān)注的是 HTTP 框架應(yīng)用以及 HTTP 應(yīng)用必備的信息:注冊(cè)了某個(gè)路由,處理了某個(gè)業(yè)務(wù)邏輯。
- 通過這層抽象,我們可以將任意一個(gè)復(fù)雜項(xiàng)目映射出了一個(gè)最簡(jiǎn)單的迭代入口:?jiǎn)?dòng)一個(gè) HTTP 應(yīng)用框架,并注冊(cè)處理某個(gè) URL 的某個(gè)邏輯函數(shù)。
- 對(duì)整個(gè)復(fù)雜項(xiàng)目的理解過程被我們巧妙的轉(zhuǎn)換為對(duì)一個(gè)項(xiàng)目自底向上的逐層抽象的過程,如果我們能將這個(gè)抽象過程做的足夠清晰和準(zhǔn)確,對(duì)于一個(gè)完成抽象的項(xiàng)目來說,我們反過來也得到了一個(gè)支持我們至頂向下層層細(xì)化的項(xiàng)目構(gòu)建流。
- 理論上通過增加、減少、優(yōu)化各層級(jí)抽象,我們就能不斷提升對(duì)這個(gè)項(xiàng)目深度理解的效果。
多輪的抽象和迭代的本質(zhì)是項(xiàng)目在不同維度上多語言實(shí)現(xiàn)和 ABCoder 抽象語義的不斷對(duì)齊:
配合語言對(duì)應(yīng)的知識(shí)庫建設(shè),按照標(biāo)準(zhǔn)抽象塊(已歸一化邏輯)進(jìn)行知識(shí)檢索,分層分模塊持續(xù)迭代,填充核心邏輯,輔助業(yè)務(wù)完成項(xiàng)目構(gòu)建。
實(shí)施和測(cè)試
當(dāng)我們通過上述解析和抽象,得到了關(guān)于一個(gè)項(xiàng)目完整的理解知識(shí),之后就可以至頂向下輔助 LLMs 逐層實(shí)現(xiàn)項(xiàng)目的漸進(jìn)式迭代了。同樣,接著上一小結(jié)里提到例子來說,我們?cè)谶@層抽象上做的事情就是:
- 根據(jù)「HTTP 應(yīng)用框架」匹配目標(biāo)語言對(duì)應(yīng)的知識(shí),比如檢索出 Volo-HTTP 庫的知識(shí)(如果我們的目標(biāo)是將這個(gè)應(yīng)用實(shí)現(xiàn)為一個(gè) Rust 項(xiàng)目),之后結(jié)合 Volo-HTTP 提供的框架初始化邏輯,拉起一個(gè) Volo-HTTP 的項(xiàng)目
- 之后按照本層抽象剩下的描述信息,完成「/a/b/c路由和對(duì)應(yīng)處理函數(shù)」的注冊(cè)
- 由于本層抽象并不具備這個(gè)處理函數(shù)的詳細(xì)描述信息,因此僅僅需要生成一個(gè)空實(shí)現(xiàn)的樁函數(shù)即可
- 之后我們所做的所有變成,二次確認(rèn)完成了具體實(shí)現(xiàn)和對(duì)應(yīng)語義化抽象的對(duì)齊
以上即是對(duì)一輪迭代核心流程的描述,完成本輪迭代之后即可開啟下一層抽象的對(duì)齊。之后按照這個(gè)流程持續(xù)的迭代這個(gè)項(xiàng)目。
因?yàn)槌橄蟊旧頃?huì)丟掉本層部分細(xì)節(jié),而丟掉的這部分細(xì)節(jié)其實(shí)還是保留在抽象前的層級(jí)中的,對(duì)應(yīng)迭代路徑來說,上一層丟掉的細(xì)節(jié)一定會(huì)在下一層迭代中被補(bǔ)充回來。因此,通過多輪的迭代構(gòu)建出來的項(xiàng)目,理論上也并不會(huì)丟失具體的實(shí)現(xiàn)細(xì)節(jié)。
每一層迭代后都會(huì)有一次人工介入時(shí)機(jī) —— 即可以及時(shí)人工介入修改代碼并反饋到后續(xù)的翻譯輪次中,這也是「半空」的核心能力之一 —— 在這個(gè)切面上能夠按需的擴(kuò)展任意的軟件測(cè)試解決方案,包括時(shí)下流行的:LLMs 輔助 UT 生成等技術(shù)。等到所有的修改和測(cè)試通過之后,即可開啟下一層的迭代或者選擇直接退出手動(dòng)接管剩余的翻譯工作。
交付內(nèi)容
作為用戶最為關(guān)心的部分,「半空」究竟在項(xiàng)目 Go2Rust 轉(zhuǎn)換(存量 Golang 項(xiàng)目改寫為 Rust)上幫助我們做到哪些事情呢?其實(shí)非常簡(jiǎn)單,好比將大象裝進(jìn)冰箱,「半空」輔助下的 Go2Rust 自動(dòng)化遷移也是三個(gè)核心步驟:
- 打開冰箱門:基于 ABCoder 對(duì)存量 Go 項(xiàng)目完成系統(tǒng)解析,產(chǎn)出函數(shù)粒度的項(xiàng)目理解原料
- 把大象放進(jìn)去:基于項(xiàng)目理解原料產(chǎn)出將該項(xiàng)目改寫為Rust 對(duì)應(yīng)的項(xiàng)目設(shè)計(jì)文檔
- 關(guān)上冰箱門:基于設(shè)計(jì)文檔中指引的迭代順序,全自動(dòng)可控地,產(chǎn)出各層迭代代碼
實(shí)際上,結(jié)合簡(jiǎn)介中的描述,聰明的小伙伴也許已經(jīng)發(fā)現(xiàn):「半空」作為一套通用框架,應(yīng)用面其實(shí)并不僅僅局限在 Go2Rust 上,對(duì)于任意語言之間的相互轉(zhuǎn)換邏輯上都是完全一致的,區(qū)別在于對(duì)語言特異性處理和特定語言的知識(shí)庫構(gòu)建?!赴肟铡挂黄谥攸c(diǎn)針對(duì) Go2Rust 場(chǎng)景完成內(nèi)場(chǎng)的適配和持續(xù)打磨,后續(xù)如果有對(duì)更多語言棧(Python2Go/Java2Go/...)的切換訴求也非常歡迎勾搭~
項(xiàng)目實(shí)戰(zhàn)舉例
一個(gè)使用「半空」做 Go2Rust 項(xiàng)目轉(zhuǎn)換的示例
項(xiàng)目介紹
Easy_note 是 CloudWeGo 社區(qū)對(duì)外提供的一個(gè)基于 Hertz 和 KiteX 的實(shí)現(xiàn)復(fù)雜、功能覆蓋度高的業(yè)務(wù)實(shí)戰(zhàn)示例項(xiàng)目;其使用 Hertz 提供了若干 API 接口,并在接口實(shí)現(xiàn)中通過 KiteX client 發(fā)起對(duì)下游 KiteX Server RPC 接口的調(diào)用。
本次使用「半空」翻譯的是其 API 模塊,其主要功能列表如下:
- 用戶管理
a.用戶注冊(cè) (HTTP 接口 -> RPC 調(diào)用)
b.用戶登錄 (HTTP 接口 -> RPC 調(diào)用)
- 筆記管理
a.創(chuàng)建筆記 (HTTP 接口 -> RPC 調(diào)用)
b.查詢筆記 (HTTP 接口 -> RPC 調(diào)用)
c.更新筆記 (HTTP 接口 -> RPC 調(diào)用)
d.刪除筆記 (HTTP 接口 -> RPC 調(diào)用)
涉及到的 Hertz/KiteX 框架相關(guān)的核心能力如下:
- 初始化 Hertz Server
- 注冊(cè) Hertz 路由和 handler
- 實(shí)現(xiàn) Hertz 自定義中間件(JWT、服務(wù)發(fā)現(xiàn))
- 實(shí)現(xiàn) Hertz 的 handler 邏輯
- 使用 KiteX Client 調(diào)用下游接口
流程說明
從輸入原始項(xiàng)目產(chǎn)出 ABCoder 理解知識(shí)原料開始,「半空」會(huì)結(jié)合函數(shù)粒度知識(shí)原料,自底向上完成整個(gè)項(xiàng)目的逐層抽象和理解,之后至頂向下完成重構(gòu)設(shè)計(jì)的制定,同時(shí)確定項(xiàng)目漸進(jìn)式構(gòu)建順序:從粗粒度知識(shí)映射到細(xì)粒度知識(shí)映射到最后逐個(gè) Package 的實(shí)現(xiàn),最終完成 Golang 項(xiàng)目到 Rust 項(xiàng)目的漸進(jìn)式構(gòu)建(意譯)。這個(gè)過程中項(xiàng)目構(gòu)建進(jìn)度完全由用戶掌控,結(jié)合人工修改反饋輔助協(xié)同,推動(dòng)項(xiàng)目完成 Go2Rust 遷移落地。
上圖提到的 Golang AST / Rust AST 是 ABCoder 在分析倉庫代碼,將函數(shù)、方法、結(jié)構(gòu)體、變量等定義以樹形關(guān)聯(lián)出來的數(shù)據(jù)結(jié)構(gòu)體集合,是一個(gè)能夠與項(xiàng)目一比一映射的 LLMs原生抽象語法樹。
設(shè)計(jì)階段:Package 翻譯順序
根據(jù) ABCoder 解析后的項(xiàng)目原料,「半空」自動(dòng)化根據(jù) Package 的依賴關(guān)系完成了使用 Rust 重構(gòu)這個(gè)項(xiàng)目所需的設(shè)計(jì)文檔的編寫,自頂向下得到如下迭代順序:
- "github.com/cloudwego/biz-demo/easy_note/cmd/api":項(xiàng)目的二進(jìn)制入口和基礎(chǔ)框架搭建
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler":HTTP 通用 handler 的實(shí)現(xiàn)
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router":HTTP 通用 router 的注冊(cè)
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router/demoapi":HTTP 業(yè)務(wù) router 的注冊(cè)
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler/demoapi":HTTP 業(yè)務(wù) handler 的實(shí)現(xiàn)
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/rpc":請(qǐng)求下游的 RPC 封裝
- "github.com/cloudwego/biz-demo/easy_note/cmd/api/mw":通用/業(yè)務(wù)中間件具體實(shí)現(xiàn)
實(shí)施階段:根據(jù)設(shè)計(jì)文檔順序逐步展開
- " easy_note/cmd/api "
對(duì)應(yīng) MR: https://github.com/cloudwego/biz-demo/pull/83
main package,主要實(shí)現(xiàn)了 HTTP server 的初始化、路由注冊(cè)調(diào)用等能力
Golang 原始實(shí)現(xiàn) | 「半空」意譯效果 |
main() | main() |
customizedRegister() | customized_register() |
常量定義[本輪不實(shí)現(xiàn),只mock] | 常量定義[mock實(shí)現(xiàn)] |
- 結(jié)果評(píng)估
a.目錄:所有 main
package 的內(nèi)容,都生成到 Rust 項(xiàng)目的 /src/bin/main.rs
下;后續(xù)支持細(xì)粒度的文件模塊映射
b.內(nèi)容:翻譯的函數(shù)內(nèi)容、邏輯正確;輔助生成的注釋清晰體現(xiàn)核心步驟
c.錯(cuò)誤:存在 Opentelemetry 使用上的報(bào)錯(cuò);原因:目前還沒有注入相關(guān)知識(shí),后續(xù)通過知識(shí)庫飛輪進(jìn)行持續(xù)補(bǔ)充,其他缺少三方知識(shí)的問題類似,結(jié)合知識(shí)庫飛輪會(huì)持續(xù)收斂
d.Mock:Main package 會(huì)依賴其他包的內(nèi)容,因此會(huì)將其他 package 下的內(nèi)容進(jìn)行 mock,確??梢哉_編譯
- 數(shù)據(jù)統(tǒng)計(jì)
生成節(jié)點(diǎn)完備率=無需改造的節(jié)點(diǎn)/生成節(jié)點(diǎn)總數(shù)
可編譯度=1-修改的代碼行數(shù)/生成的代碼總行數(shù)
生成節(jié)點(diǎn)完備率: 50%
生成代碼可編譯度:73%
- " easy_note/cmd/api/hertz_handler "
對(duì)應(yīng) MR: https://github.com/cloudwego/biz-demo/pull/84
hertz_handler package 主要實(shí)現(xiàn)了一個(gè) ping handler,用于處理 ping-pong 請(qǐng)求
Golang 原始實(shí)現(xiàn) | Rust 意譯效果 |
Ping() | ping() |
- 結(jié)果評(píng)估
a.目錄:所有 Golang cmd/api/hertz_handler
包的內(nèi)容,都生成到 Rust 項(xiàng)目的 /src/cmd/api/hertz_handler/mod.rs
下
b.內(nèi)容:翻譯的函數(shù)內(nèi)容邏輯完全正確
c.錯(cuò)誤:生成的 Cargo.toml 里缺少 "serde_json" 依賴,小問題
- 數(shù)據(jù)統(tǒng)計(jì)
生成節(jié)點(diǎn)完備率=無需改造的節(jié)點(diǎn)/生成節(jié)點(diǎn)總數(shù)
可編譯度=1-修改的代碼行數(shù)/生成的代碼總行數(shù)
生成節(jié)點(diǎn)完備率:100%
生成代碼可編譯度:95%
- " easy_note/cmd/api/hertz_router "
對(duì)應(yīng) MR: https://github.com/cloudwego/biz-demo/pull/85
hertz_router 包主要實(shí)現(xiàn) Hertz 路由的總體注冊(cè)邏輯,調(diào)用 idl 生成的路由
Golang 原始實(shí)現(xiàn) | 「半空」意譯效果 |
eneratedRegister() | generated_register() |
Register()[本輪不實(shí)現(xiàn),只mock] | register()[mock] |
- 結(jié)果評(píng)估
a.目錄:所有 Golang cmd/api/hertz_router
包的內(nèi)容,都生成到 Rust 項(xiàng)目的 /src/cmd/api/hertz_router/mod.rs
下
b.內(nèi)容:翻譯的函數(shù)內(nèi)容邏輯完全正確
- 數(shù)據(jù)統(tǒng)計(jì)
生成節(jié)點(diǎn)完備率=無需改造的節(jié)點(diǎn)/生成節(jié)點(diǎn)總數(shù)
可編譯度=1-修改的代碼行數(shù)/生成的代碼總行數(shù)
生成節(jié)點(diǎn)完備率: 100%
生成代碼可編譯度:88%
- " easy_note/cmd/api/hertz_router/demoapi "
對(duì)應(yīng) MR: https://github.com/cloudwego/biz-demo/pull/86
hertz_router/demoapi
package 主要實(shí)現(xiàn)了具體了路由注冊(cè)(idl 映射)以及 Hertz 中間件的定義
Golang 原始實(shí)現(xiàn) | 「半空」意譯效果 |
Register() | register()[路由注冊(cè)有問題,需要 check & 修改] |
rootMw() | root_mw()[包含了中間件里的 mock 實(shí)現(xiàn)] |
mw 定義 | mw 定義 |
CreateUser[本輪不實(shí)現(xiàn),只mock] | create_user[mock] |
- 結(jié)果評(píng)估
a.目錄:所有 Golang cmd/api/hertz_router/demoapi
包的內(nèi)容,都生成到 Rust 項(xiàng)目的 /src/cmd/api/hertz_router/demoapi/mod.rs
下
b.內(nèi)容:register() 路由注冊(cè)的邏輯對(duì)應(yīng)上了,生成的路由在意譯層面和原始的路由一比一映射成功;root_mw() 能夠以注釋的形式描述出來 root_mw 里所需要做的內(nèi)容
- 數(shù)據(jù)統(tǒng)計(jì)
生成節(jié)點(diǎn)完備率=無需改造的節(jié)點(diǎn)/生成節(jié)點(diǎn)總數(shù)
可編譯度=1-修改的代碼行數(shù)/生成的代碼總行數(shù)
生成節(jié)點(diǎn)完備率:62%
生成代碼可編譯度:76%
- " easy_note/cmd/api/hertz_handler/demoapi "
對(duì)應(yīng) MR: https://github.com/cloudwego/biz-demo/pull/87
- Hertz_handler/demoapi package 主要實(shí)現(xiàn)了具體的 HTTP 接口實(shí)現(xiàn),下面使用 "create_note" 作為展示
Golang 原始實(shí)現(xiàn) | 「半空」意譯效果 |
CreateNote() | create_note() |
SendResponse() | send_response() |
rpc CreateNote[本輪不實(shí)現(xiàn),只mock] | rpc create_note[mock] |
ErrNo[本輪不實(shí)現(xiàn),只 mock] | ErrNo[mock] |
以下都以"create_note" 接口為例,進(jìn)行結(jié)果評(píng)估
- 結(jié)果評(píng)估
a.目錄:所有 Golang cmd/api/hertz_handler/demoapi
包的內(nèi)容,都生成到 Rust 項(xiàng)目的 /src/cmd/api/hertz_handlers/demoapi/mod.rs
下
b.內(nèi)容:create_note(): 能把原 create_note 的邏輯按順序進(jìn)行實(shí)現(xiàn),包括 獲取參數(shù)、發(fā)起調(diào)用、返回響應(yīng)等;send_response(): 基本實(shí)現(xiàn)出原接口的含義,細(xì)節(jié)問題當(dāng)前需要人工介入調(diào)整
- 數(shù)據(jù)統(tǒng)計(jì)
生成節(jié)點(diǎn)完備率=無需改造的節(jié)點(diǎn)/生成節(jié)點(diǎn)總數(shù)
可編譯度=1-修改的代碼行數(shù)/生成的代碼總行數(shù)
生成節(jié)點(diǎn)完備率:14%
生成代碼可編譯度:88%
至此,通過 5 輪迭代的拆解,我們就完成了 "github.com/cloudwego/biz-demo/easy_note/cmd/api" 這個(gè) moudle 的全部翻譯,用戶在 check 完整個(gè)項(xiàng)目后,即可以編譯 & 運(yùn)行項(xiàng)目。
總結(jié)
整體意譯效果說明
- 函數(shù)翻譯完備性
完備性說明:完全無需人工介入的函數(shù)統(tǒng)計(jì)為完備函數(shù)
package | 生成函數(shù)的個(gè)數(shù) | 完備函數(shù)的個(gè)數(shù) | 完備率 |
easy_note/cmd/api | 4 | 2 | 50% |
easy_note/cmd/api/hertz_handler | 1 | 1 | 100% |
easy_note/cmd/api/hertz_router | 1 | 1 | 100% |
easy_note/cmd/api/hertz_router/demoapi | 13 | 8 | 62% |
easy_note/cmd/api/hertz_handler/demoapi | 7 | 1 | 14% |
- 代碼可編譯度
可編譯說明:相對(duì)于整體生成代碼行數(shù),人工介入修改的代碼行數(shù)占比,需要修改的代碼越少,可編譯度越高
package | 生成函數(shù)的行數(shù) | 人工修改的代碼行數(shù) | 可編譯度 |
easy_note/cmd/api | 106 | 28 | 73% |
easy_note/cmd/api/hertz_handler | 19 | 1 | 95% |
easy_note/cmd/api/hertz_router | 9 | 1 | 88% |
easy_note/cmd/api/hertz_router/demoapi | 173 | 38 | 76% |
easy_note/cmd/api/hertz_handler/demoapi | 254 | 30 | 88% |
整體上,通過知識(shí)庫的持續(xù)建設(shè)和關(guān)鍵知識(shí)的補(bǔ)齊,「半空」也會(huì)“越用越好,越用越聰明”,在完備性和可編譯度上也會(huì)隨之持續(xù)提升。
語言學(xué)習(xí)和項(xiàng)目遷移
在這個(gè)過程中,結(jié)合「半空」為我們生成的 Rust 項(xiàng)目設(shè)計(jì)文檔,從整體項(xiàng)目的角度出發(fā),逐步對(duì)每個(gè)包進(jìn)行深入理解、翻譯與確認(rèn)。這一過程條理清晰、循序漸進(jìn)地將一個(gè) Golang 項(xiàng)目從零構(gòu)建為一個(gè) Rust 項(xiàng)目。同時(shí),我們一同參與項(xiàng)目構(gòu)建的每一個(gè)迭代,「半空」每一個(gè)迭代生成的代碼完全遵循內(nèi)場(chǎng)和業(yè)內(nèi) Rust 項(xiàng)目編寫的最佳實(shí)踐,這不僅幫助我們深刻理解整個(gè)項(xiàng)目,同時(shí)也為學(xué)習(xí)一門新語言提供了極大的支持。通過這種逐步漸進(jìn)遷移的方式,我們能夠不斷深入學(xué)習(xí)并掌握 Rust 語言及項(xiàng)目本身,最終成功完成項(xiàng)目的轉(zhuǎn)型。