免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24614843 | 回复: 24614843

编译器和语言的恩怨情仇(获奖名单已公布) [复制链接]

论坛徽章:
1
摩羯座
日期:2013-11-29 18:02:31
发表于 2016-05-17 09:15 |显示全部楼层

在本次图书出版活动中,获得《 编译系统透视:图解编译原理》的网友有:

shenlanyouyu
陌路巨额投入
CUTianrui007
EricFisher
demilich


请以上获奖者在2016年7月30日前将姓名,公司,职务,行业,电话,邮箱,QQ,地址,所选纪念品,站内短信发送给王楠w_n以便及时给您快递奖品。

发不了站短的,请在原帖下方跟帖留言。

至于QQ现因两个编辑轮番值班登陆,可能会有遗漏的情况,有任何问题请尽量在原帖下方跟帖留言或在站务版块反馈,谢谢!

:因特殊原因,每次活动的获奖者我都会通知各位,如果大家在截止日期之前还未联系到管理员,那么本次活动的得奖资格将被取消,所以请大家及时的与管理员取得联系,谢谢合作!



话题背景:

学习语言,打交道最多的可能就是编译器的。刚开始时,我们在IDE中输入代码,然后编译运行,
一切都显得那么简简单单的,随着学习深入,你会发现,你要设置编译器的各个选项,使用各种
命令和编译器交互,指示编译器怎么做,你会觉得,你不是在学语言,而是在配置编译器。那么,
在学习语言过程中,你对编译器了解多少呢?如果让你写一个编译器,从哪里入手呢?开动大脑,


思考如下问题:

1:你所理解的编译过程包括哪些?每个过程的作用是什么?
2:你平时用到的编译选项是什么?说明其作用
3:如果让你自己做一个编译器,如何下手呢?
4:编译器和语言的关系是什么样的?


活动时间:2016年5月17日—6月17日


奖励设置:
活动结束后,我们将会选取5个亮点回复,送《 编译系统透视:图解编译原理》图书一本。



作者: 新设计团队   
丛书名: 华章原创精品
出版社:机械工业出版社
ISBN:9787111498582
上架时间:2016-3-30
出版日期:2016 年3月
开本:16开
页码:1041
版次:1-1
所属分类:计算机 > 软件与程序设计 > 汇编语言/编译原理 > 编译原理

内容简介:它第一次让编译原理不再像是一门高深晦涩的“数学课”,而是一个可以调试、可以接触、可以真切感受的理论体系。本书用1140余幅信息量巨大的运行时结构图和视频动画取代了同类书中复杂枯燥的数学公式,更加立体和直观,生动地将编译后的执行程序在内存中的运行时结构图展现了出来。

它第一次将GCC源代码、编译原理、运行时结构、编译系统原理(包含汇编与链接)的内在关系、逻辑与原理梳理清楚了,并将它们结合成一个整体,真正能够让读者透彻掌握编译器如何运行、如何设计,以及为什么要这么设计。

购买链接:http://product.dangdang.com/23930477.html

试读样章:http://wenku.it168.com/d_001675162.shtml



论坛徽章:
32
CU大牛徽章
日期:2013-05-20 10:45:13每日论坛发贴之星
日期:2015-09-07 06:20:00每日论坛发贴之星
日期:2015-09-07 06:20:00数据库技术版块每日发帖之星
日期:2015-12-13 06:20:0015-16赛季CBA联赛之江苏
日期:2016-03-03 11:56:13IT运维版块每日发帖之星
日期:2016-03-06 06:20:00fulanqi
日期:2016-06-17 17:54:25IT运维版块每日发帖之星
日期:2016-07-23 06:20:0015-16赛季CBA联赛之佛山
日期:2016-08-11 18:06:41JAVA
日期:2016-10-25 16:09:072017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2016-05-17 15:47 |显示全部楼层
有深度的理论书籍

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2016-05-17 16:03 |显示全部楼层
本帖最后由 yjh777 于 2016-05-17 16:18 编辑

1:你所理解的编译过程包括哪些?每个过程的作用是什么?
词法分析   #(有外挂的(比如C的宏),加个预处理)
语法分析
语义分析、优化
汇编
链接

2:你平时用到的编译选项是什么?说明其作用
编译语言只用过C,编译器 gcc/g++/tcc
-Wall    #器是就是静态检查
-static      #禁止链接共享库
-shared   #编译共享库
-fpic -fPIC    #位置无关代码,共享库

3:如果让你自己做一个编译器,如何下手呢?
不会,
  先学习编译原理、过程、方法
  循序渐进,,

4:编译器和语言的关系是什么样的?
编译器用来将语言写成的文本(程序),最终翻译成机器指令序列,

人  ==>  编程语言 ==> 编译器 ==> 机器指令序列 ==> 操作系统、计算机

论坛徽章:
7
IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34fulanqi
日期:2016-06-17 17:54:25C
日期:2016-10-25 16:08:32
发表于 2016-05-17 17:11 |显示全部楼层
本帖最后由 demilich 于 2016-05-17 17:12 编辑

1:你所理解的编译过程包括哪些?每个过程的作用是什么?
- 预编译 (处理宏)
- 编译  (源代码->汇编代码)
- 汇编  (汇编代码->目标代码)
- 链接  (链接静态/动态库)

特别的:对于Java这种语言来说,编译器其实只是把源代码翻译成字节码的工具,只做了传统编译型语言编译器的一部分工作 ... 后一部分工作,则是有Java虚拟机来实现字节码到真正可执行代码的编译。

2:你平时用到的编译选项是什么?说明其作用
- -g 调试
- -O3 优化选项
- -std=c++11,打开c++11
- -l 链接库
- -I 指定头文件目录
- -Wall 打开编译警告
- -pthread 多线程
- -o 指定输出名

3:如果让你自己做一个编译器,如何下手呢?
- 我做过一个汇编语言的语法分析器,用字典树来记录整个语法树,然后进行语法分析
- 其他就只知道点书上的内容:词法语法分析,编译,链接 ...

4:编译器和语言的关系是什么样的?
- 编译器可以是各种语言编写的,不一定非要汇编或者C/C++
- 一种编译器,自然是用来编译特定语言的源代码

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期: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
发表于 2016-05-17 22:02 |显示全部楼层
本帖最后由 shenlanyouyu 于 2016-05-17 22:03 编辑

1:你所理解的编译过程包括哪些?每个过程的作用是什么?
     以C/C++语言为例,程序编译的过程通常包含预处理、编译、汇编、链接。其中,编译过程包括词法分析、语法分析、语义分析和优化。
(1) 预处理的过程主要处理包括以下过程:
    将所有的#define删除,并且展开所有的宏定义
    处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
    处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
    删除所有注释 “//”和”/* */”.
    添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
    保留所有的#pragma编译器指令,因为编译器需要使用它们。
(2) 编译过程
     词法分析:识别出符号,从连续的字符中识别出标识符、关键字、数字、运算符并存储为符号(token)流。
     语法分析:语法分析器将记号(Token)产生语法树
     语义分析:经过语法分析生成的语法树,并不包含数据类型等语义信息,语义分析阶段会检查程序中是否含有语法正确但是存在逻辑问题的错误。
     优化:源代码优化器,将整个语法书转化为中间代码(中间代码是与目标机器和运行环境无关的)。中间代码使得编译器被分为前端和后端。编译器前端负责产生机器无关的中间代码;编译器后端将中间代码转化为目标机器代码。
(3)汇编
     汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。汇编器依照选定操作系统的目标文件格式,将.s 文件转换为具体的目标文件。
(4)链接过程
     最后链接器把一个或多个目标文件(库文件本质上也是目标文件)链接成符合选定操作系统指定格式的可执行文件。链接分为静态链接和动态链接。静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。而动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。

2:你平时用到的编译选项是什么?说明其作用
    以GCC为例,常用的编译选项。
(1) -Wall    打开所有编译器告警选项,即编译器最严格告警模式。
(2) -O2    设置成为的优化级别为O2。
(3) -Idir...  把dir加到头文件的搜索路径中,而且gcc会在搜索标准头文件之前先搜索dir.
(4) -g  该选项主要为了调试程序。可以利用操作系统的“原生格式(native format)”生成调试信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息。
(5) -shared –fPIC  编译生成.so共享库,–fPIC选项用于生成位置无关代码,以达到动态链接的目的。
(6) -pthread  编写多线程程序时使用。通过pthreads库加入对多线程的支持,这为预处理和连接设置了标志.pthread是POSIX指定的标准线程库。

3:如果让你自己做一个编译器,如何下手呢?
     了解编译原理后,针对目标语言的特性,根据内存布局设计编译器。一个编译器是由一组有三个到四个组件(还有一些子组件)构成,数据以管道的方式从一个组件输入并流向下一个组件。对于词法分析、语法分析在GNU上面能够找到成熟的编译工具。以开发C程序编译器为例,可以使用Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler编译器代码生成器)。  还可以使用flex/bison来根据语法生成编译器,只需要关注词法、语法的定义,得到语法树。

4:编译器和语言的关系是什么样的?
     编译器当然是将对应语言的程序文本文件编译生成目标文件的工具,编译器也是一种可执行的程序,可以用其他语言编写。编译器由编译程序和运行库组成,编译程序负责将源程序翻译成为目标程序,运行库提供了一些基本的子程序给程序编写者使用。

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
发表于 2016-05-18 09:46 |显示全部楼层
1:你所理解的编译过程包括哪些?每个过程的作用是什么?
- 预处理,主要是头文件包含及宏展开之类的
- 编译,这就不用说了,将源转换成目标的过程
- 链接,链接静态库和动态库

2:你平时用到的编译选项是什么?说明其作用
-g 调试
-O2 优化选项,别问我为什么不用O3,曾经有一个bug就是O3带来的森森的伤害了我
-std=c++0x或-std=c++11
-L 指定链接库位置
-I 指定头文件位置
-Wall 打开全部的编译警告
-o 指定可执行文件的名字

3:如果让你自己做一个编译器,如何下手呢?
用yacc/lex做语法、词法分析,然后将其转换为中间语言,如果是我就选java字节码或C语言(不懂汇编),然后你懂的

4:编译器和语言的关系是什么样的?
编译器其实就说将人类懂的编程语言翻译成机器懂的语言或虚拟机懂的语言(如果存在虚拟机的情况),编译器可以采用任何语言来实现,所以对程序员来说,语言越高级越接近人的思维方式越好,这样可以高效且轻松的写出优秀的代码,对机器而言,其只懂简单的机械式的思维,所以中间层越少越好,如果中间层太多,一层层的转换越多性能越差,并且在转换的过程中不可避免的会损失点什么,就好比现场翻译,如果中文直接翻译成英语和中文翻译成德语,德语再翻译成阿拉伯语,阿拉伯语再翻译成英语,估计中间损失了很多语义

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
发表于 2016-05-18 14:11 |显示全部楼层
思考如下问题:

1:你所理解的编译过程包括哪些?每个过程的作用是什么?

预处理:进行宏扩展,处理包含的头文件
词法、语法、语义分析:将输入语言转换为内部表示的抽象语法树
优化、变换:将抽象语法树展平为像三操作数这样的中间表示形式,然后在此基础上做各种优化和变换
代码生成:寄存器分配、指令选择、输出

2:你平时用到的编译选项是什么?说明其作用

-O3 生成优化的代码
-O0 -g 不做优化,生成调试信息,用于调试程序

3:如果让你自己做一个编译器,如何下手呢?

如果是移植,就基于llvm/gcc这样的开源编译器来实现所需要的语言前端或者体系结构后端

如果是从头做,太难,涉及的东西太多

简单的语言处理,可以基于lex/yacc快速实现

4:编译器和语言的关系是什么样的?

编译器通常是用来将高层语言转换为体系结构相关的底层语言(汇编,或者机器指令)

论坛徽章:
146
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2016-05-18 14:26 |显示全部楼层
462739419534164283.jpg 1038页 回复 1# CUTianrui007


   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-05-18 19:38 |显示全部楼层
24个世界冠军 “夺金王”王楠
                              

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-05-18 21:38 |显示全部楼层
从数学的角度看,一切皆数,编译器是数,语言也是数;
从语言的角度看,一切皆语言,编译器是语言,数学也是语言。

横看成岭侧成峰,远近高低各不同;
数学恒定全球日,中文无愧主人翁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP