V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ChaselPansy
V2EX  ›  程序员

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

  •  
  •   ChaselPansy · Jan 13, 2019 · 7523 views
    This topic created in 2666 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    后面你又说不懂这些参数

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

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

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

    目标-理论-方法

    从 c++转到 java 之后基本没碰到过 gcc 什么事,有空看龙虎鲸还不如看点 jvm
    顺便那个知乎题目的回答看看就好,你需要先搞清你是从事的基础架构还是业务,业务的话你照那个回答去学很大概率会 gg
    realpg
        25
    realpg  
    PRO
       Jan 13, 2019
    编译器优化和编译原理有啥关系……
    chenyu0532
        26
    chenyu0532  
       Jan 13, 2019
    我觉得数据结构和设计模式才是我工作中用的最多的,至于编译原理,我的工作深度还远远用不到。。
    mightofcode
        27
    mightofcode  
       Jan 15, 2019
    学这个对你现在的工作有啥用处?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2564 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 07:47 · PVG 15:47 · LAX 00:47 · JFK 03:47
    ♥ Do have faith in what you're doing.