1.编译原理学什么?
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
2.为什么学编译原理?
编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。
3.怎么学编译原理?
如何学习编译原理?个人不太建议一上手就拿起龙书、虎书等等来看。
学过编译原理课程的同学应该有体会,各种文法、各种词法语法分析算法,非常消磨人的耐心和兴致;中间代码生成和优化,其实在很多应用场景下并不重要(当然这一块对于“编译原理”很重要);语义分析要处理很多很多细节,特别对于比较复杂的语言;最后的指令生成,可能需要读各种手册,也比较枯燥。
编译原理是用来做什么的?从源语言提取需要的信息;把源语言翻译成目标语言;自动生成满足一定规范的文本...
有个东西叫DSL(领域专用语言):
从各种格式的数据中提取信息:XML/JSON/CSV/Excel;...
各种格式文本的转换:word/markdown...生成到pdf/html/..
写爬虫从HTML中抓感兴趣的内容;
做网站,实现/修改模板引擎,ORM..
自定义描述测试用例规范的脚本,然后自动生成测试用例...
心理学实验,按一个简单规范(语法)写描述性句子,就能生成相关的场景图;
推荐两本书:《编程语言实现模式》,主要用ANTLR讲解各种例子。《领域专用语言实战》用Ruby、Groovy等语言讲解。(这类书我感觉都写得不怎样,找不到很合适的。。)
现在你开始动手了:
最简单的应用,可以放下词法、语法分析等概念,直接用你会的语言去实现;
有时你会发现写得很”绕“,虽然有了正则表达式会方面不少;
然后你可以试着用各种工具:yacc/lex, ANTLR, flex/bison, parsec, ply..用什么无需计较,顺手、达到目标就行。这些工具通常只是方便词法、语法分析, 语义上的要自己处理;
不满于处理简单的文本,想分析真正意义上的程序语义,或者希望深入理解自己所用工具的原理,这时候你可以去看那些理论的书了;
建议从解释器做起:
基本的解释器,很多应用场景下,熟悉下面几个就够了。
- 行解释器:对于非常简单的”语言“,其实可以逐行解析,边解析边做语义的处理。如我做的一个几何题命题的DSL,就是按规范一行行给题目条件,然后会自动生成解题方程组;
- 在词法、语法解析的过程中做语义处理,经典的例子”计算器解释器“一般都是这样做的。
- 先通过词法和语法分析,生成抽象语法树(AST),然后基于AST做语义分析。
如果对编程语言设计和实现感兴趣,解释器是弄清楚很多概念的窍门,推荐从Scheme学
- 推荐The little schemer,另外R5R标准也才30多页。注意多动手。
- 然后可以看Essential of Programming Language,玩上面的各种解释器。
- 一两本书是不够的,你看的时候很可能还是搞不清很多概念。要善用网络资源,要多动手,选择看更多书也是可以的。
4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路?
对编译器毫无头绪。