GitHub趋势榜榜首:超级命令行工具Semantic,比较解析源代码

电子说

1.2w人已加入

描述

作为开发者,天天都要与源代码打交道,面对不同版本,不同语言的代码进行比较、分析,理顺开发流程往往是开发者的日常。近日,一款名为Semantic的源代码分析比较工具一举登上了GitHub趋势榜榜首,一起来看看!

作为开发者,你是否对不同源代码段之间的解析和比较困惑不已呢?今天的GitHub趋势热榜上排名第一的帖子介绍了一款多语言支持的“超级命令行工具”Semantic,或许可以解决这个令人头疼的问题。

Semantic是一个Haskell库,也是一个用于分析和比较源代码的命令行工具。

本文将从应用功能、语言支持、开发、技术和架构、许可等五个方面介绍Semantic这款工具。

用途及功能:源代码解析、比较、图应用

解析(Parse)

Usage: semantic parse ([--sexpression] | [--json] | [--json-graph] | [--symbols] | [--dot] | [--show] | [--quiet]) [FILES.。.] Generate parse trees for path(s)Available options: --sexpression Output s-expression parse trees (default) --json Output JSON parse trees --json-graph Output JSON adjacency list --symbols Output JSON symbol list --dot Output DOT graph parse trees --show Output using the Show instance (debug only, format subject to change without notice) --quiet Don‘t produce output, but show timing stats

比较(Diff)

Usage: semantic diff ([--sexpression] | [--json] | [--json-graph] | [--toc] | [--dot] | [--show]) [FILE_A] [FILE_B] Compute changes between pathsAvailable options: --sexpression Output s-expression diff tree (default) --json Output JSON diff trees --json-graph Output JSON diff trees --toc Output JSON table of contents diff summary --dot Output the diff as a DOT graph --show Output using the Show instance (debug only, format subject to change without notice)

图(Graph)

Usage: semantic graph ([--imports] | [--calls]) [--packages] ([--dot] | [--json] | [--show]) ([--root DIR] [--exclude-dir DIR] DIR:LANGUAGE | FILE | --language ARG (FILES.。. | --stdin)) Compute a graph for a directory or from a top-level entry point moduleAvailable options: --imports Compute an import graph (default) --calls Compute a call graph --packages Include a vertex for the package, with edges from it to each module --dot Output in DOT graph format (default) --json Output JSON graph --show Output using the Show instance (debug only, format subject to change without notice) --root DIR Root directory of project. Optional, defaults to entry file/directory. --exclude-dir DIR Exclude a directory (e.g. vendor) --language ARG The language for the analysis. --stdin Read a list of newline-separated paths to analyze from stdin.

多语言支持:Python、Go,Java均可使用

源代码

开发环境及版本要求

我们使用cabal的Nix风格的本地版本进行开发。要快速入门,可以按照下图中的步骤:

git clone git@github.com:github/semantic.gitcd semanticgit submodule sync --recursive && git submodule update --init --recursive --forcecabal new-updatecabal new-buildcabal new-testcabal new-run semantic -- --help

Semantic最低要求GHC 8.6.4。我们建议使用ghcup沙箱GHC版本。我们使用的版本基于StackageLTS版。目前的LTS版本是13.13。如果您愿意,也可以使用堆栈版。

技术和架构特征

从架构上看,Semantic具备以下特点:

可以读取blob。

可以为树形保护程序的blob生成解析树(用于编程工具的增量解析系统)。

将这些树分配为语法的通用表示。

执行分析,计算差异,或仅返回解析树。

以多种支持格式呈现输出。

Semantic利用了许多有趣的算法和技术:

Myers算法(SES)如论文An O(ND)差分算法及其变化所述

RWS-Diff:在分层数据中灵活高效的变化检测中描述的RWS。

可以单独打开Union和数据类型。

简要定义解释器(Abstracting Definitional Interpreters)的实现。可扩展为基于语法术语的单点表示。

关于授权许可

Semantic基于MIT许可。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分