1. 程式人生 > 其它 >程式碼智慧技術如何應用到日常開發?

程式碼智慧技術如何應用到日常開發?

簡介:原理與演示。

01/ 從開發者的煩惱說起

開發者在編寫程式碼時,需要花費大量時間在低層次的重複編碼上,特別是針對一些語法比較冗餘的開發語言。

同時,開發者經常被戲稱為面向搜尋引擎程式設計,因為我們經常需要通過通用搜索引擎去查詢文件資料,但是通用搜索引擎的內容質量參差不齊,開發者在找文件、選文件上都需要花費大量時間,這會讓我們的開發過程碎片化,無法集中精力聚焦在業務邏輯的開發上。

在程式碼評審階段,評審人需要費時費力的人工評審,特別是當變更程式碼特別多的時候,評審人很難去完成評審任務,只能大致看一下,從而違背了評審的初衷。在評審過程中,傳統的程式碼檢測工具無法發現深層次的潛在缺陷,也不能提供缺陷的修復方案,從而為線上故障埋下了隱患。

開發過程中存在的問題

那麼諸多的煩惱,應該怎麼解決呢?

02/ 程式碼智慧如何賦能日常開發

阿里云云效程式碼智慧團隊通過AI技術,打造了多款業界領先的智慧編碼以及程式碼檢測工具,是國內首個將AI能力應用到程式碼評審場景的團隊。此外,我們也通過與學術界的深入合作,通過論文和專利,保持著技術的先進性。下面我們詳細介紹。

程式碼智慧補全能力及原理

在編寫程式碼時,雲效Codeup 能通過 WebIDE 為開發者提供智慧化的編碼輔助,快速完成輕量級編碼,也能讓開發者通過語言描述快速地找到所需的程式碼文件或者程式碼示例,減少編碼過程的碎片化。

在編寫程式碼時,只需要輸入幾個字元,甚至一個字元,程式碼智慧補全外掛就能結合程式碼上下文及其語義,推薦出多個整行的程式碼補全候選項,前面標註✨圖示的就是程式碼智慧補全外掛提供的結果。在不同的程式碼行,輸入同一個字元,比如X字元,它就能推薦出更適合當前位置的行級程式碼補全結果。它也能自動地將程式碼上文中出現的變數或引數,自動地填充到合適的程式碼補全候選項中。

程式碼智慧補全能夠幫助開發者減少重複性較高的低層次編碼,大幅提升編碼效率,以視訊演示的程式碼片段為例,

  • 如果只是使用 IDE 內建的程式碼補全,需要敲擊鍵盤700次,花費5分鐘的時間才能完成程式碼的編寫;
  • 使用某業界頂尖的同類產品,鍵盤輸入次數減少了33%,花費的時間減少了6%。為什麼鍵盤敲擊次數減少了很多,時間減少的卻很少呢?因為它給出的程式碼補全候選項過多,並且存在較多的錯誤,需要開發者花時間去做選擇,選擇太多反而不是好事;
  • 使用我們雲效自主研發的程式碼智慧補全外掛,鍵盤輸入次數減少了65%,編碼耗時減少了57%,只需要2分鐘左右就能完成程式碼的編寫。

那麼我們是如何做到的呢?我們使用了多模型融合技術,將擅長點各有側重的多個模型融合到一起,一個人決策可能不太準,多個人一起決策就能儘可能的減少誤判,其中的深度學習模型、語義模型等都能做到程式碼上下文的感知,輸入同一個字元,在不同的程式碼位置,會推薦不同的程式碼補全結果,並且能將上文中出現的變數或引數,自動填充到補全的候選項中。

阿里巴巴內部開發者的使用情況顯示,相比於 IDE 內建的補全,程式碼智慧補全能幫助開發者平均提升20%的編碼效率。那麼程式碼智慧補全的實現原理是怎麼樣的呢?

我們會將程式碼解析成抽象語法樹,並對AST進行資料處理,我們將處理好的資料通過深度學習模型進行訓練,剛開始的幾個迭代,還只能生成一些雜亂的序列,模型會將生成的序列與期望生成的序列進行對比,計算誤差並更正模型資料,在N個迭代之後,它已經能生成符合語法的正確程式碼序列。在程式碼智慧補全階段,我們將深度學習模型、語義模型、統計學模型等多個不同種類的模型融合在一起,去生成程式碼補全的候選項,然後通過語法校正,避免將不符合語法的程式碼推薦給開發者。

程式碼智慧評審在程式碼評審中,當開發者建立評審時,雲效Codeup 會為其推薦更合適的評審人,他可能更熟悉變更的程式碼,而評審人也能在評審列表上看到每個評審的預估耗時,幫助評審人充分利用碎片化時間進行評審,同時在瀏覽評審時,開發者經常需要檢視某個 API 的定義或引用,而我們提供的語法跳轉服務可以讓評審人像在 IDE 中一樣,在網頁端進行程式碼定義和引用的跳轉。此外,我們也提供了更深層次的程式碼檢測工具幫助評審人更快的發現隱藏缺陷,並能快速的修復缺陷。

程式碼智慧安全檢測關於程式碼檢測,這裡主要聊一下程式碼內容安全的檢測。說到程式碼安全,每年都會有非常多漏洞被發現,並且被黑客利用。比如早些年的Struts框架上傳檔案模組的漏洞,能讓黑客遠端執行Shell命令;近期的比如Chrome的零日漏洞,它存在Use-After-Free的問題,它會允許黑客在渲染程序中去執行遠端程式碼,比如使用者如果在Chrome中開啟PDF檔案,黑客就能通過遠端命令獲取相關的使用者資料。

為此,雲效Codeup為開發者提供了依賴包漏洞檢測、原始碼漏洞檢測等程式碼內容安全檢測工具。

依賴包漏洞檢測

依賴包漏洞檢測能幫助開發者發現三方包中存在的漏洞隱患,三方包大部分是開源軟體,而開源軟體很少進行安全測試,並且黑客也更願意去發現開源軟體的漏洞,因為程式碼是開源的,比較容易發現安全漏洞,而且一旦發現了安全漏洞,那麼它的影響面會很大,絕大部分引用了存在安全漏洞三方包的應用,都會受到黑客攻擊的威脅。

雲效Codeup 的依賴包漏洞檢測工具會先將程式碼進行編譯構建,並採集程式碼所有的依賴包,然後通過漏洞匹配演算法從漏洞庫中查詢準確的漏洞資訊,為了讓漏洞庫覆蓋更全面,我們集成了多個外部漏洞庫以及阿里集團安全團隊自建的漏洞庫。開發者獲取到的漏洞資訊會包含建議升級的版本範圍,為了減少依賴包版本升級後對應用穩定性產生的影響,我們會對每個依賴包版本進行有效性以及相容性分析,然後會為開發者推薦建議升級的版本號,並且提供通過一鍵建立程式碼評審修復依賴包漏洞的快捷入口。

原始碼漏洞檢測

在程式碼內容安全檢測領域,除了剛才提到的依賴包漏洞檢測,我們也提供了對程式碼庫自身的原始碼漏洞檢測工具。

雲效Codeup 基於源傘檢測引擎,將程式碼中的資料流和控制流轉換成數學語言,然後對數學語言進行定理證明,能夠更準確的推導程式碼中的路徑條件,減少誤報。同時,它具備跨函式的全文分析能力,比如有多層的函式呼叫關係,如果最底層的函式存在一些程式碼安全風險,並且會影響最上層的業務程式碼,它也能通過將程式碼的資料流以及函式呼叫關係,解析為圖結構,通過對程式碼圖譜的分析,能夠快速的發現潛在的安全風險。此外,我們對檢測出來的漏洞資訊也會給與詳細的解釋,告訴開發者每個漏洞在程式碼中是怎麼一步步帶來影響的。我們一起看一個視訊。

當我們提交完程式碼後,雲效Codeup 能自動執行已開啟的程式碼檢測,比如視訊中已開啟的依賴包漏洞檢測,我們也可以手動開啟原始碼漏洞檢測。

依賴包漏洞檢測能發現眾多三方包漏洞,會在詳細資訊中展示疑似的CVE漏洞資訊;原始碼漏洞檢測能發現程式碼注入、遠端命令執行、緩衝區溢位等安全漏洞,並且會在詳細資訊的右側展示漏洞在程式碼中的影響路徑。

我們可以在依賴包漏洞的詳細資訊中,通過一鍵建立程式碼評審,幫助我們快速的生成修復指定漏洞的程式碼變更及其合併請求,評審描述中會提供漏洞的解釋資訊以及升級包的相容性分析。

03/ 程式碼智慧技術的不斷探索

除了上面介紹的已經落地到雲效的智慧化能力,我們與浙江大學、莫納什大學、南洋理工大學等高校在程式碼生成、程式碼搜尋、智慧評審等領域進行了深入的合作,在多個領域產出了論文和專利。

比如,我們與南洋理工大學合作的程式碼摘要生成專案,很多時候開發者不太喜歡寫註釋,或者不知道怎麼寫註釋,導致程式碼的可維護性不高,為了幫助開發者更好的理解程式碼,我們期望通過對程式碼邏輯的學習和理解,自動生成出程式碼片段的摘要註釋。我們會先從程式碼大資料中挖掘出一批程式碼的片段及其註釋,構建程式碼片段檢索庫,然後從檢索庫中找到與目的碼相似的程式碼片段,並且將目的碼和相似的程式碼片段都解析成CPG圖結構,我們會基於注意力機制通過融合演算法將兩個圖結構融合在一起,然後經過圖權重的靜態計算及動態計算,並通過模型獲得對圖資訊的編碼資料,最後,將相似程式碼片段的摘要註釋進行編碼後,與圖結構的編碼資訊聚合在一起,通過解碼器就能生成目的碼的摘要註釋。相關論文《RETRIEVAL-AUGMENTED GENERATION FOR CODE SUMMARIZATION VIA HYBRID GNN》。

開發者花費時間比較多的地方除了寫程式碼,就是除錯程式碼,我們期望通過程式碼缺陷定位去輔助開發者排查缺陷。程式碼缺陷定位會先從程式碼變更資料中,挖掘出有效的缺陷程式碼作為訓練集,並且將缺陷程式碼解析成抽象語法樹,然後將抽象語法樹按程式碼行進行拆解,每一行程式碼對應一個子語法樹,將子語法樹從葉子節點到根節點編碼成多條子路徑,最後,將每行程式碼關聯的子路徑放到基於注意力機制的深度學習模型中進行訓練。當需要程式碼缺陷定位時,開發者提交程式碼後,我們會從程式碼變更中抽取出變更程式碼行的子路徑,通過模型推理,我們就能得到每行程式碼的缺陷概率,從而輔助開發者排查缺陷。

除了上面提到的兩個合作專案,我們與各個高校在多個領域進行了廣泛的合作。我們期望在不久的將來,開發者能在雲效的智慧化研發平臺上,只需要提供文字描述或需求文件,我們就能為其生成出大部分基礎程式碼及其依賴項,並能通過智慧編碼輔助快速的完成程式碼填充,程式碼缺陷也將無處遁形,期望大家可以保持對雲效產品動態的關注。

原文連結
本文為阿里雲原創內容,未經允許不得轉載。