大学的时候压根没有学习这门课,不过我估计那个时候就算学习也是白学,根本不知道它是干什么的。后来因为项目的原因(一个是C语言编译器的项目,一个是数据库的SQL引擎的项目)拿起来书啃了点,才对这个东西有些简单的了解。
想要了解这个东西必须先得弄清楚两个概念:
编程语言、 机器语言
这里为了简化问题,我们认为C语言就是一个编程语言、 汇编就是机器语言(这里有点狭隘了)。
C语言写出来其实就是一些逻辑控制语句,但是这些语句在一台计算机上并不能执行,因为一台单纯的硬件计算机只能够执行汇编语句,一条汇编完全对应计算机CPU的一条硬件的指令。
那为什么我们C语言写出来的代码经过编译就能够执行了呢? 就是编译器在这里起作用,因为编译器把C语言变成汇编语言,然后才能在计算机上执行。
便是编译这个东西可并不只是把C语言变成了汇编就叫编译, java代码编译成字节码也叫编译, SQL语句编译成执行计划也叫编译。
所以真心这里感觉真心想深入学习编译器的难点在于它的背景知识太多:
比如你想学习C语言编译成汇编的过程,你首先得想想C语言本身有哪些特性? 首先你至少得把C语言学了
第二,至少要学一门汇编,
第三 如果真的要更加深入的话,还要知道一些CPU等硬件知识,(我真正对于编译有理解的是如何把SQL语句编译成数据库的执行计划,)
所以我感觉单独学习编译原理没啥实用的意义,因为编译本身就是连接上下两种语言的一个桥梁,把这个当成一个整体来学习,才有意义。
实际上计算机的一些高级语言都有内在的编译器,学习编译原理也可以挑一门高级语言来学习比如python等等。
如果想简单的写一些简单的DSL,可以使用一些现有的工具,非常方便, 比如eclipse项目下面的xtext,就是专门做DSL的,因为是开源项目,不用收费哪里都可下载到,玩玩这个可以对一些词法分析、语法分析、有一些更加直观的认识。这个东西看着工具提供的帮助文档,或者看着里面提供的例子,鼓捣半个月到一个月,可以加深对编译原理的认识。但是如果想做工程,这些还是远远不够。