编译原理太弱了,怎么补?

2019-01-13 01:24:00 +08:00
 ChaselPansy

如题,已毕业,自己去写编译器不现实。
有什么好的途径或者书籍推荐。

有感看到:
编译原理:深入研究编译器,去钻研 llvm 当然很难,但是作为一个普通开发人员,编译器的各种选项,不同的优化级别具体优化了哪些,这些总得了解一些。最关键的,动态链接,静态链接,头文件,gcc 的 include 选项、link 选项、define 选项(-I, -L, -D)怎么用,makefile/cmake 怎么写,clang icc gcc 到底真的用起来有什么区别,这些坑作为一个开发人员迟早会遇到,越早遇到,以后碰到坑的时候就能越轻松一些。

链接: https://www.zhihu.com/question/268886169/answer/503722555

6793 次点击
所在节点    程序员
27 条回复
agagega
2019-01-13 01:55:27 +08:00
编译器这个主题其实是很尴尬的。你说你去面试,如果你能和面试官聊你对 Linux 内核的很多了解,就算你的工作和它没关系,也会对你有很多加分,因为很多面试官懂这个也觉得比较重要。但是编译的东西很多面试官自己都不懂,能把 LR 说清楚就不错了,后端优化就更别提了…很多时候从事编译器相关的工作面临的都是工程问题(我想其他领域也是一样),大的算法和框架早就有人搭好了。

至于你说的这些其实更偏向于 Toolchain,如果你平时就是开发 C/C++ 的话,多总结总结就好了。要知道 Clang 启动部分的源码里大部分都在处理命令行参数(可以加 -### 选项看看)。ICC 不了解,GCC 和 Clang 从命令行界面来说其实挺相似的,内部结构差了不少。
agagega
2019-01-13 02:00:13 +08:00
多说两句,我觉得学习计算机的时候模型是很重要的,它会潜移默化间影响你对这个领域知识的吸取方式。在我的理解中,模型就是支撑这个领域知识的基本原则,比如操作系统,你说那么多进程调度、内存管理什么的,这些代码到底怎么运行的,在哪运行的?网络的话,在一个有若干台机器连接的小网络里, 机器之间到底是怎样的方式通信的,A 怎么连到 B ?编译原理也是一样,我最开始就是在网络什么的上面没把这个模型搞清楚,考试、面试吃了很多亏。

另外,其实自己写一个简单的编译器还是有意思的,你可以尝试一下 Cool 语言。
thedrwu
2019-01-13 02:06:17 +08:00
这个年代连配置文件都不用自己解析了,直接 json/yaml 甚至绑定一个脚本语言都很普遍。上回手写个 LL 的 parser 还是在几年前,也只是因为需要兼容老程序配置文件。
zwh2698
2019-01-13 07:35:17 +08:00
楼主,不要太在意,我修改过 c 编译器的前端,写过后端,写过优化,c/c++以主写了 10 年,可我就是写不了 make file,windows 上用 studio,跨平台就用 cmake, xmake. 人生苦短,没有必要学哪些没有多少增益的事情。做 c++你花时间在 c11 和 c17 区别上比这个有价值。
zwh2698
2019-01-13 07:44:35 +08:00
包含微软的编译器都是要处理命令行的,编译器的输入,曾经遇到一个 bug 就是编译器命令行的字符太多,超过 os 限制,就无法获取正确信息,编译就失败了,当然这种都是极端情况,一般工具不会产生这样的情况
oxoxoxox
2019-01-13 07:56:04 +08:00
也许你需要买一本 《程序员的自我修养—链接、装载与库》
zwh2698
2019-01-13 07:56:57 +08:00
对了,另外不要觉得编译器处理参数占主要部分
oxoxoxox
2019-01-13 07:57:46 +08:00
另外 不同编译器 行为并不完全一致 所以了解个大概知识点就好 具体情况具体分析
q397064399
2019-01-13 08:54:19 +08:00
用编译器编译代码跟编译原理真的没什么太大的关系
windsage
2019-01-13 09:20:48 +08:00
龙书 虎书和鲸书,看完你就无敌了
zn
2019-01-13 09:26:55 +08:00
先补补补离散数学
bumz
2019-01-13 09:30:29 +08:00
前面你说自己编译原理太弱了,以为是指你不会自己写编译器(但是你又说自己去写编译器不现实,矛盾 1 )

后面你又说不懂这些参数

然而这些参数和编译原理又有什么关系呢(矛盾 2 )
gainsurier
2019-01-13 09:39:27 +08:00
原答主的意思是叫你了解如何有效的使用编译器,而不是去造编译器。
如果你想要了解
“编译器的各种选项,不同的优化级别具体优化了哪些,这些总得了解一些。最关键的,动态链接,静态链接,头文件,gcc 的 include 选项、link 选项、define 选项(-I, -L, -D)怎么用,makefile/cmake 怎么写,clang icc gcc 到底真的用起来有什么区别”,
你应该去阅读 gcc,clang,icc 以及 make 和 cmake 的文档,而不是去学习编译原理。以及程序怎么编译、链接、装载、运行,你或许该去看#6 提到的《程序员的自我修养-链接、装载与库》。
zhaode
2019-01-13 10:01:20 +08:00
如果是要去开发编译器的岗位,编译器知识需要补;否则看个人兴趣吧
chinvo
2019-01-13 11:07:25 +08:00
黑书龙书虎书鲸书
Rasphino
2019-01-13 11:26:19 +08:00
动态链接、静态链接什么的真的和编译原理有关系吗(
visonme
2019-01-13 11:28:17 +08:00
如果不是从事编译器相关的工作,其实没有必要强迫自己了解的那么多,那么深,大概知道是怎么个回事就好了
slack
2019-01-13 12:01:12 +08:00
其实楼主只是需要找一个 man(手动滑稽),再不行就上网找相关的 guide。
rus4db
2019-01-13 12:20:41 +08:00
如果像我一样单纯是为了兴趣,可以读一读[EOPL]( http://www.eopl3.com/)和[TAPL]( http://www.cis.upenn.edu/~bcpierce/tapl/)。

龙书这些工程性比较强,用到的时候再读也不迟。
shijingshijing
2019-01-13 12:38:24 +08:00
想学屠龙技能,可惜世上没多少龙了。

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

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

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

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

© 2021 V2EX