如何探测代码语言? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴AI 生成的内容
breeswish
V2EX    程序员

如何探测代码语言?

  •  
  • &nbp; breeswish 2013-09-07 15:43:36 +08:00 4567 次点击
    这是一个创建于 4419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想做一个自动编译并执行工具(代码从网页端输入的,因此不包含扩展名),编译/解释执行范围是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++少。

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

    NLP分两种:
    1、基于规则

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

    统计当然也可以做,但现在都是非工程化的。
    kfll
        14
    kfll  
       2013-09-08 00:25:32 +08:00   1
    我觉得在这方面,不选择语言是吃力不讨好的...
    miaoever
        15
    miaoever  
       2013-09-08 00:40:10 +08:00   1
    stackoverflow 上的那个答案其实就挺好的,LZ 不妨试试。贝叶斯分类器实现很简单,但是效果往往会非常好。
    hooluupog
        16
    hooluupog  
       2013-09-08 08:51:39 +08:00
    google内部倒是有可以分析和编译多种语言的工具(c/c++/python/java),我觉得lz可以去知乎上提问,邀请王垠来解答下,他应该对这方面比较了解。
    breeswish
        17
    breeswish  
    OP
       2013-09-08 09:47:51 +08:00
    @miaoever !Good,我会尝试一下 =v=
    yangff
        18
    yangff  
       2013-09-08 20:05:08 +08:00
    @breeswish 用LLVM编译几份编译器(解释器)
    https://github.com/kripken/emscripten/
    然后妥妥的。
    Mutoo
        19
    Mutoo  
       2013-09-08 22:02:51 +08:00   2
    呵呵,你让那些有多个版本的语言怎么办,比较 python2.x python3.x actionsctip1.0/2.0/3.0
    这种事让用户去做最好了,错了责任是他们的。
    breeswish
        20
    breeswish  
    OP
       2013-09-08 23:17:04 +08:00
    @yangff = = 这货试过。。时间不能忍。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3098 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:40 PVG 20:40 LAX 05:40 JFK 08:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86