#编程语言 #语言检测 #检测器 #目录 #文件 #GitHub #语言学家

bin+lib hyperpolyglot

快速编程语言检测器

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 开发工具

Download history 37/week @ 2024-03-11 68/week @ 2024-03-18 23/week @ 2024-03-25 51/week @ 2024-04-01 30/week @ 2024-04-08 61/week @ 2024-04-15 23/week @ 2024-04-22 9/week @ 2024-04-29 8/week @ 2024-05-06 13/week @ 2024-05-13 14/week @ 2024-05-20 23/week @ 2024-05-27 17/week @ 2024-06-03 12/week @ 2024-06-10 15/week @ 2024-06-17 12/week @ 2024-06-24

58 每月下载量
用于 2 crates

MIT/Apache

8.5MB
204K SLoC

hyperpolyglot

一个快速的编程语言检测器。

Hyperpolyglot 是一个基于 GitHub 的 Linguist Ruby 库,用 Rust 编写的快速编程语言检测器。Hyperpolyglot 支持检测文件的编程语言或检测目录的编程语言组成。有关语言检测的更多详细信息,请参阅 LinguistREADME

命令行界面

安装 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也不例外。它的语言检测与Linguistenry相似,对于大多数文件,最大的差异来自需要回退到分类器的文件。可以通过常见的已知文件名、扩展名或遵循启发式方法检测到的文件应接近100%的准确性。

许可

许可方式为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可中定义的,您有意提交并包含在工作中的任何贡献,都应双许可,如上所述,不附加任何额外条款或条件。

依赖

~11–21MB
~290K SLoC