如题,已毕业,自己去写编译器不现实。
有什么好的途径或者书籍推荐。
有感看到:
编译原理:深入研究编译器,去钻研 llvm 当然很难,但是作为一个普通开发人员,编译器的各种选项,不同的优化级别具体优化了哪些,这些总得了解一些。最关键的,动态链接,静态链接,头文件,gcc 的 include 选项、link 选项、define 选项(-I, -L, -D)怎么用,makefile/cmake 怎么写,clang icc gcc 到底真的用起来有什么区别,这些坑作为一个开发人员迟早会遇到,越早遇到,以后碰到坑的时候就能越轻松一些。
链接: https://www.zhihu.com/question/268886169/answer/503722555
1
agagega 2019-01-13 01:55:27 +08:00 via iPhone 4
编译器这个主题其实是很尴尬的。你说你去面试,如果你能和面试官聊你对 Linux 内核的很多了解,就算你的工作和它没关系,也会对你有很多加分,因为很多面试官懂这个也觉得比较重要。但是编译的东西很多面试官自己都不懂,能把 LR 说清楚就不错了,后端优化就更别提了…很多时候从事编译器相关的工作面临的都是工程问题(我想其他领域也是一样),大的算法和框架早就有人搭好了。
至于你说的这些其实更偏向于 Toolchain,如果你平时就是开发 C/C++ 的话,多总结总结就好了。要知道 Clang 启动部分的源码里大部分都在处理命令行参数(可以加 -### 选项看看)。ICC 不了解,GCC 和 Clang 从命令行界面来说其实挺相似的,内部结构差了不少。 |
2
agagega 2019-01-13 02:00:13 +08:00 via iPhone 1
多说两句,我觉得学习计算机的时候模型是很重要的,它会潜移默化间影响你对这个领域知识的吸取方式。在我的理解中,模型就是支撑这个领域知识的基本原则,比如操作系统,你说那么多进程调度、内存管理什么的,这些代码到底怎么运行的,在哪运行的?网络的话,在一个有若干台机器连接的小网络里, 机器之间到底是怎样的方式通信的,A 怎么连到 B ?编译原理也是一样,我最开始就是在网络什么的上面没把这个模型搞清楚,考试、面试吃了很多亏。
另外,其实自己写一个简单的编译器还是有意思的,你可以尝试一下 Cool 语言。 |
3
thedrwu 2019-01-13 02:06:17 +08:00 via Android
这个年代连配置文件都不用自己解析了,直接 json/yaml 甚至绑定一个脚本语言都很普遍。上回手写个 LL 的 parser 还是在几年前,也只是因为需要兼容老程序配置文件。
|
4
zwh2698 2019-01-13 07:35:17 +08:00 via Android 2
楼主,不要太在意,我修改过 c 编译器的前端,写过后端,写过优化,c/c++以主写了 10 年,可我就是写不了 make file,windows 上用 studio,跨平台就用 cmake, xmake. 人生苦短,没有必要学哪些没有多少增益的事情。做 c++你花时间在 c11 和 c17 区别上比这个有价值。
|
5
zwh2698 2019-01-13 07:44:35 +08:00 via Android
包含微软的编译器都是要处理命令行的,编译器的输入,曾经遇到一个 bug 就是编译器命令行的字符太多,超过 os 限制,就无法获取正确信息,编译就失败了,当然这种都是极端情况,一般工具不会产生这样的情况
|
6
oxoxoxox 2019-01-13 07:56:04 +08:00 via Android 3
也许你需要买一本 《程序员的自我修养—链接、装载与库》
|
7
zwh2698 2019-01-13 07:56:57 +08:00 via Android
对了,另外不要觉得编译器处理参数占主要部分
|
8
oxoxoxox 2019-01-13 07:57:46 +08:00 via Android
另外 不同编译器 行为并不完全一致 所以了解个大概知识点就好 具体情况具体分析
|
9
q397064399 2019-01-13 08:54:19 +08:00 1
用编译器编译代码跟编译原理真的没什么太大的关系
|
10
windsage 2019-01-13 09:20:48 +08:00 via Android
龙书 虎书和鲸书,看完你就无敌了
|
11
zn 2019-01-13 09:26:55 +08:00 via iPhone
先补补补离散数学
|
12
bumz 2019-01-13 09:30:29 +08:00 1
前面你说自己编译原理太弱了,以为是指你不会自己写编译器(但是你又说自己去写编译器不现实,矛盾 1 )
后面你又说不懂这些参数 然而这些参数和编译原理又有什么关系呢(矛盾 2 ) |
13
gainsurier 2019-01-13 09:39:27 +08:00 2
原答主的意思是叫你了解如何有效的使用编译器,而不是去造编译器。
如果你想要了解 “编译器的各种选项,不同的优化级别具体优化了哪些,这些总得了解一些。最关键的,动态链接,静态链接,头文件,gcc 的 include 选项、link 选项、define 选项(-I, -L, -D)怎么用,makefile/cmake 怎么写,clang icc gcc 到底真的用起来有什么区别”, 你应该去阅读 gcc,clang,icc 以及 make 和 cmake 的文档,而不是去学习编译原理。以及程序怎么编译、链接、装载、运行,你或许该去看#6 提到的《程序员的自我修养-链接、装载与库》。 |
14
zhaode 2019-01-13 10:01:20 +08:00 via Android
如果是要去开发编译器的岗位,编译器知识需要补;否则看个人兴趣吧
|
15
chinvo 2019-01-13 11:07:25 +08:00 via iPhone
黑书龙书虎书鲸书
|
16
Rasphino 2019-01-13 11:26:19 +08:00 via Android
动态链接、静态链接什么的真的和编译原理有关系吗(
|
17
visonme 2019-01-13 11:28:17 +08:00
如果不是从事编译器相关的工作,其实没有必要强迫自己了解的那么多,那么深,大概知道是怎么个回事就好了
|
18
slack 2019-01-13 12:01:12 +08:00 via Android 1
其实楼主只是需要找一个 man(手动滑稽),再不行就上网找相关的 guide。
|
19
rus4db 2019-01-13 12:20:41 +08:00
如果像我一样单纯是为了兴趣,可以读一读[EOPL]( http://www.eopl3.com/)和[TAPL]( http://www.cis.upenn.edu/~bcpierce/tapl/)。
龙书这些工程性比较强,用到的时候再读也不迟。 |
20
shijingshijing 2019-01-13 12:38:24 +08:00 via iPhone
想学屠龙技能,可惜世上没多少龙了。
|
21
Mistwave 2019-01-13 12:40:31 +08:00 via iPhone
《编程语言实现模式》
这个书很好,我最近正在读 |
22
abcbuzhiming 2019-01-13 13:19:33 +08:00
我曾经有段时间很沉迷这个领域,但是我后来我发现在这上面投入精力真不如把精力投入到数学上,基本上优秀的编译器的一些技术来源都来自数学上的研究和进步
|
23
zwyc 2019-01-13 13:39:32 +08:00 via Android
楼主对编译原理有点偏差。如果你想弄懂编译原理,不是应该是去理解编译器如何做解析,做平台无关优化,做代码生成。
不是你说的动态链接,编译选项这样的事情。除了楼上推荐的链接装载的书,我也推荐一书'深入理解计算机系统'。 |
24
red0range 2019-01-13 13:51:41 +08:00
你先说为什么要补
目标-理论-方法 从 c++转到 java 之后基本没碰到过 gcc 什么事,有空看龙虎鲸还不如看点 jvm 顺便那个知乎题目的回答看看就好,你需要先搞清你是从事的基础架构还是业务,业务的话你照那个回答去学很大概率会 gg |
25
realpg 2019-01-13 18:09:57 +08:00
编译器优化和编译原理有啥关系……
|
26
chenyu0532 2019-01-13 21:15:58 +08:00
我觉得数据结构和设计模式才是我工作中用的最多的,至于编译原理,我的工作深度还远远用不到。。
|
27
mightofcode 2019-01-15 21:16:06 +08:00
学这个对你现在的工作有啥用处?
|