精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Code Review效率低?來試試智能語法服務

開發 開發工具
在人工代碼評審(Code Review,CR)中,對于純文本形式的代碼瀏覽不可避免地將耗費大量的時間,影響CR的效率。那么有沒有更智能的方法?

 ????在人工代碼評審(Code Review,CR)中,對于純文本形式的代碼瀏覽不可避免地將耗費大量的時間,影響CR的效率。那么有沒有更智能的方法?阿里云云效代碼智能語法服務基于云端備份的快速代碼導航服務,無須本地克隆即可在頁面體驗熟悉的定義引用快速查看跳轉功能,可大幅提升代碼評審的效率和質量。本文分享相關的技術原理與實現方法。

一 前言

代碼文本不是簡單的二維平面結構,看懂一段代碼需要反復地通過定義與引用的跳轉,才能將代碼深層次的邏輯和片段影響范圍理解透徹。純文本形式的代碼瀏覽是網頁端代碼評審的最大痛點之一,朱熹老先生常說“心不在此,則眼不看仔細,心眼既不專一,卻只漫浪誦讀,決不能記,記亦不能久也。”代碼文本扁平式地漫浪誦讀只能達到眼到、口到的境界,如果你是一個認真負責的代碼評審者,阿里云云效代碼智能語法服務一定是幫助你充分理解代碼變更,超越眼口,到達“心到”境界的功能。心既到矣,眼口豈不到乎?

那么什么是代碼智能語法服務呢?語法服務提供了基于云端備份的快速代碼導航服務,無須本地克隆即可在頁面體驗熟悉的定義引用快速查看跳轉功能,大幅提升代碼評審的效率和質量。

二 技術基礎

阿里云云效代碼智能語法服務的底層技術是LSIF(Language Server Index Format),它是一種持久化語言的索引的圖存儲格式,通過圖的格式,表示了“代碼文檔”-> “語法智能結果”之間的事件關系。

在LSIF之前,LSP(Language Server Protocol)定義了編碼語言與各類終端代碼編輯器之前的交互協議。原先開發者需要為每一款編輯器都定義適配一種語法分析服務應用,那么M個語言要在M個代碼編輯器中使用的話需要MxN個應用。而有了LSP的出現,開發者在解析代碼語法時只需要遵循LSP協議格式,實現代碼補全、定義展示、代碼診斷等接口,就只需要開發M+N個應用。

??

??

 

然而代碼分析往往需要耗費大量的時間和資源,當用戶請求某個語法服務(如查看定義),后端需要克隆代碼,下載依賴包,解析語法,構建索引(類比一下IntelliJ Idea初始化工程的場景),編輯器場景用戶已經習慣于這樣的方式,等待幾分鐘或許問題不大。但CR場景或者輕量級的代碼瀏覽場景,這種方式就顯得時效性比較低了,幾分鐘后或許用戶已經完成了代碼瀏覽,而且缺少持久化的存儲會導致資源過度消耗。于是,LSIF就在這樣的背景下應運而生,秉承用空間換時間的思想,提前計算好語法分析結果以特定的索引格式存儲在云上,從而快速響應不同用戶的多次請求。

援引官方示例來簡單介紹下LSIF,如下方代碼:

// this is a sample classpublic class Sample {}

假定只有一種交互,當鼠標移動到Sample的類名上,就會出現“this is a sample class”的注釋信息。用LSIF的圖就可以如下描述。

??

??

 

一個sample文件,包含了一個range信息,這個range關聯了一個hoverResult。含義是該文件的某個位置范圍內,觸發hover事件的話,就給出hoverResult存儲的結果。

如果用Json文件描述這張圖的存儲,就可以得到如下結果:

{ id: 1, type: "vertex", label: "document", uri: "file:///abc/sample.java", languageId: "java" }{ id: 2, type: "vertex", label: "range", start: { line: 0, character: 13}, end: { line: 0, character: 18 } }{ id: 3, type: "edge", label: "contains", outV: 1, inVs: [2] }{ id: 4, type: "vertex", label: "hoverResult", result: {["this is a sample class"]} }{ id: 5, type: "edge", label: "textDocument/hover", outV: 2, inV: 4 }

實際一個工程的LSIF圖會非常復雜,經常會包含幾十萬個節點。感興趣的同學可以參考LSIF具體描述[1]。

三 實現方式

阿里云云效的語法服務架構圖主要分為兩部分:

基于事件觸發的索引構建過程

基于用戶請求的語法服務響應

??

??

 

1 索引構建

用戶對代碼的瀏覽場景主要集中在代碼評審和主干分支的代碼瀏覽,所以我們目前主要支持兩種場景的語法服務。語法服務接收來自代碼平臺的事件消息,如代碼推送事件,評審的創建、更新、合并、關閉、重新開啟事件,來觸發語法服務構建。

我們的構建工作流調度主要基于阿里巴巴開源的分布式調度框架tbschedule,該系統會通過zookeeper維護一個任務集群,通過zookeeper做節點管理和任務分發,不重復不遺漏地快速處理調度任務。

針對不同語言,我們只需要實現一次從源代碼到LSIF格式的轉換,就能將其應用在多種場景。多種代碼語言代碼語言都會被解析成統一的LSIF格式文件。

針對阿里巴巴內部主要的Java語言,我們利用開源Java代碼解析工具Spoon[2]將Java源代碼分析為AST(抽象語法樹),然后捕捉定義和引用、定義與注釋之間的關聯,將坐標信息、注釋內容,文本類型,所屬文件等信息聚合,輸出為統一的LSIF的Json格式。

開發期間修復并適配了一些lsif-java的問題,如位置范圍信息錯亂,召回多種遺漏的高亮詞類型,適配非Maven倉庫的索引構建。同時還修復了Spoon關于無法正確解析注釋中的部分注解的問題,PR已被Spoon社區接受合并[3]。

生成lsif.json文件后,由于這個Json文件較大,直接由前端加載并響應請求不太合理,后期增量生成與維護難度也很大,所以我們還需要一步:將lsif.json轉化為結構化數據,從而按需響應用戶查詢請求。lsif的圖存儲格式讓人自然地聯想到用圖數據結構存儲,圖查詢的速度也比較快,然而由于索引變化迭代較快,頻繁更換的ID導致圖存儲難以適配增量方案,不同代碼庫不同語言的索引數據很難在一張圖中結構化,參考了社區的相關實踐,考慮到成本和性能,因為ES天然地適合大規模的數據存儲和索引,我們最后選擇了用ES(Elasticsearch)做結構化數據存儲。

我們將這種結構化的數據上傳到ES,然后語法服務后端服務器會基于用戶的語法請求,構造ES請求Query,查詢定義、引用或注釋信息,將其拼裝返回。

對于分支,我們會持續更新和保留最新版本的索引數據;對于代碼評審,我們會構建源分支的每次Push版本和源目標分支的merge-base版本的索引。

索引構建的另外一個難點是增量計算。如上文所述,語法服務索引構建對資源的要求非常高,而現實中代碼庫不可避免地會存在頻繁提交的現象。如此引申出了兩個優化點:

利用增量的方式減少存儲內容的變更,加快索引構建速度。

利用分布式時序鎖減少頻繁請求帶來的壓力。

增量方案

每次分支索引構建成功,我們都會在數據庫中記錄分支對應的版本號,當該分支有了一次新的提交后,在生成lsif.json后,系統會比較兩個分支的Diff,獲取到變更文件和變更類型,通過變更文件來進一步提取索引受到影響的文件(引用或定義的坐標信息變更),分析出所有受影響的文件和對應的ES增刪操作后,完成增量索引上傳。這個增量的過程平均能減少45%的分支構建時間。

??

??

 

時序鎖管理

根據庫大小的區別,LSIF的索引構建時間為10秒至數分鐘不等,而用戶對同一個代碼倉庫的提交操作峰值可能會達到每分鐘近百次,即使我們采用了增量技術也很難滿足高頻的構建請求,并且提交事件觸達和調度任務執行無法保證精準的時序性。綜上所述,我們需要一個分布式時序鎖來保證任務調度的順序和盡量減少重復調度。

當同一代碼庫的不同推動消息紛涌而至,Redis維護的分布式鎖會做如下判斷:若該庫當前沒有正在運行的任務,將任務置于隊首,立即運行;若已有一個正在執行的任務,比較新來的Push消息是否是最新的,若是,則加入隊尾;當隊伍已有兩個成員時,則將任務丟棄,因為每次執行任務時,系統都會克隆分支代碼,基于最新的版本構建索引,如此就避免了多少次Push就需要執行多少次索引構建的可能性。考慮到線程意外退出的情況,隊首會每隔5秒鐘全局發送心跳,當隊尾或新來的任務監聽到心跳超時,則會將隊首的任務放棄并執行新的任務。

??

??

 

2 語法服務響應

如前言的示例,用戶在使用語法服務時,主要有以下三個請求:

每次打開文件獲取所有的可點擊高亮詞

點擊高亮詞獲取對應的定義與引用列表

點擊定義和引用實現跳轉

針對第一個請求,系統會構造基于文件路徑的過濾條件構造ES的Query請求,將當前文件的所有高亮詞坐標信息發送給前端,避免了前端做語法分詞,沒有構建好的文件自然也不會在頁面上被高亮出來。另外,為了避免超大文件對ES的壓力,前端會做分批動態加載。

針對第二個請求,我們在獲取定義與引用列表的過程中,不光要得到文件名和位置信息,還需要將對應的代碼內容展示出來,方便用戶理解。為了實現這個效果,我們新增了批量獲取文件片段的接口。

對于第三個請求,同一個文件內的跳轉會自動高亮到對應的代碼行,不同文件間的跳轉會新開頁面并跳轉。

語法服務響應和語法索引構建是完全異步的,互不影響,支持獨立的資源擴縮。

3 索引清理

語法服務的索引大小約是代碼文件內容的數倍,比較消耗存儲資源。所以針對用戶通常的使用習慣和場景,制定了一系列索引清理任務來避免資源過度的損耗。

當代碼評審合并或刪除時,當分支刪除時,系統會開始執行索引清理任務,釋放索引資源。

四 語法服務展望

缺少符號跳轉長久以來一直是頁面上代碼閱讀的痛點之一,各種語法協議和技術層出不窮,如LSIF、Kythe、SARIF、UAST、Tree-sitter,ctags,全球技術人都在為更智能的代碼分析,更好的代碼體驗,更高的代碼質量做努力。云效語法服務后續也會逐漸加快語法構建速度,支持更多的代碼語言,滿足更多的語法場景,提升用戶的代碼瀏覽體驗。

相關鏈接

[1]https://microsoft.github.io/language-server-protocol/specifications/lsif/0.4.0/specification/

[2]http://spoon.gforge.inria.fr/

[3]https://github.com/INRIA/spoon/pull/3513

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2023-10-11 16:33:37

2024-04-18 08:11:57

R 樹空間索引技術R-tree

2024-01-10 08:33:15

R 樹R-tree圖形編輯器

2018-08-16 15:11:47

Code ReviewPPT代碼

2020-07-10 12:06:28

WebpackBundleless瀏覽器

2015-11-17 16:11:07

Code Review

2022-10-27 10:33:48

敏捷開發開發

2020-08-25 08:03:59

測試Sharness結構

2016-09-23 18:32:42

iTunesIOS 10蘋果

2012-07-05 09:45:02

代碼審查

2013-10-24 09:43:58

代碼代碼審查

2022-06-17 11:10:43

PandasPolarsPython

2020-12-02 08:31:47

Elasticsear

2020-11-04 16:34:45

單元測試技術

2021-04-25 09:19:22

騰訊Code Reviewleader

2009-08-05 09:59:40

Code Review代碼審查工具

2021-08-09 06:57:41

CodeReview流程

2012-07-03 09:38:42

前端

2025-06-04 01:02:00

MySQL索引

2012-09-03 13:41:50

Code Review
點贊
收藏

51CTO技術棧公眾號

www.狠狠干| 波多野结衣办公室双飞| 免费在线高清av| 日韩av一区二| 日韩色av导航| 韩国三级在线播放| 国产传媒av在线| 国产视频视频一区| 91精品中文在线| 国产主播在线播放| 免费视频国产一区| 欧美二区在线观看| 777av视频| 国产成人天天5g影院在线观看| 免费成人在线网站| 久久久久久久香蕉网| 白丝女仆被免费网站| 涩涩涩久久久成人精品| 偷拍日韩校园综合在线| 亚洲欧美国产不卡| 手机看片一区二区三区| 久久精品国产秦先生| 欧美激情视频一区二区三区不卡| 国产精品无码永久免费不卡| 国产精久久久| 日本精品视频一区二区三区| wwwwww欧美| 中文字幕在线免费| 99国产精品久| 97久久人人超碰caoprom欧美| 无码人妻av一区二区三区波多野 | 国产精品一区二区免费看| 波多野结衣视频在线观看| 亚洲国产欧美国产综合一区| 自拍偷拍亚洲区| 久久国产精品无码一级毛片| 亚洲精品观看| 欧美高清视频在线高清观看mv色露露十八 | 日本一区二区三区dvd视频在线 | 久久久久久久久久国产| 精品一区二区在线观看视频| 一呦二呦三呦国产精品| 精品国产3级a| 性鲍视频在线观看| 日本肉肉一区| 色哟哟国产精品| 国产黄页在线观看| 黑人另类精品××××性爽| 日韩毛片精品高清免费| 日韩中文字幕av在线| 视频午夜在线| 国产美女一区二区三区| 成人黄色av网站| 中文字幕丰满人伦在线| 日本午夜精品一区二区三区电影| 51ⅴ精品国产91久久久久久| 日韩激情在线播放| 亚洲美女啪啪| 97视频免费观看| 你懂的国产视频| 国产欧美在线| 国产999在线观看| 亚洲婷婷综合网| 久久久久综合| 国产激情视频一区| 一区二区视频免费| 蜜臀精品一区二区三区在线观看 | 亚洲精品蜜桃久久久久久| av小次郎在线| 亚洲一区二区视频| av日韩一区二区三区| 国产一二在线播放| 欧美日韩一区二区精品| 成人久久久久久久久| 欧美成人精品一区二区男人小说| 日本精品视频一区二区| 精品久久久久久中文字幕2017| 亚洲欧美在线成人| 欧美日韩激情一区二区| 污视频在线观看免费网站| 秋霞一区二区三区| 亚洲第一黄色网| 久久无码人妻精品一区二区三区| 欧美人与拘性视交免费看| 中文字幕成人精品久久不卡| 国产福利视频网站| 精品999日本| 欧美自拍视频在线| 中文字幕在线观看精品| 国产精品一区二区在线播放 | 亚洲精品免费在线播放| bt天堂新版中文在线地址| 国产污视频在线播放| 精品视频1区2区3区| 夜夜爽久久精品91| 麻豆成人入口| 中文字幕日韩av电影| 国产探花在线播放| 午夜综合激情| 91性高湖久久久久久久久_久久99| 好吊色一区二区三区| 久久久九九九九| 亚洲成人午夜在线| xxx在线免费观看| 欧洲日韩一区二区三区| 手机在线播放av| 国产成人三级| 九九精品在线观看| 无码视频在线观看| 国产 欧美在线| 天天人人精品| segui88久久综合9999| 欧美日韩高清一区二区不卡| 香蕉视频污视频| 日韩大片在线| 欧美一级片一区| 99国产精品99| 日本一区二区三区在线观看| 给我免费播放片在线观看| 色综合视频一区二区三区日韩 | 一级毛片视频在线| 精品动漫一区二区三区| 尤物网站在线看| 精品久久中文| 欧美在线www| 亚洲精品无amm毛片| 国产精品久久久久久久久免费丝袜| 亚洲精品无码国产| 日韩一二三区| 久久天天躁日日躁| 天天操天天干天天摸| 99久久精品国产精品久久| 男人草女人视频| 日本欧美在线| 中文字幕亚洲欧美日韩高清 | 91精品婷婷国产综合久久竹菊| 国产三级视频网站| 欧美三区美女| 91成人免费看| 成人免费网站在线观看视频| 欧美日韩精品电影| 亚洲黄色网址大全| 日本在线不卡视频| 欧美一区二区视频17c| 国产精品vvv| 亚洲国产精彩中文乱码av在线播放 | 成人av一级片| 欧美大胆视频| 91chinesevideo永久地址| 国产香蕉在线观看| 亚洲国产cao| 在线精品视频播放| 国内精品99| 国产欧美日韩在线播放| 都市激情久久综合| 亚洲国产欧美一区二区三区同亚洲| 成人性生活毛片| 韩国精品免费视频| 天天综合五月天| 日本成人精品| 久久久久久91| 国产 欧美 精品| 精品福利樱桃av导航| 青青草成人免费视频| 亚洲综合精品四区| 日韩av一级大片| 亚洲天堂电影| 国产亚洲激情在线| 在线视频免费观看一区| 亚洲欧洲美洲综合色网| 中文字幕55页| 日韩一区二区久久| 欧美精品人人做人人爱视频| 日本免费一区二区三区四区| 正在播放亚洲1区| 97精品人妻一区二区三区香蕉| 亚洲视频免费在线| 在线观看亚洲免费视频| 国产日韩免费| 水蜜桃一区二区三区| 国产精品亚洲综合在线观看| 欧美黑人国产人伦爽爽爽| 性感美女视频一二三| 91福利在线看| 99久久99久久精品国产| 成人午夜视频福利| 免费观看成人在线视频| 仙踪林久久久久久久999| 99久久久久国产精品免费| 麻豆网站免费在线观看| 中文字幕成人在线| 亚洲成人黄色片| 日韩人在线观看| 永久免费看片视频教学| 东方aⅴ免费观看久久av| 欧美女人性生活视频| 国产大片一区| 蜜桃传媒视频麻豆第一区免费观看| 欧美日韩国产网站| 欧美激情中文字幕乱码免费| 久久国产精品高清一区二区三区| 欧美一区二区三区白人| 在线观看免费av片| 亚洲精品自拍动漫在线| 亚洲AV无码片久久精品| 国产高清精品在线| 九色91popny| 99伊人成综合| 中国人体摄影一区二区三区| 日韩美女毛片| 成人黄动漫网站免费| 日本美女久久| 国产91对白在线播放| 中文字幕中文字幕在线中高清免费版| 亚洲精品视频免费在线观看| 国产欧美日韩成人| 91成人免费在线| 精品久久免费视频| 亚洲手机成人高清视频| 亚洲熟妇一区二区三区| 国产福利一区在线| 潘金莲激情呻吟欲求不满视频| 亚洲久久视频| 久久久天堂国产精品| 日韩欧美二区| 欧美日韩一区二区视频在线 | 日韩精品专区在线影院观看| 欧美一级做a爰片免费视频| 午夜成人免费电影| 激情综合网五月天| 中文字幕亚洲在| 欧美性受xxxx黑人| 久久综合九色综合97_久久久| 99国产精品免费视频| 久久99精品国产麻豆婷婷洗澡| 日韩精品一区二区三区不卡| 亚洲最黄网站| 欧美综合在线播放| 韩日成人在线| 免费在线看黄色片| 欧美va天堂在线| 国产高潮呻吟久久久| 欧美激情偷拍自拍| 亚洲一卡二卡| 日韩不卡一区| 在线免费观看成人网| 日本a口亚洲| 日韩欧美在线一区二区| 精品国内自产拍在线观看视频| 美女被啪啪一区二区| 日韩精品免费一区二区三区竹菊| 国产亚洲一区二区三区在线播放 | 免费一区二区三区在在线视频| 九色丨蝌蚪丨成人| 精品欧美一区二区三区久久久| 国产精品白丝av嫩草影院| 国产丝袜不卡| 亚洲资源网你懂的| 欧美亚洲丝袜| 大色综合视频网站在线播放| 亚洲国产精品一区在线观看不卡 | 久久久久久一区二区三区四区别墅| 国产精品久久色| 久久久精品一区二区毛片免费看| 国产一区欧美二区三区| av在线亚洲一区| 97人人模人人爽人人喊38tv| 凹凸成人在线| 麻豆久久久9性大片| 国产一区二区精品久| 日韩欧美亚洲v片| 欧美wwwww| 久久人妻无码一区二区| 国产日韩亚洲| 99sesese| 高清免费成人av| 国产亚洲无码精品| 国产精品素人视频| 少妇影院在线观看| 精品美女国产在线| 中文字幕人妻一区二区在线视频| 91精品在线免费| 欧日韩在线视频| 一区二区三区四区在线观看视频| 免费在线观看黄| 国产69精品久久久久99| 日韩高清成人| 亚洲一区二区三区久久| 欧美亚视频在线中文字幕免费| 日本成人黄色免费看| 亚洲天堂一区二区三区四区| 青草青青在线视频| 免费高清不卡av| 国产污在线观看| 日本一区二区动态图| 免费看一级一片| 在线视频你懂得一区| 国产美女主播在线观看| 日韩av在线免费看| 美女免费久久| 国产91精品久久久| 国产日韩中文在线中文字幕| 精品国产综合久久| 亚洲国产一区二区在线观看| 国产成人黄色片| 国产一区999| 精品人妻一区二区三区蜜桃视频| 一区二区三区四区蜜桃| 国产免费www| 亚洲精品电影网| 超碰最新在线| 国产精品美女久久久免费| 成人h动漫精品一区二区器材| 午夜精品美女久久久久av福利| 一区精品久久| 日韩在线一区视频| 久久久国产综合精品女国产盗摄| 久草视频中文在线| 欧美精品在线一区二区| 精品无吗乱吗av国产爱色| 欧美国产日韩一区二区| 欧美日一区二区三区| 精品国产乱码久久久久| 欧美日韩天堂| av亚洲天堂网| 国产精品系列在线| 黄色在线视频网址| 日韩精品久久久久久久玫瑰园| 操你啦在线视频| 国产欧美日韩视频| 国产一区毛片| 日本精品一区二区三区四区| 成人激情文学综合网| 青娱乐国产精品| 日韩一级完整毛片| 精品麻豆一区二区三区 | 这里只有精品国产| 亚洲免费影视第一页| 欧美aaaaa性bbbbb小妇| 国产精品日韩欧美一区二区| 欧美日韩蜜桃| 香蕉在线观看视频| 一区二区三区成人| 亚洲国产精品久久人人爱潘金莲| 久久亚洲精品成人| 亚洲成人1区| 国产树林野战在线播放| 久久精品国产亚洲aⅴ| a一级免费视频| 精品视频在线免费| 亚乱亚乱亚洲乱妇| 成人黄色影片在线| 97在线精品| 在线视频观看一区二区| 亚洲久草在线视频| 精品人妻一区二区三区换脸明星 | 免费的成人av| 亚洲 欧美 国产 另类| 在线不卡中文字幕| 成人ww免费完整版在线观看| 亚洲va久久久噜噜噜| 欧美精品1区| 国产原创剧情av| 日韩欧美中文字幕在线观看| 国产天堂素人系列在线视频| 国产精品激情av在线播放| 欧美韩日一区| 熟妇女人妻丰满少妇中文字幕| 亚洲在线观看免费| 亚洲aaa在线观看| 国产精品吹潮在线观看| 欧美顶级大胆免费视频| 韩国三级hd中文字幕有哪些| 午夜av区久久| 国产精品四虎| 91视频九色网站| 亚洲电影在线| 国产ts在线播放| 欧美久久久一区| missav|免费高清av在线看| 欧美乱偷一区二区三区在线| 美女精品一区二区| 久久艹精品视频| 亚洲欧洲国产伦综合| 国产精品成人3p一区二区三区| 欧美中日韩在线| 国产日产欧美一区| 国产ts变态重口人妖hd| 88xx成人精品| 亚洲草久电影| www.免费av| 欧美剧在线免费观看网站| 久久久久黄久久免费漫画| 欧美午夜欧美| 国产河南妇女毛片精品久久久| 免费观看一区二区三区毛片| www国产精品com| 日日天天久久| 人妻巨大乳一二三区| 色偷偷88欧美精品久久久|