8 个版本
0.1.7 | 2020年7月26日 |
---|---|
0.1.6 | 2020年7月12日 |
0.1.5 | 2020年5月13日 |
0.1.1 | 2020年4月24日 |
#1645 in 开发工具
58 每月下载量
用于 2 crates
8.5MB
204K SLoC
hyperpolyglot
一个快速的编程语言检测器。
Hyperpolyglot 是一个基于 GitHub 的 Linguist Ruby 库,用 Rust 编写的快速编程语言检测器。Hyperpolyglot 支持检测文件的编程语言或检测目录的编程语言组成。有关语言检测的更多详细信息,请参阅 Linguist 的 README。
命令行界面
安装 cargo install hyperpolyglot
使用 hyply [PATH]
输出
85.00% Rust
15.00% RenderScript
库
作为依赖项添加
[dependencies]
hyperpolyglot = "0.1.0"
检测
use hyperpolyglot;
let detection = hyperpolyglot::detect(Path::new("src/bin/main.rs"));
assert_eq!(Ok(Some(Detection::Heuristics("Rust"))), detection);
分解
use hyperpolyglot::{get_language_breakdown};
let breakdown: HashMap<&'static str, Vec<(Detection, PathBuf)>> = get_language_breakdown("src/");
println!("{:?}", breakdown.get("Rust"));
与 Linguist 的差异
-
分类时没有考虑语言出现的概率。假设所有语言具有相同概率。
-
为 .h 文件添加了一个额外的启发式方法。
-
在检测过程中不考虑 Vim 和 Emacs 模式行。
-
在分解函数中不排除生成和二进制文件。
-
在计算目录的编程语言组成时,使用文件数而不是字节数。
基准测试
- 使用命令行工具 hyperfine 运行基准测试
- 基准测试在一个 8gb 3.1 GHz 双核英特尔酷睿 i5 MacBook Pro 上运行
- enry 是将 Linguist 库移植到 go 的版本
- enry和Linguist都是单线程的
samples目录
工具 | 平均值(毫秒) | 中位数(毫秒) | 最小值(毫秒) | 最大值(毫秒) |
---|---|---|---|---|
hyperpolyglot(多线程) | 1,188 | 1,186 | 1,166 | 1,226 |
hyperpolyglot(单线程) | 2,424 | 2,424 | 2,414 | 2,442 |
enry | 21,619 | 21,566 | 21,514 | 21,855 |
Linguist | 42,407 | 42,386 | 42,070 | 42,856 |
Rust仓库
工具 | 平均值(毫秒) | 中位数(毫秒) | 最小值(毫秒) | 最大值(毫秒) |
---|---|---|---|---|
hyperpolyglot(多线程) | 3,808 | 3,751 | 3,708 | 4,253 |
hyperpolyglot(单线程) | 8,341 | 8,334 | 8,276 | 8,437 |
enry | 82,300 | 82,215 | 82,021 | 82,817 |
Linguist | 196,780 | 197,300 | 194,033 | 202,930 |
Linux内核
- hyperpolyglot在这里如此之快的原因是它为.h文件添加了启发式方法,这显著加快了无法用Objective-C或C++启发式方法分类的.h文件的检测速度
工具 | 平均值(秒) | 中位数(秒) | 最小值(秒) | 最大值(秒) |
---|---|---|---|---|
hyperpolyglot(多线程) | 3.7574 | 3.7357 | 3.7227 | 3.9021 |
hyperpolyglot(单线程) | 7.5833 | 7.5683 | 7.5445 | 7.6489 |
enry | 137.6046 | 137.4229 | 137.1955 | 138.8694 |
准确性
所有编程语言检测器都远非完美,hyperpolyglot也不例外。它的语言检测与Linguist和enry相似,对于大多数文件,最大的差异来自需要回退到分类器的文件。可以通过常见的已知文件名、扩展名或遵循启发式方法检测到的文件应接近100%的准确性。
许可
许可方式为以下之一
- Apache License,版本2.0(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可中定义的,您有意提交并包含在工作中的任何贡献,都应双许可,如上所述,不附加任何额外条款或条件。
依赖
~11–21MB
~290K SLoC