浅谈 language server LSIF SARIF Babelfish Semantic Tree-sitter Kythe Glean等
注:本人做过静态代码分析,也算是做过code intelligence,两者互有交叉,所以这里将涉及到的有意思的东西记录下来,未来有精力再依次对这些项目进行介绍
文章目录
- 什么是language server protocol
- JSONRPC
- LSIF(Language Server Index Format)
- SARIF(Static Analysis Results Interchange Format)
- SASP(Static Analysis Server Protocol)
- Semmle QL
- Babelfish(*注:source{d}已经凉凉,网址已然打不开了*)
- Semantic
- [How we parse source code into ASTs](https://github.com/github/semantic/blob/master/docs/why-tree-sitter.md)
- Kythe
- tree-sitter
- parser相关补充
- LL(Left-to-right, Leftmost derivation)
- LR(Left-to-right, Rightmost derivation in reverse)
- Glean
- [Responsive compilers](https://www.youtube.com/watch?v=N6b44kMS6OM)
- 总结
- 未来待学习
什么是language server protocol
注:这里复述我之前的总结
LSP(Language Server Protocol)是微软在开发visual studio code中针对Language Server设计的一种协议,关于设计中的抉择,在文章《Language Server Extension Guide》有详细介绍。
下面我粘贴了这篇文章中的一些描述,采用Language Server的原因主要分为如下三点:
- 不同语言的language server在实现时,通常采用它们自身的语言,例如C++的language server Clangd就是C++实现的。而VSCode只自带了Node.JS的运行时。
- language server通常是资源密集型的,一言不合就要重新编译整个源码文件,所以就有将langauge server运行放在远端的需求
- 最后从 M(编辑器) * N(language server实现) 转化成了 M(编辑器) + N(language server实现)
注:由于language server的是编译器的子集,简单的例如符号跳转,diagnostics等功能,编译前端就可以实现,但是另外的一些功能,例如analysis,则需要编译器偏后端的部分实现。由于编译器通常是native programming language实现的,所以language server的实现也会基于现有的编译器实现
First, Language Servers are usually implemented in their native programming languages, and that presents a challenge in integrating them with VS Code which has a Node.js runtime.
Additionally, language features can be resource intensive. For example, to correctly validate a file, Language Server needs to parse a large amount of files, build up Abstract Syntax Trees for them and perform static program analysis. Those operations could incur significant CPU and memory usage and we need to ensure that VS Code’s performance remains unaffected.
Finally, integrating multiple language toolings with multiple code editors could involve significant effort. From language toolings’ perspective, they need to adapt to code editors with different APIs. From code editors’ perspective, they cannot expect any uniform API from language toolings. This makes implementing language support for M languages in N code editors the work of M * N.
个人认为 language server protocol 或者类似的概念在云时代会越来越重要,未来的程序员的开发会越来越摆脱本地的限制,从开发到部署都会在云上实现,这是不可扭转的趋势,而 language server protocol 或者类似的概念会在其中扮演越来越重要的作用。
JSONRPC
注:这里复述我之前的总结
由于LSP是基于JSONRPC2实现的,所以JSONRPC的概念是language server中非常重要的一环。由于自己不是后端工程师,对网络不是很熟,所以这里没有什么经验可谈。只是知道了remote procedure call这种抽象后,自己以前对什么是程序以及程序的执行理解的太肤浅了(这就是学习没有举一反三的原因,没有抽象出本质,caller和callee只是一种约定,完成约定就行,即使不同编程语言也OK)
RPC的核心就是以下三点:
- Call ID的映射,如何唯一确定callee的ID
- 序列化和反序列化,由于参数等信息不是通过栈(或者本机内存)传递,所以就需要转换到传输介质(例如网络)所要求的格式进行传递
- 网络传输,RPC中的R-remote决定了procedure call需要跨越网络
注:知乎用户用心阁的回答和文章Remote Procedure Calls对我的帮助比较大。
LSIF(Language Server Index Format)
LSIF是一种描述程序信息的格式,目前主要用于code intelligence的领域,例如Code intelligence with LSIF 和 Rich code navigation。
The purpose of the Language Index Format (LSIF) is it to define a standard format for language servers or other programming tools to dump their knowledge about a workspace. This dump can later be used to answer language server LSP requests for the same workspace without running the language server itself. - Language Server Index Format
LSIF确定了从程序中提取出来的程序信息的格式,这个所谓的格式有很多:
- AST也算是一种表示程序的格式,但AST有下面两个问题
- 编程语言相关,保留的语言细节太多
- 比较原始,不能为programming tools直接提供信息
- 虽然有通用的AST,例如Babelfish,但AST还不是一个好的选择 - SARIF(Static Analysis Results Interchange Format),但这只是静态代码分析工具之间交互的格式,太过于针对特定领域
- Semmle(我不太确定Semmle的格式),Semmle应该是将AST+call graph + cfg等存到数据库中,不够通用。
- Google的Kythe也定义了类似的schema来抽象出程序的内部结构。
注:Kythe的发起者是牛人Steve Yegge,也是就会王垠在google工作时的上司,给了王垠比较高的评价浅谈 language server LSIF SARIF Babelfish Semantic Tree-sitter Kythe Glean等相关推荐
- 浅谈SQL Server内部运行机制
原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...
- 浅谈 SQL Server 内部运行机制
对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪些方面是他们的挑战 或者软肋呢? 那就是 ...
- 事物日志恢复 mysql_浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用...
本篇文章是系列文章中的第五篇,是对前一个日志系列的补充篇.如果您对日志的基本概念还没有一个比较系统的了解,可以参看本系列之前的文章: 浅谈SQL Server中的事务日志(一)----事务日志的物理和 ...
- 浅谈SQL Server 数据库的触发器
浅谈SQL Server 数据库的触发器 触发器的特征: 1.触发器是在对表进行增.删.改时,自动执行的存储过程.触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行. 2.触发器 ...
- 浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- 浅谈SQL Server中的事物日志(一)
简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...
- 浅谈SQL Server中统计对于查询的影响
简介 SQL Server查询分析器是基于开销的.通常来讲,查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引.而每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值 ...
- 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写
目录 (一)前言 (二)正文 1. 物化视图(索引视图)与查询重写的基本概念 2. 创建测试环境 (1)建表 (2)写数据 3. 索引视图创建 (1)创建语法 (2)为索引视图创建索引 4. 查询重写 ...
- 浅谈SQL Server数据库分页
数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...
最新文章
- java ip包_java网络抓ip包 首部是个什么情况
- ConfigParser MissingSectionHeaderError: File contains no section headers.
- box unboxing(装箱 拆箱) C#编程指南
- delphi 算术溢出解决方法_性能优化系列:JVM 内存划分总结与内存溢出异常详解分析...
- scala特质_Scala的特质
- 商城报表系统html5,关于html5:推荐这几款主流报表产品
- 【java】java 并发编程 CyclicBarrier 源码分析
- Script的加载方法小结
- 【数据仓库】数据集市
- css3 圣诞红包雨效果
- 支持javascript的ppt软件_有哪些辅助工具,可以让PowerPoint软件更强大?
- 位运算实现求一个数的相反数
- OSS回源的几种方式和应用场景
- css3 描两个边,CSS3 / 指定四条边中图像的显示方法 - 汇智网
- RTP 发送PS流工具(已经开源)
- 上面一个星星下面一个r_谁能告诉我微博那个红色五角星有个R?
- 如何做好软文推广?软文推广有哪些宣传平台值得推荐
- java会导致蓝屏么_原来有这么多原因会导致电脑蓝屏啊
- 2022-09-15 mysql列存储引擎-语法树转换
- php9宫格抽奖程序_PHP实现抽奖功能实例代码
热门文章
- 浅谈SQL Server内部运行机制