GitHub宣布對所有公共和私有的Python儲存庫,啟用更加精確的程式碼導覽功能。這個新的精確程式碼導覽功能,底層應用由GitHub所建立的堆疊圖(Stack Graphs)開源框架,能以宣告式的領域特定語言(DSL),替程式語言定義名稱綁定規則。藉由使用堆疊圖,不需要儲存所有者的配置,也不須進入建置和其他CI作業,GitHub就能對儲存庫生成程式碼導覽資料。

程式碼導覽是指一系列的功能,可讓開發者深入探索程式碼中的關係和相依項目,基本的程式碼導覽功能像是跳轉到定義,以及查詢所有參照。兩者的功能都是基於程式碼中的名稱,程式語言讓開發者能夠定義函式、類別、模組、方法和變數名稱,這些物件都具有名稱,使得開發者可以在程式碼其他部分參照。

程式碼導覽的查詢參照功能,如同下圖,在這個Python模組中,檔案末端的broil,是對檔案中藍色broil函式定義的參照,而GitHub的目標,是收集關於定義和參照列表的資訊,並且確保每個參照都能對應到GitHub上託管的程式碼定義。

不過,這項工作卻充滿挑戰,官方提到,上圖的例子因為情況比較簡單,能夠直覺地看出定義和參照的關係,不過在實際情況,並不總是那麼簡單。像是可能存在多個同名定義,因為在Python中,名稱可以相互遮蔽,這代表broil參照必會是兩個定義中的後者。

不過這些規則又因程式語言不同而相異,像是在Rust中,頂級定義不允許相互遮蔽,但是局部變數卻可以,因此如果根據Rust語言規範,將上述案例從Python轉換到Rust上便是錯誤的。而這只是單個檔案的案例,在實際的情況,程式碼更可能被拆分成多個檔案、套件甚至是存在不同儲存庫中,程式語言允許開發者引用位置遙遠的定義,而且這同樣在不同的語言,有不同的行為。

另一個困難是規模,GitHub想對所有託管的儲存庫都提供程式碼導覽服務,並希望儲存庫擁有者不需要手動進行配置。在GitHub中,每分每秒都有大量的程式碼提交到平臺上,且不少提交可能只有少量檔案被修改,因此這項新功能還必須要能支援增量處理和儲存。

面對這些建立程式碼導覽功能的挑戰,GitHub運用台夫特理工大學Eelco Visser研究小組的範圍圖(Scope Graphs)框架,藉由創建堆疊圖來解決這些問題。運用堆疊圖,GitHub實現了跳轉到定義功能,當用戶點擊參照,GitHub會載入提交中每個檔案的堆疊圖,並且合併這些堆疊圖,接著從參照節點開始執行路徑搜尋,演算法會確保過程不產生無效路徑。

熱門新聞

Advertisement