GitHub现在能够提供精确的程序代码导航功能

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会加载提交中每个文件的堆栈图,并且整合这些堆栈图,接着从参照节点开始执行路径搜索,算法会确保过程不产生无效路径。