自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

半空:LLM 輔助的 Go2Rust 項(xiàng)目遷移

開發(fā)
「半空」主要討論的就是對(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í)密度跟不上的矛盾。

背景

當(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é):

  1. 一個(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ù)邏輯。
  2. 通過這層抽象,我們可以將任意一個(gè)復(fù)雜項(xiàng)目映射出了一個(gè)最簡(jiǎn)單的迭代入口:?jiǎn)?dòng)一個(gè) HTTP 應(yīng)用框架,并注冊(cè)處理某個(gè) URL 的某個(gè)邏輯函數(shù)。
  3. 對(duì)整個(gè)復(fù)雜項(xiàng)目的理解過程被我們巧妙的轉(zhuǎn)換為對(duì)一個(gè)項(xiàng)目自底向上的逐層抽象的過程,如果我們能將這個(gè)抽象過程做的足夠清晰和準(zhǔn)確,對(duì)于一個(gè)完成抽象的項(xiàng)目來說,我們反過來也得到了一個(gè)支持我們至頂向下層層細(xì)化的項(xiàng)目構(gòu)建流。
  4. 理論上通過增加、減少、優(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è)谶@層抽象上做的事情就是:

  1. 根據(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)目
  2. 之后按照本層抽象剩下的描述信息,完成「/a/b/c路由和對(duì)應(yīng)處理函數(shù)」的注冊(cè)
  3. 由于本層抽象并不具備這個(gè)處理函數(shù)的詳細(xì)描述信息,因此僅僅需要生成一個(gè)空實(shí)現(xiàn)的樁函數(shù)即可
  4. 之后我們所做的所有變成,二次確認(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è)核心步驟:

  1. 打開冰箱門:基于 ABCoder 對(duì)存量 Go 項(xiàng)目完成系統(tǒng)解析,產(chǎn)出函數(shù)粒度的項(xiàng)目理解原料
  2. 把大象放進(jìn)去:基于項(xiàng)目理解原料產(chǎn)出將該項(xiàng)目改寫為Rust 對(duì)應(yīng)的項(xiàng)目設(shè)計(jì)文檔
  3. 關(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ì)文檔的編寫,自頂向下得到如下迭代順序:

  1. "github.com/cloudwego/biz-demo/easy_note/cmd/api":項(xiàng)目的二進(jìn)制入口和基礎(chǔ)框架搭建
  2. "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler":HTTP 通用 handler 的實(shí)現(xiàn)
  3. "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router":HTTP 通用 router 的注冊(cè)
  4. "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_router/demoapi":HTTP 業(yè)務(wù) router 的注冊(cè)
  5. "github.com/cloudwego/biz-demo/easy_note/cmd/api/hertz_handler/demoapi":HTTP 業(yè)務(wù) handler 的實(shí)現(xiàn)
  6. "github.com/cloudwego/biz-demo/easy_note/cmd/api/rpc":請(qǐng)求下游的 RPC 封裝
  7. "github.com/cloudwego/biz-demo/easy_note/cmd/api/mw":通用/業(yè)務(wù)中間件具體實(shí)現(xiàn)

實(shí)施階段:根據(jù)設(shè)計(jì)文檔順序逐步展開

  1. " 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%

  1. " 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%

  1. " 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%

  1. " 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%

  1. " 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)型。

責(zé)任編輯:龐桂玉 來源: 字節(jié)跳動(dòng)技術(shù)團(tuán)隊(duì)
相關(guān)推薦

2022-05-09 10:36:05

PythonPyScript開發(fā)者

2021-10-20 10:08:31

編程技能開發(fā)

2020-07-07 07:00:00

RustGo語言編程語言

2022-09-16 07:40:17

CloudWeGo開源Rust

2023-12-15 14:38:00

GoRust編程語言

2024-03-01 20:16:03

GoRust語言

2024-01-09 16:14:39

RustGo切片

2024-11-27 16:17:00

2024-01-25 09:10:10

GoRust標(biāo)準(zhǔn)庫

2023-09-07 07:53:21

JavaScriptGoRust

2024-01-18 13:36:00

RustGo開發(fā)

2019-10-17 09:00:00

GoRust編程語言

2023-11-19 21:17:58

GoRust

2022-07-20 10:33:50

RustGo內(nèi)存管理

2024-02-28 10:13:25

Rust語言開發(fā)

2021-11-29 22:51:14

GoPHPRust

2021-05-20 10:00:56

Go代碼Python

2021-05-24 11:05:53

代碼開發(fā)Go

2015-11-25 10:43:03

DGORust

2024-06-24 07:00:00

C++RustGo
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)