github/semantic
GitHub: github/semantic
semantic 是一个用于多语言源代码解析、分析和差异比较的 Haskell 库与命令行工具。
Stars: 9041 | Forks: 458
**注意**:_GitHub 不再支持或更新此仓库。如果您希望自己继续开发此代码,我们建议您 fork 它。_
# Semantic
`semantic` 是一个用于解析、分析和比较源代码的 Haskell 库和命令行工具。
赶时间?请查看我们关于 [`semantic` 命令行工具示例用法](docs/examples.md) 的文档。
| 目录 |
| :------------- |
| [用法](#usage) |
| [语言支持](#language-support) |
| [开发](#development) |
| [技术与架构](#technology-and-architecture) |
| [许可协议](#licensing) |
## 用法
运行 `semantic --help` 获取完整的最新选项列表。
#### 解析
```
Usage: semantic parse [--sexpression | (--json-symbols|--symbols) |
--proto-symbols | --show | --quiet] [FILES...]
Generate parse trees for path(s)
Available options:
--sexpression Output s-expression parse trees (default)
--json-symbols,--symbols Output JSON symbol list
--proto-symbols Output protobufs symbol list
--show Output using the Show instance (debug only, format
subject to change without notice)
--quiet Don't produce output, but show timing stats
-h,--help Show this help text
```
## 语言支持
| 语言 | 解析 | AST 符号† | Stack graphs |
| :------------- | :---: | :---: | :---: |
| Ruby | ✅ | ✅ | |
| JavaScript | ✅ | ✅ | |
| TypeScript | ✅ | ✅ | 🚧 |
| Python | ✅ | ✅ | 🚧 |
| Go | ✅ | ✅ | |
| PHP | ✅ | ✅ | |
| Java | 🚧 | ✅ | |
| JSON | ✅ | ⬜️ | ⬜️ |
| JSX | ✅ | ✅ | |
| TSX | ✅ | ✅ | |
| CodeQL | ✅ | ✅ | |
| Haskell | 🚧 | 🚧 | |
† 用于 github.com 上的[代码导航](https://help.github.com/en/github/managing-files-in-a-repository/navigating-code-on-github)。
* ✅ — 支持
* 🔶 — 部分支持
* 🚧 — 开发中
* ⬜ - 不适用 ️
## 开发
`semantic` 至少需要 GHC 8.10.1 和 Cabal 3.0。我们强烈推荐使用 [`ghcup`][ghcup] 来沙盒化管理 GHC 版本,因为通过您操作系统的包管理器安装的 GHC 包可能未安装静态链接的 GHC boot libraries。`semantic` 目前仅在 Unix 系统上构建;其他操作系统的用户可能需要使用 [Docker 镜像](https://github.com/github/semantic/packages/11609)。
我们使用 `cabal` 的 [Nix 风格本地构建][nix] 进行开发。要快速开始:
```
git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap
cabal v2-build all
cabal v2-run semantic:test
cabal v2-run semantic:semantic -- --help
```
您也可以使用 [Bazel](https://bazel.build) 构建系统进行开发。要了解更多关于 Bazel 的信息以及它为何能为您带来更好的开发体验,请查阅[构建文档](docs/build.md)。
```
git clone git@github.com:github/semantic.git
cd semantic
script/bootstrap-bazel
bazel build //...
```
`stack` 作为构建工具并未得到官方支持;虽然有[非官方的 `stack.yaml` 支持](https://github.com/jkachmar/semantic-stack-yaml),但我们无法保证其稳定性。
## 技术与架构
在架构上,`semantic`:
1. 根据 [tree-sitter](https://github.com/tree-sitter/tree-sitter) 语法定义生成特定于语言的 Haskell 语法类型。
2. 从文件系统读取 blobs 或通过 protocol buffer 请求接收。
3. 返回 blobs 或执行分析。
4. 以多种受支持格式之一渲染输出。
在其整个生命周期中,`semantic` 利用了许多有趣的算法和技术,包括:
- 论文 [*An O(ND) Difference Algorithm and Its Variations*][SES] 中描述的 Myers 算法 (SES)。
- 论文 [*RWS-Diff: Flexible and Efficient Change Detection in Hierarchical Data*][RWS] 中描述的 RWS。
- Open unions 和 [data types à la carte](https://www.cambridge.org/core/journals/journal-of-functional-programming/article/data-types-a-la-carte/14416CB20C4637164EA9F77097909409)。
- [Abstracting Definitional Interpreters][adi] 的一个实现,并扩展以支持 à la carte 表示的语法项。
## 贡献
欢迎贡献!请参阅我们的[贡献
指南](CONTRIBUTING.md) 以及我们的[行为准则](CODE_OF_CONDUCT.md) 了解
如何参与我们社区的详细信息。
## 许可协议
Semantic 采用 [MIT 许可协议](semantic/LICENSE)。
标签:Haskell, SOC Prime, 云安全监控, 代码分析, 代码解析, 凭证管理, 开发工具, 静态分析