V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
la2la
V2EX  ›  程序员

转行程序员如何学习编译原理基础(就是语法语义分析不涉及很深)感觉太抽象了完全无法入手但是又有实际需求

  •  
  •   la2la · 2024-02-27 16:13:53 +08:00 · 3330 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是 18 年毕业就转行做计算机方面,在五年的工作中自学了计算机原理跟计算机网络都对实际的开发工作帮助挺大的

    现在有需求比如:
    给标准的 sql 增加一些自定义的语法;
    用一套 sql 语法来查询不同数据库;
    给不支持 sql 的工具开发开发简单的查询引擎;

    之前学习原理跟网络的时候用虚拟机操作操作看看教程背背八股文基本就够工作面试需要的了,但是现在面对处理这些 SQL 语句我都是用正则处理的,但是随着需求越来越多正则越来越复杂所以感觉还需要用一些类似于 antlr 这类的工具去做,但是现在网上关于这些编译之类的资料比较少很多都是很杂乱的
    所以有没有推荐系统学习一下这个相关知识的书或者文章,我的需求是能系统的学习关于编译相关的名词的含义,能够解析语法书并能分析语义是否正确就差不多够用了
    第 1 条附言  ·  2024-02-29 16:01:35 +08:00
    感谢各位的建议,我感觉学习一下编译原理前端的一部分知识,再加上 calcite 或者 antlr 这类的工具就能满足我的需求了
    27 条回复    2024-02-29 17:10:24 +08:00
    xianbing278
        1
    xianbing278  
       2024-02-27 17:27:02 +08:00   ❤️ 1
    😂你说的这些我都跟听天书了,你已经掌握的内容我感觉我都还要学一段时间,我也是做了 5 年
    c3de3f21
        2
    c3de3f21  
       2024-02-27 17:44:11 +08:00
    c3de3f21
        4
    c3de3f21  
       2024-02-27 17:45:05 +08:00
    上面两个结合看看怎么用,集成到你项目里
    Betsy
        5
    Betsy  
       2024-02-27 17:54:29 +08:00 via iPhone
    calcite 很容易完成不同数据源 sql 的转换,不过想二开可不容易呐。antlr4 的话可以看下 https://github.com/apache/shardingsphere/tree/master/parser/sql/dialect ,这个会简单点
    ufo5260987423
        6
    ufo5260987423  
       2024-02-27 18:11:50 +08:00
    antlr+*BNF 基本上能做好词法解析了,不过我感觉你是想在语法,即 syntax 基础上延伸。这个的确不好弄,我这里用 lisp 语言举例,因为 lisp 的 AST 和代码是同构的——syntax 扩展,实际上等于写 lisp 宏。

    在 sql 层面,你加新的语法,就等于写了 lisp 宏以后,还要往 lexer 层面加东西,等于拓展原有的 BNF 。这个事情怎么说呢?比如 C++,它的标准的拓展就是一个逐步增加新语法的过程,实际上 C++的词法解析也的确是非常复杂,甚至效率很低的。
    hangbale
        7
    hangbale  
       2024-02-27 18:19:12 +08:00
    b 站上面有编译原理理论层面的公开课,但离实际的工程比较远,需要再看下如何手写 compiler 的书
    namonai
        8
    namonai  
       2024-02-27 19:18:59 +08:00
    搜一下《 Engineering a compiler 》
    a7851578
        9
    a7851578  
       2024-02-27 19:56:18 +08:00   ❤️ 3
    给标准的 sql 增加一些自定义的语法 -> 如何保证兼容性?做个新数据库吗?
    用一套 sql 语法来查询不同数据库 -> 难度很大,需要类似 sql 到中间语言再到 sql 的翻译器,参考 2 和 5 楼的回答。
    给不支持 sql 的工具开发开发简单的查询引擎 -> 为什么需要给工具开发查询引擎?

    我感觉你这里一个问题解决了,就是一篇系统级别的论文。
    xhldtc
        10
    xhldtc  
       2024-02-27 21:20:29 +08:00
    https://csdiy.wiki/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/CS143/
    Donahue
        11
    Donahue  
       2024-02-27 22:44:01 +08:00
    nand2tries
    momocraft
        12
    momocraft  
       2024-02-28 00:18:10 +08:00
    这几个 "需求" 都不简单
    建议放低目标 找个现成的 SQL parser 边用 (改) 边学
    mantouboji
        13
    mantouboji  
       2024-02-28 00:21:20 +08:00
    别难为自己了,还是去找专业的人干吧。人家科班教育不是白学的。
    agagega
        14
    agagega  
       2024-02-28 02:17:50 +08:00   ❤️ 5
    有本书叫《 Engineering a Compiler 》,有中文版《编译器设计》,翻译的也还可以。这本书涵盖了前端到后端的理论,但也比龙书通俗易懂一些,另外章节划分比较完整,不会像有些书一样从头到尾带你写一个语言的编译器。前端里面各种自动机理论看不明白可以跳过,把前端部分看完以后就能理解递归下降、LL 、LR 这些概念了。

    写类似编译器的软件,还有本书叫《编程语言实践模式》,里面提供了很多实用性的套路(或者说设计模式),也算很有帮助。

    你要改 SQL 的话重点其实不在编译原理这里,而是理解 SQL 的完整语法,有些地方不理解还得学一下关系代数。C 语言的语法定义在主流语言算简单的,但也能找到不少大家不了解的阴暗角落。

    查询引擎和编译器关系就不那么大了,虽然说有很多人觉得可以用编译器思路来优化查询,但不做那么深的话基本还是数据库那套理论。其实你用 ANTLR 或者 Bison 这类工具,只需要知道它们解析的局限性就好了。LL 很好理解,LR 可能要稍多花点时间。
    levelworm
        15
    levelworm  
       2024-02-28 02:49:48 +08:00 via Android
    最近也在自己弄这个,不过只能弄玩具语言的 rdp ,sql 这种还是太复杂了。
    cnsdytedison
        16
    cnsdytedison  
       2024-02-28 08:25:28 +08:00 via Android
    貌似 datagrip 就可以直接翻译 sql 方言。但是没详细用过。不过感觉这个需求不是很有用。pojo 框架可以避免大部分 sql 书写需求。
    dayeye2006199
        17
    dayeye2006199  
       2024-02-28 08:26:03 +08:00 via Android   ❤️ 2
    推荐一门课,我看了这个之后学会了搞 sql 扩展

    https://build-your-own.org/#section-compiler
    xuanbg
        18
    xuanbg  
       2024-02-28 08:38:19 +08:00
    给 sql 加自定义语法不如自己多写点自定义函数或者存储过程来得方便实用
    ZGame
        19
    ZGame  
       2024-02-28 08:40:32 +08:00
    你说的应该是数据存储厂商应该关心的, 你想要增加一些扩展语法,是希望自己做计算引擎还是翻译到具体的某种数据库厂商的 sql 上去?
    而且这类 dsl 需求已经在大数据领域很常见了 ,可以去看看 flink sql 或者 apache 方解石
    ZGame
        20
    ZGame  
       2024-02-28 08:41:14 +08:00
    用一套 sql 语法来查询不同数据库,这个去看看 apache 方解石 就可以了
    lff0305
        21
    lff0305  
       2024-02-28 09:24:30 +08:00
    学会用 antlr 就行了,感觉 antlr 不需要特别多的编译原理的东西
    fredweili
        22
    fredweili  
       2024-02-28 10:10:55 +08:00
    要去找英文资料了
    pangdundun996
        23
    pangdundun996  
       2024-02-28 11:03:17 +08:00
    用现成的 parser 库改改吧,拿到 AST 后自己操作,之前写的 sql-to-mongo 的 golang 库就是这个思路: https://github.com/tsfans/sql-to-mongo
    masterclock
        24
    masterclock  
       2024-02-28 11:44:18 +08:00
    Apache calcite 直接搞定吧
    levelworm
        25
    levelworm  
       2024-02-28 21:54:36 +08:00
    @dayeye2006199 我最近在读"Writing Interpreters and Compilers for the Raspberry Pi Using Python"这本书,感觉是最浅显最容易入门的。接下来如果有时间还准备读"Crafting Interpreters"这本书(可以网上免费读: https://craftinginterpreters.com/)

    我觉得这两本书比教科书都容易一些,比较适合我这样的小白入门。
    la2la
        26
    la2la  
    OP
       2024-02-29 15:56:18 +08:00
    @a7851578 对,您说的这些如果做的特别深确实很难,我的需求没有这么深
    1. 例如 FlinkSQL 或者 SparkSQL 有些功能不是很好用,我只想增加几个关键字来实现特定功能,执行还是 Flink 或者 Spark
    2. 例如 HiveSQL 跟其他的一些数据库的 SQL 有些函数名称是不一样的但是功能一样,我想把 Hsql 中相关函数提取出来替换一下就行
    3. 例如查询消息队列,会实现一个简单的 sql 语法然后后面解析查询,也没有啥性能需求能用就行
    我也看了一点关于编译原理的东西,感觉我主要需求编译前端的一部分知识,后端的太难了我也搞不了
    junmoxiao
        27
    junmoxiao  
       2024-02-29 17:10:24 +08:00
    学 antlr4
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5168 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:18 · PVG 17:18 · LAX 01:18 · JFK 04:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.