如何最好地检测代码片段中使用的编程语言?
如何最好地检测代码片段中使用的编程语言?
print "Hello"
让我找一下代码。
我没找到这段代码,所以我写了一个新的。虽然有点简单,但对于我的测试来说它可行。目前,如果您输入的Python代码比Ruby代码多得多,则很可能会出现以下提示:
def foo
puts "hi"
end
这段代码是Python(其实是Ruby)的代码。这是因为Python也有一个关键字def
。如果它在Python中看到了1000个def
,在Ruby中看到了100个def
,那么即使puts
和end
是Ruby特有的,它仍可能会说这是Python。你可以通过跟踪每种语言看到的单词并在某处进行除法运算(或者给它相等数量的每种语言的代码)来解决这个问题。
class Classifier
def initialize
@data = {}
@totals = Hash.new(1)
end
def words(code)
code.split(/[^a-z]/).reject{|w| w.empty?}
end
def train(code,lang)
@totals[lang] += 1
@data[lang] ||= Hash.new(1)
words(code).each {|w| @data[lang][w] += 1 }
end
def classify(code)
ws = words(code)
@data.keys.max_by do |lang|
# We really want to multiply here but I use logs
# to avoid floating point underflow
# (adding logs is equivalent to multiplication)
Math.log(@totals[lang]) +
ws.map{|w| Math.log(@data[lang][w])}.reduce(:+)
end
end
end
# Example usage
c = Classifier.new
# Train from files
c.train(open("code.rb").read, :ruby)
c.train(open("code.py").read, :python)
c.train(open("code.cs").read, :csharp)
# Test it on another file
c.classify(open("code2.py").read) # => :python (hopefully)
他人解决的语言检测方法:
Ohloh的方法: https://github.com/blackducksw/ohcount/
Github的方法: https://github.com/github/linguist
Guesslang是一个可能的解决方案:
http://guesslang.readthedocs.io/en/latest/index.html
还有SourceClassifier:
https://github.com/chrislo/sourceclassifier/tree/master
在一篇博客文章中,我发现了一些无法识别的代码,因此对这个问题产生了兴趣。添加这个答案是因为这个问题在搜索“识别编程语言”时是第一个命中的。
首先,我会尝试找到特定语言的关键词,例如:
"package, class, implements "=> JAVA
"<?php " => PHP
"include main fopen strcmp stdout "=>C
"cout"=> C++
etc...
int i = 5;
int k = 0;
for (int j = 100 ; j > i ; i++) {
j = j + 1000 / i;
k = k + i * j;
}
(提示:可能是多个语言之一。)
您可以尝试分析各种语言,并尝试使用关键字频率分析来决定使用哪种语言,例如在文本中某些关键字集以某些频率出现,则很可能使用的是Java等语言。但我认为您不会得到完全可靠的结果,因为您可以将C语言中的变量命名为与Java中的关键字相同的名称,从而骗过频率分析。
如果您增加了复杂性,您可以寻找结构信息,例如某个关键字总是在另一个关键字之后出现,这将为您提供更多线索。但要设计和实施这些方法也会更加困难。
rails new <name-your-app-dir>
并进入该目录。运行 Rails 应用程序所需的一切都已经在那里)。gem 'github-linguist'
。sudo apt-get install ruby-dev
)。sudo apt-get install cmake
)。gem install github-linguist
(如果出现需要icu的错误,请执行sudo apt-get install libicu-dev
,然后再尝试一次)。sudo apt-get update
或sudo apt-get install make
或sudo apt-get install build-essential
)。app/test.tpl
,但如果您知道代码片段的扩展名,请使用该扩展名而不是.tpl
。如果您不知道扩展名,请不要使用)。现在将您的代码片段粘贴到此文件中。转到命令行并运行bundle install
(必须在应用程序目录中)。然后运行linguist app/test.tpl
(更一般地说,是linguist <path-to-code-snippet-file>
)。它会告诉您类型、MIME类型和语言。对于多个文件(或与ruby/rails应用程序一般使用),可以在应用程序目录中运行bundle exec linguist --breakdown
。这取决于你有哪种类型的代码片段,但我会通过一系列的标记器运行它,并查看它在哪种语言的BNF下是有效的。
如果您想快速将一小段代码粘贴到网页表格中,而不是通过编程实现,那么这个网站似乎非常擅长识别语言:http://dpaste.com/
alert('hello world!');
被猜测为C++。 - Jackalert()
的函数,那么alert('hello world!');
可能是有效的C++代码... 它可能是根据语法猜测的,而不是每种语言的标准库。 - drkvogelg++ -fpermissive
编译,由单引号括起来的多个字符的“字符串”会生成一个警告,而不是错误 - 所以这是有效的C ++,尽管不好。 - drkvogel