Alibaba Code代码索引技术实践:为Code Review提供本地IDE的阅读体验

Code Review在研发流程中非常重要,但Web界面中Code Intelligence能力的缺失改变了原有的代码阅读习惯,又增加了阅读成本。本文将介绍阿里代码索引技术如何在提高阅读体验的同时兼顾精准性和性能。

Code Review是研发流程中非常重要的一个环节,无论是对于工程师成长还是对于工程质量的提升都是非常有益的。工程师之间通过Code Review对代码设计、实现、规范相关的讨论和交流,促进相互学习和成长。坚持高标准的Code Review,也是追求卓越工程的有效手段。

据统计,研发同学每天都会花大量时间从本地IDE转战到Web界面进行Code Review,但Web界面缺失了很多本地IDE的Code Intelligence能力,这从根本上改变了研发工程师的心理,既改变了原有的代码阅读习惯,又增加了阅读成本。为了提升研发工程师的阅读体验,我们打造了本地IDE般精准的Web-Based代码智能服务。

Alibaba Code是阿里巴巴内部的代码托管及价值衍生平台,旨在提供代码托管、浏览、历史追溯、Issues、Code Review、全局搜索、持续集成、Wiki、代码扫描、可视化报表、Code Compare等智能化的在线服务。本文以此为例,分享了阿里集团内部的代码智能化技术实践,我们还在持续优化,以此应对未来更大规模的研发挑战。

实际效果

下图中演示的是无容器版本的Web IDE能力。传统容器版本的Web IDE存在打开需等待、加载时间长的缺点,而我们通过静态索引预热技术实现了实时计算提供服务、开箱即用,目前已经在集团内部提供百亿数量级的索引服务。

Code Review 中的代码智能服务演示

索引提供的语法服务能力

1. 悬停提示(hover): 鼠标悬浮在字符上即可提示该字符的相关定义信息(如悬浮在一个类名上可以提示该类的全限定类名以及相关注释);Alt + 鼠标悬浮在字符上即可提示该字符的相关定义信息以及定义所在处的上下文。

2. 转到定义(definition): Alt + 鼠标点击字符即可跳转到该字符的定义处(如点击一个类名可以跳转到该类所在文件中的类名处)。

3. 查看引用(reference): Alt + 鼠标点击字符(该字符为定义时才能触发查看引用)即可弹出该字符在哪些地方被引用了(目前支持仓库维度),并且无需跳转到引用之处也能提前预览该引用的上下文。

4. 跨文件(cross file): 以上操作均支持文件之间的跨越。

5. 跨仓库(cross repository): 以上操作均支持仓库之间的跨越(即跨依赖)。

面临的挑战

大部分本地编译器的代码智能是在遵循了LSP(language-server-protocol) 规范的容器中通过实时计算提供服务的,该传统方案达到了编译器级别的精准度,但是在大型代码库上的性能表现并不理想,服务的响应时间会随着代码库变大而明显变大(大型代码库开发者应该深有体会)。该领域做的出色的公司Sourcegraph [ 04 ] (GitLab的CEO Sid Sijbrandij曾评价Sourcegraph,“拥有这个世界上最好的查找定义、查找引用和智能代码导航能力。”)正是因为这个痛点从LSP转向使用LSIF(language-server-index-format) ,很多本地编译器服务商也转向了这种方案。

LSIF通过预先计算静态索引的方式,显著降低了查询延迟的同时也没有牺牲准确性。但是该索引格式在增量的场景表现并不理想,而集团内绝大部分场景是增量,面对集团如此庞大数量的活跃代码库,我们需要探寻适合增量构建特性的索引格式、高速的分布式构建能力、分钟级的索引预热能力、稳定的多版本控制能力、编译器级别的准确度、毫秒级的查询速度。 另外从代码索引的角度出发,源代码的命中率是远大于依赖的命中率的,所以实现依赖的按需索引势在必行,那么如何在提供跨库能力的同时又能节省对依赖的存储资源呢?

我们遇到了如下几个挑战:

  • 如何保障编译器级别的准确度* 如何保障分钟级的构建速度* 如何保证多版本的稳定性* 如何保障毫秒级RT的服务* 如何实现依赖的按需索引如何保障编译器级别的准确度

准确度无疑是最先需要保障的,如果不能保持本地编译器的准确度,就一定会影响到工程师原有的阅读习惯,那么我们将如何提供Web -Based编译器级别的准确度呢?

语法分析

对编译原理有过了解的同学都知道,我们写的大部分都是高级语言(对人类友好但对机器不友好),想要让机器执行最终还需要编译成机器语言(二进制指令),而编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。在这里我们以Java为例,简单理解一下Java源代码编译成字节码的过程。为了降低读者的阅读成本我简化了下图的过程,其中图的左半部分是编程语言通用的。词法分析会将源代码的字符流按照预定规则转变为Token列表,Token是编译过程的最小元素,其中关键字、变量名、字面量、运算符等都可以成为Token,而语法分析则是根据Token流来构造树形表达式(AST࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值