忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12345下一页
最近访问板块 发新帖
查看: 95380 | 回复: 46

【大话IT】编译器的设计其实远没想象中那么妖魔化 [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2016-08-03 09:34 |显示全部楼层
话题背景:

软件工程师需要经常面对着各种编程语言编译器、解释器,通过各种语言编译器、解释器,软件工程师的一切工作成果才会变的有意义。本次活动将基于编译器与软件工程师之间的关系展开讨论。


讨论话题(包括但不限于)

1. 你平常用哪种语言编写程序?用什么编译环境?
2. 你熟悉编译原理吗,了解词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法等术语吗?
3. 你了解过lex/yacc吗?使用它们做过分析吗?
4. 你想过自己设计一种语言,并为之设计编译器吗?如果你想设计,那你该如何一步步的做呢?


活动时间:2016年8月4日—9月4日


活动奖励:

活动结束后,我们将选取5位亮点回复,送技术图书《自制编译器》各一本。



作者: [日] 青木峰郎   
译者: 严圣逸 绝云
丛书名: 图灵程序设计丛书
出版社:人民邮电出版社
ISBN:9787115422187
上架时间:2016-5-31
出版日期:2016 年6月
开本:16开
页码:445
版次:1-1

内容简介:本书将带领读者从头开始制作一门语言的编译器。笔者特意为本书设计了C?语言,C?可以说是C语言的子集,实现了包括指针运算等在内的C语言的主要部分。本书所实现的编译器就是C?语言的编译器, 是实实在在的编译器,而非有诸多限制的玩具。另外,除编译器之外,本书对以编译器为中心的编程语言的运行环境,即编译器、汇编器、链接器、硬件、运行时环境等都有所提及,介绍了程序运行的所有环节。

样章试读: 试读1、2章.pdf (1.69 MB, 下载次数: 41)

论坛徽章:
16
处女座
日期:2014-07-18 14:50:542017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30综合交流区版块每日发帖之星
日期:2015-10-10 06:20:00IT运维版块每日发帖之星
日期:2015-09-01 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17
发表于 2016-08-04 15:48 来自手机 |显示全部楼层
妖魔化倒是没有,就是说简单也不简单,容易也不容易。

论坛徽章:
22
CU大牛徽章
日期:2013-09-18 15:22:06摩羯座
日期:2014-03-25 23:51:36技术图书徽章
日期:2014-04-03 16:47:26白羊座
日期:2014-04-14 22:56:32午马
日期:2014-05-16 17:18:08未羊
日期:2014-08-12 22:15:31神斗士
日期:2015-11-20 17:26:2515-16赛季CBA联赛之浙江
日期:2016-03-15 18:27:4215-16赛季CBA联赛之同曦
日期:2016-03-22 09:21:0115-16赛季CBA联赛之北控
日期:2017-03-26 21:47:12寅虎
日期:2014-03-25 21:54:32寅虎
日期:2014-06-03 10:53:34
发表于 2016-08-04 23:16 |显示全部楼层
如果仅仅是简单规则的语言,那么编译器确实也不难。
问题在于:
1)复杂的语言特性,C++的某些语法特性据说现有的编译器都支持不是很好
2)代码优化部分,越快越难..
3)运行时的问题..
编译器每一步都要做得非常好,就特别难了。
即使做出编译器了,人们还会拿它去和市面上最快的编译器对比...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-08-05 15:00 |显示全部楼层
1. 你平常用哪种语言编写程序?用什么编译环境?
语言一般是 Objective-C C/C++
编译环境是 LLVM 和 GCC

2. 你熟悉编译原理吗,了解词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法等术语吗?
编译原理还是大学时学习的,后面偶尔有看过一些博客介绍这方面的,不过相对其他方面的资源来说这方面的资源少多了。
词法分析:面向代码,将代码翻译成 token 序列
语法分析:将token序列组合成各类语法短语,如“程序”,“语句”,“表达式”
上下文无关文法:不太好用语言描述,基本上字面意思就可以理解了
IR:中间代码吧,跟网页的后端类似,相当于编译器的后端。主要为了适配高级语言。
LL(k)文法:上下文无关文法,可以自左到右扫描,自上而下分析。
LR(k)文法:上下文无关文法,可以自左到右扫描,自下而上分析。

3. 你了解过lex/yacc吗?使用它们做过分析吗?
还有 FLex/bison ,以前好像只做过分词方面。

4. 你想过自己设计一种语言,并为之设计编译器吗?如果你想设计,那你该如何一步步的做呢?
想过一些,不过只是空想。
现在看来,从词法分析->语法分析->。。。还有很多路要走。不过LLVM现在已经相对简化现在的编译器开发模式了。

论坛徽章:
210
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之全北现代
日期:2016-05-11 17:05:27操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:22:58数据库技术版块每日发帖之星
日期:2016-05-10 19:23:04数据库技术版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
发表于 2016-08-05 21:34 |显示全部楼层
这技术祸害人,不提也罢

论坛徽章:
0
发表于 2016-08-06 21:30 |显示全部楼层
哈哈,这本书我有原版,虽然我几乎一个日文字也看不懂, 这是我的第一本外文原版书籍(不包括影印版)

论坛徽章:
2
2016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之广夏
日期:2016-12-07 08:32:11
发表于 2016-08-09 13:55 |显示全部楼层
本帖最后由 剑魂箫心 于 2016-08-10 10:18 编辑

1. 你平常用哪种语言编写程序?用什么编译环境?
我工作中主要使用C语言,因为我是做gnome开发的。编译环境就是gcc和gtk+函数库了,也会用到glib函数库。自己写的小工具如果要界面就用Java,不要界面的话就用Python。我还会AT&T汇编语言,不过现在很少直接动手写汇编,只是看汇编代码而已。C++这门语言一直是我的痛,太难了,大学学的现在忘得干干净净,而且如果工作不需要的话我是永远不会学C++的......

2. 你熟悉编译原理吗,了解词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法等术语吗?
大学学编译原理那会儿我可是费尽心机啊,学校的教材是国防科大出版的那本《程序设计语言编译原理》,真的是很难懂,看这本书简直找虐。大名鼎鼎的龙书《编译原理》看起来也是很有难度,后来从图书馆借出了《编译器设计》这本书,那看的是相当爽,思路清晰还有伪代码,堪称天下奇书,而且这本书在我们本科校区图书馆没有,我专门坐车40分钟跑到研究生校区借来的。我还从孔夫子旧书网买了本上个世纪出版的绝版书——Kenneth C.Louden的《Compiler Construction: Principles and Practice》,这本书估计已经成孤本了。不过一学期时间毕竟有限,也没深入学习多少,学完中间代码生成那部分基本就要期末考试了,而且考试内容比较死板,还要抽出时间复习。
词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法这些术语是每本编译原理书里都会讲到的,在《编译器设计》这本书里讲的尤其清楚,我当时的感觉我现在还记得,简直是醍醐灌顶!!!不过,现在早已忘得差不多了,毕竟工作内容和编译器没有什么交集。
当时做课程作业我还用C语言写了一个简单的计算器语法的词法分析器+语法分析器,直接在文本文档里写上一系列3/4+(1+12/6*7)=?这样的算式,然后经过词法分词、语法分析、文法分析后就可以算出结果,还是很有成就感的。

3. 你了解过lex/yacc吗?使用它们做过分析吗?
这两个工具当年学编译原理时学过,但是也就当时做作业用了下,后来再也没用过。据说这两个工具可以直接用来构建出编译器的词法分析和语法分析部分,也就是说编译器前端靠这俩工具就能完成很大一块功能。

4. 你想过自己设计一种语言,并为之设计编译器吗?如果你想设计,那你该如何一步步的做呢?
我非常想实现一下c语言编译器,即使是一个小的子集。《Compiler Construction: Principles and Practice》这本书就是在最后实现了一个小编译器,不过和c语言还是有点区别的。我想,学习做编译器的过程会加深对已存在编译器的理解,比如gcc编译优化的原理等等。实现编译器的全过程我只知道个大概,编译器前端里面的词法分析、语法分析这两步可以借助lex/yacc,不必完全自己重复造轮子,语义分析开始就要自己做了,经历了中间代码生成之后就要进入编译器后端了,后端包括代码优化和目标代码生成以及优化,这会涉及与机器架构相关的部分,那就是相当麻烦的事情了。我对汇编层很感兴趣,曾经还专门找资料学习过二次遍历汇编器(Two-pass assembler)的原理,那会儿在学一些关于内核底层的东西,所以就顺带看了下,对理解汇编指令转化为机器码的过程很有帮助。

最重要的是!!!编译器/操作系统/计算机图形学 这三者并称为计算机领域的三座大山,如果能有机会攀登一下那对于自身来说将会是非常大的提高!!!

论坛徽章:
13
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:002017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29极客徽章
日期:2016-12-07 14:08:02JAVA
日期:2016-10-25 16:01:09luobin
日期:2016-06-17 17:46:362016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之天津
日期:2015-12-16 22:35:03黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-10-09 06:20:002015亚冠之广州恒大
日期:2015-09-21 21:40:222015七夕节徽章
日期:2015-08-21 11:06:17
发表于 2016-08-09 22:00 |显示全部楼层
1. 你平常用哪种语言编写程序?用什么编译环境?
    用java比较多,有时用C语言

2. 你熟悉编译原理吗,了解词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法等术语吗?
    编译原理,在大学时上完课就还给老师了,一直想重新拾起来研究下,一直没动手....

3. 你了解过lex/yacc吗?使用它们做过分析吗?
    lex/yacc用过。
    写NoSQL数据库引擎时,需要给java调用,当时就用lex/yacc来解析tcp传过来的sql语句,复杂的SQL没解析出来,就没再研究下去.....

4. 你想过自己设计一种语言,并为之设计编译器吗?如果你想设计,那你该如何一步步的做呢?
    想实现一个简单的脚本语言,直接解析执行的。
    没想实现C这种的编译器,需要了解底层东西太多了,像cpu指令、汇编等等.....
    要实现的话,要先定义关键字,语法。然后根据关键字、语法做词法分析、语法等分析、文法定义等等,最后形成语法树,再生成目标文件或计算结果等等

求职 : Linux运维
论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16赛季CBA联赛之山东
日期:2016-10-31 10:40:10综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00IT运维版块每日发帖之星
日期:2016-02-08 06:20:00数据库技术版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-10 06:20:00黄金圣斗士
日期:2015-11-24 10:45:10IT运维版块每日发帖之星
日期:2015-09-01 06:20:00IT运维版块每日发帖之星
日期:2015-08-13 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:012015年亚洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
发表于 2016-08-10 10:37 |显示全部楼层
有时间和精力就好好投入到GCC中吧!!!

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
发表于 2016-08-11 09:09 |显示全部楼层
1. 你平常用哪种语言编写程序?用什么编译环境?

c/c++, linux+vi+gcc/llvm

2. 你熟悉编译原理吗,了解词法分析、语法分析、上下文无关文法、IR、LL(k)文法、LR(k)文法等术语吗?

了解编译原理,不过对于LL,LR没深入学习,搞不清。

3. 你了解过lex/yacc吗?使用它们做过分析吗?

了解,用lex/yacc写过简单的文件处理程序,以及汇编器。

4. 你想过自己设计一种语言,并为之设计编译器吗?如果你想设计,那你该如何一步步的做呢?

做过这样的项目,是基于C语言扩展数据类型和运算,基于clang开发的。

-------------
我觉得啊,真正设计编译器的机会和需求不多,大多数情况就是在现有的基础上,做个移植,增加新的功能支持,修个bug之类的活。
弄编译器,有三部分需要搞明白,一是语言,词法,语法之类的;二是体系结构,寄存器,栈,指令之类的;三是优化分析,控制流,数据流,指针别名,各种优化之类的。
最后,最关键的还是工程能力要强,能把这些理论漂亮的实现出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP