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

2024-02-27 16:13:53 +08:00
la2la  la2la
我是 18 年毕业就转行做计算机方面,在五年的工作中自学了计算机原理跟计算机网络都对实际的开发工作帮助挺大的

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

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

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

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

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

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

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

https://build-your-own.org/#section-compiler
xuanbg
2024-02-28 08:38:19 +08:00
给 sql 加自定义语法不如自己多写点自定义函数或者存储过程来得方便实用
ZGame
2024-02-28 08:40:32 +08:00
你说的应该是数据存储厂商应该关心的, 你想要增加一些扩展语法,是希望自己做计算引擎还是翻译到具体的某种数据库厂商的 sql 上去?
而且这类 dsl 需求已经在大数据领域很常见了 ,可以去看看 flink sql 或者 apache 方解石
ZGame
2024-02-28 08:41:14 +08:00
用一套 sql 语法来查询不同数据库,这个去看看 apache 方解石 就可以了

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

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

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

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

© 2021 V2EX