【图灵学院】在GitHub上又找到一个堪称神器的命令行工具

GitHub上的实用工具还是挺多的,这不,又让我找到了一个堪称神器的支持多语言的命令行工具——SemanticSemantic是一个解析,分析和比较多种语言源代码的命令行工具,也是一个Haskell库。

平常解析源代码也算是程序员的家常便饭了,如果有个工具帮你一把那是最好不过的了,Semantic具体如何使用,猿妹下面一说你就明白了:

首先呢,运行semantic –help获取最新的完整选项列表:

解析

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

Semantic使用树形图来生成解析树,现在我们拿一个简单的程序来解析你会看的更明了,打开test.A.py文件,粘贴如下:

def Foo(x):
    return x
print Foo(“hi”)

现在,让我们生成一个抽象语法树(AST)

$ semantic parse test.A.py
(Statements
  (Annotation
    (Function
      (Identifier)
      (Identifier)
      (Return
        (Identifier)))
    (Empty))
  (Call
    (Identifier)
    (Call
      (Identifier)
      (TextElement)
      (Empty))
    (Empty)))

默认的s-expression输出是一种很好的格式,可以快速可视化代码结构。我们可以看到有一个声明的函数,然后有一个调用表达式,嵌套在另一个调用表达式中,它与函数调用print和Foo。你还可以使用其他的输出格式。

DIFF(比较)

Usage: semantic diff ([–sexpression] | [–json] | [–json-graph] | [–toc] |
                     [–dot] | [–show]) [FILE_A] [FILE_B]
  Compute changes between paths

Available 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 module

Available 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.

语言支持

多语言支持是Semantic的一大优势,目前支持Ruby、JavaScript、typescript、Python、Go、PHP、Java等主流编程语言都支持

Semantic最低要求GHC 8.6.4和Cabal 2.4,建议使用ghcup沙箱GHC版本,为通过操作系统的软件包管理器安装的GHC软件包可能无法安装静态链接版本的GHC启动库。

git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap
cabal new-build
cabal new-test
cabal new-run semantic — –help

创建者使用cabal的Nix风格的本地版本进行开发。要快速入门,可以按照以上操作。

目前,semantic已经在GitHub上获得 8000 个Star,450个Fork,感兴趣的可以到GitHub上查阅更多详情。