如何探测代码语言?

2013-09-07 15:43:36 +08:00
 breeswish
想做一个自动编译并执行工具(代码从网页端输入的,因此不包含扩展名),编译/解释执行范围是C++(C), Pascal, Python, Ruby, Java, JavaScript, C#等。我希望简化流程,即用户只需输入代码,不需要自己去选择语言,也能正确编译/解释执行。

(由于C++编译器可以编译C,因此可以不需要区分C++与C)

爆栈上有一个比较类似的问题:http://stackoverflow.com/questions/475033/detecting-programming-language-from-a-snippet

不过我这里的情况是代码比较完整,它99%是某一个编译器能够编译成功的代码,那么如何对它进行代码语言探测?

=======

我想把它放在JavaScript前端层面来实现,因此可能Generate AST这种庞大的solution不是很有用。

我想到的比较快速的方法是语言特征检测,由于代码完整,因此语言特征可能会很明显。但是准确性如何就不得而知了。

另一种方法(highlight.js)是用每个语言的highlighter渲染一遍,看哪个语言渲染到的比较多。然而这显然很不准确。。比如说{}在C++里是blocks,然而在Pascal里是comments,渲染为Pascal的时候,成功渲染(着色)量不见得比C++少。

不知大家有什么想法?
4076 次点击
所在节点    程序员
20 条回复
orzfly
2013-09-07 15:50:24 +08:00
breeswish
2013-09-07 15:53:30 +08:00
@orzfly 它主要是基于扩展名探测的
luikore
2013-09-07 16:21:58 +08:00
@breeswish 不是, linguist 综合了各种分析方法, 扩展名和首行等特征猜不出来的话, 就用贝叶斯网络做分类的.
GordianZ
2013-09-07 16:38:20 +08:00
直接编译说不定还快点……
breeswish
2013-09-07 16:42:29 +08:00
@GordianZ 你是说实现起来快一些么233333
GordianZ
2013-09-07 16:44:50 +08:00
@breeswish 去检测语言也是要做语法分析的,每个都分析一遍不如直接让编译器做了算了……
Perry
2013-09-07 16:50:26 +08:00
我觉得简化流程的想法很好,但是在前端做识别语言的处理话会很难(目前也没有最简便的方法,或者说要做的通吃很多语言会很有压力,也做不到很精准);这个时候我觉得应该让用户自己去选择,作为用户的角度来说也不是什么特别麻烦的事情。
clippit
2013-09-07 17:25:42 +08:00
记得以前看到过有人写了一段代码,可以同时当成好几种语言成功编译或执行
Kabie
2013-09-07 17:50:03 +08:00
@clippit SO上的404页就有这么一段……
@breeswish 最简单的办法就是粗略的自动检测但是给用户选择的机会……然后对用户更改默认值的次数做一下统计……如果实际检测的成功率太低再尝试换用不同的方法
rwx
2013-09-07 19:19:39 +08:00
pretty是直接把pre标签里的代码按探测的语言进行着色,但是没研究过代码,不知道是不是真的有语言探测,还是其它的什么机制
breeswish
2013-09-07 20:06:56 +08:00
@rwx 你是说Google的那个js highlighter么~?那个好像是有一个“对于未知语言的高亮规则”
breeswish
2013-09-07 20:10:00 +08:00
@GordianZ 嗯。。我就是来寻求不做语法分析的方案的。。
比如对于人来说,人辨认一个代码其实也不是按照语法分析的,不是拿所有已知的语言进行一遍语法分析,而是根据一些特征来判断,比如见到了#include,并且到处都是花括号什么的,直接就会觉得这是个C/C++,而如果见到满屏幕的begin end和prodecure,以及:=之类的,就会觉得是个pascal;而看到def \n xxx \n end等等可能就会觉得是个ruby。我希望能编程来实现这个~
alexapollo
2013-09-08 00:19:19 +08:00
为啥不是语法分析。其实你想做的就是简版的NLP。

NLP分两种:
1、基于规则
2、基于统计

现在的NLP领域仍然是基于规则的胜率更高,统计还有很长的路要走。
更何况programming language有非常明确的规则,可以很简单的识别出来。

统计当然也可以做,但现在都是非工程化的。
kfll
2013-09-08 00:25:32 +08:00
我觉得在这方面,不选择语言是吃力不讨好的...
miaoever
2013-09-08 00:40:10 +08:00
stackoverflow 上的那个答案其实就挺好的,LZ 不妨试试。贝叶斯分类器实现很简单,但是效果往往会非常好。
hooluupog
2013-09-08 08:51:39 +08:00
google内部倒是有可以分析和编译多种语言的工具(c/c++/python/java),我觉得lz可以去知乎上提问,邀请王垠来解答下,他应该对这方面比较了解。
breeswish
2013-09-08 09:47:51 +08:00
@miaoever !Good,我会尝试一下 =v=
yangff
2013-09-08 20:05:08 +08:00
@breeswish 用LLVM编译几份编译器(解释器)
https://github.com/kripken/emscripten/
然后妥妥的。
Mutoo
2013-09-08 22:02:51 +08:00
呵呵,你让那些有多个版本的语言怎么办,比较 python2.x python3.x actionsctip1.0/2.0/3.0
这种事让用户去做最好了,错了责任是他们的。
breeswish
2013-09-08 23:17:04 +08:00
@yangff = = 这货试过。。时间不能忍。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/81660

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX