V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
breeswish
V2EX  ›  程序员

如何探测代码语言?

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

    现在的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   ·   实用小工具   ·   1025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:50 · PVG 03:50 · LAX 11:50 · JFK 14:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.