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

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

  •  
  •   ChaselPansy · 2019-01-13 01:24:00 +08:00 · 6483 次点击
    这是一个创建于 1902 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    后面你又说不懂这些参数

    然而这些参数和编译原理又有什么关系呢(矛盾 2 )
    gainsurier
        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 提到的《程序员的自我修养-链接、装载与库》。
    zhaode
        14
    zhaode  
       2019-01-13 10:01:20 +08:00 via Android
    如果是要去开发编译器的岗位,编译器知识需要补;否则看个人兴趣吧
    chinvo
        15
    chinvo  
       2019-01-13 11:07:25 +08:00 via iPhone
    黑书龙书虎书鲸书
    Rasphino
        16
    Rasphino  
       2019-01-13 11:26:19 +08:00 via Android
    动态链接、静态链接什么的真的和编译原理有关系吗(
    visonme
        17
    visonme  
       2019-01-13 11:28:17 +08:00
    如果不是从事编译器相关的工作,其实没有必要强迫自己了解的那么多,那么深,大概知道是怎么个回事就好了
    slack
        18
    slack  
       2019-01-13 12:01:12 +08:00 via Android   ❤️ 1
    其实楼主只是需要找一个 man(手动滑稽),再不行就上网找相关的 guide。
    rus4db
        19
    rus4db  
       2019-01-13 12:20:41 +08:00
    如果像我一样单纯是为了兴趣,可以读一读[EOPL]( http://www.eopl3.com/)和[TAPL]( http://www.cis.upenn.edu/~bcpierce/tapl/)。

    龙书这些工程性比较强,用到的时候再读也不迟。
    shijingshijing
        20
    shijingshijing  
       2019-01-13 12:38:24 +08:00 via iPhone
    想学屠龙技能,可惜世上没多少龙了。
    Mistwave
        21
    Mistwave  
       2019-01-13 12:40:31 +08:00 via iPhone
    《编程语言实现模式》
    这个书很好,我最近正在读
    abcbuzhiming
        22
    abcbuzhiming  
       2019-01-13 13:19:33 +08:00
    我曾经有段时间很沉迷这个领域,但是我后来我发现在这上面投入精力真不如把精力投入到数学上,基本上优秀的编译器的一些技术来源都来自数学上的研究和进步
    zwyc
        23
    zwyc  
       2019-01-13 13:39:32 +08:00 via Android
    楼主对编译原理有点偏差。如果你想弄懂编译原理,不是应该是去理解编译器如何做解析,做平台无关优化,做代码生成。

    不是你说的动态链接,编译选项这样的事情。除了楼上推荐的链接装载的书,我也推荐一书'深入理解计算机系统'。
    red0range
        24
    red0range  
       2019-01-13 13:51:41 +08:00
    你先说为什么要补

    目标-理论-方法

    从 c++转到 java 之后基本没碰到过 gcc 什么事,有空看龙虎鲸还不如看点 jvm
    顺便那个知乎题目的回答看看就好,你需要先搞清你是从事的基础架构还是业务,业务的话你照那个回答去学很大概率会 gg
    realpg
        25
    realpg  
       2019-01-13 18:09:57 +08:00
    编译器优化和编译原理有啥关系……
    chenyu0532
        26
    chenyu0532  
       2019-01-13 21:15:58 +08:00
    我觉得数据结构和设计模式才是我工作中用的最多的,至于编译原理,我的工作深度还远远用不到。。
    mightofcode
        27
    mightofcode  
       2019-01-15 21:16:06 +08:00
    学这个对你现在的工作有啥用处?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   981 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:26 · PVG 04:26 · LAX 13:26 · JFK 16:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.