FreeOZ论坛

标题: 关于计算机编译原理。。。:)- [打印本页]

作者: kingsking    时间: 15-9-2013 20:14
标题: 关于计算机编译原理。。。:)-
现在正在自学这一块。。
不了解。。

编译就是词法、语法的转换,,问题是
1、所有的语法和词法都支持吗?
2、如何转成机器码?要硬件厂商的帮助吗?
3、现在经典的成熟的架构和模式是什么样的??

谢谢,如果有了解的Tz,大侠请多多指教。。。:)
作者: ubuntuhk    时间: 15-9-2013 20:24

自学这块干什么啊?打算写编译器啊?还是想优化编程技巧?

我当年就是这门最弱了,逻辑思维能力不够好。
作者: kingsking    时间: 15-9-2013 20:25
ubuntuhk 发表于 15-9-2013 17:24
自学这块干什么啊?打算写编译器啊?还是想优化编程技巧?

我当年就是这门最弱了,逻辑思维能力不够好 ...

写是不可能了。。

我是想用。。

我觉得当你用一个东西时,必须知道他的原理,这样你才能找到合适的东西。。

比如某人说他的服务器好,或是产品好,不是他说好就好了。为什么好,好在哪里?如果你不是很清楚的话,很有可能最后不能做出正确的决定
作者: kingsking    时间: 15-9-2013 20:27
编译器这个东西看似不重要,因为大多数人用别人写好的工具。。
但是这个工具是不是适合你,有时也不一定。。。

比如你如果想做一个速度比市面上都快的浏览器,你一定要知道浏览器的原理。
如果你想做一个比市面上都快的编译器,也是如此。。

据说现在go语言是编译最快的语言,我估计就他的编译器可能设计的就比较快,是不是这样??

其实从理论上来说,计算机底层是物理上层是数学。这是极限。。
只有对计算机很理解很理解,对物理数学很理解很理解,才能创新。。否则永远是跟在别人后面没有(大的)前途。。
作者: kingsking    时间: 15-9-2013 20:30
第一个发明硬盘,发明cpu发明,操作系统。发明编译器的都发了。。:)


记得好像borland早期做编译器很赚钱。后来因为microsoft占了操作系统的便宜,从底层把他断了,他才完的。

因为编译器还是建立在操作系统上面的。。

我个人觉得学习任何东西,都是原理最重要。只有彻底的掌握了他的原理,才有可能立于不败之地
作者: ubuntuhk    时间: 15-9-2013 20:56

我觉得主要看做什么样的应用,通过学习编译原理来提高编写应用程序的技巧,效率不够高,也不够直接。还不如看看如何利用编译器提供的优化技巧来得快呢。

比如编写浏览器这种应用,还是逻辑层面的设计思想更重要,Chrome的做法是抓住浏览器里面的瓶颈 -- Javascript的解释器,他们做了一个牛逼高效的Javascrpt解释器,直接就提高了用户体验。
作者: kingsking    时间: 15-9-2013 21:01
ubuntuhk 发表于 15-9-2013 17:56
我觉得主要看做什么样的应用,通过学习编译原理来提高编写应用程序的技巧,效率不够高,也不够直接。还不 ...

解释器也是编译器的一种吧??
可见这个原理和方法是通用的。:)
其实编译也不全是编译成机器码编译成中间码也是可以的。。:)

个人猜 的,其实我都没做过,但我觉得先有一整体的架子再去学具体的内容要快很多。:)



编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
作者: kingsking    时间: 15-9-2013 21:06
我个人觉得,先有一个整体的了解会比较好。。


比如以前存储是用光盘、磁盘,但现在那个叫什么?固态硬盘是最快的,虽然现在来说他还很贵,但如果你是一个老板的话,不管是存储商的老板还是用户的老板,
就要考虑哪种更有前途,有多少前途。。才能做出正确的选择,否则你的投入都是空的。。。比如你的东西都有光盘存,但显然过时了,不如硬盘方便。
如果固态硬盘更快,那么你再大规模投资硬盘是没前途的。


当然如果你研究后发现固态磁盘没前途,那当然也不应该做这个了。。

我总觉得,任何东西,方向比行动有时更重要。。
当然只有方向也不行。。但方向最重要。。个人观点。。:)
作者: finger|regnif    时间: 15-9-2013 21:39
不是太会, 就我所知无责任回复一下吧:

1、所有的语法和词法都支持吗?

每一种语言都有自己的关键字, 词法, 语法规则.
2、如何转成机器码?要硬件厂商的帮助吗?

不需要转为机器码. 只要转为一种已知的语言就行了. 再用已知语言编译一下. 比如C编译器可以将C语言转为汇编并不需要直接转为机器码.
如果你的中间语言是跨平台的话(如C) 就不需要考虑硬件厂商了.
当然多了中间层就可能多一些开销, 但能换来开发的速度.
3、现在经典的成熟的架构和模式是什么样的??

以前是用lex进行词法分析, yacc. 现在的听说有clang llvm之类 (具体这是什么东西我也不懂, 要看楼下怎么说).
作者: clarkli    时间: 16-9-2013 01:19
如果同时懂C/C++和汇编的话,编译原理都不用看就知道怎么回事了
作者: liu_yu_1980    时间: 16-9-2013 09:00
clarkli 发表于 16-9-2013 00:19
如果同时懂C/C++和汇编的话,编译原理都不用看就知道怎么回事了

內行人的話。

其實compiler就是一個轉換程序,只要有了ISA(Instruction Set Archetecture)就基於這個死標準寫轉換程序就行了,僅此而已,真正跟CPU相關的是ISA本身。compiler的原理在computer science本科的computer system這門課中就有包含,其實是很死的套路,知道了也不難。

所以搞computer scinece的人用的高級語言最好是C/C++而不是Java,後者跟CPU mechanism沒啥實際關係(其實C都已經關係不太大了)。很早就有美國的學術機構反對CS課用Java作為教育語言。現在都過於強調OOP而忽略了System,就像我之前開的貼,這裡大多數人都忽視Computer Archetecture方面的技術,認為實際工作只要做應用就夠了(我讀書時也這麼想,認為現在CPU/OS要理解那麼深幹嘛我今後又不開發,結果我工作後從事的embedded system就是充分利用了那些知識)。
作者: chubbycat    时间: 16-9-2013 09:08
Compiler was a very tough class in CS program
作者: wiserfirst    时间: 16-9-2013 16:34
这个领域还是看书吧,龙书
作者: chen_edward    时间: 16-9-2013 16:49
编译就是词法、语法的转换,,
-- 说漏了。编译是三步,词法分析、句法分析和语义分析。
问题是
1、所有的语法和词法都支持吗?
-- 编译是从一种形式语言翻译成另一种形式语言。可以是任何语言。
2、如何转成机器码?要硬件厂商的帮助吗?
-- 就是第三步语义分析
3、现在经典的成熟的架构和模式是什么样的??
-- 不知道你问的是什么,编译原理始于自动机理论,从来没变过。
作者: 小何    时间: 28-12-2013 06:28
kingsking 发表于 15-9-2013 20:30
第一个发明硬盘,发明cpu发明,操作系统。发明编译器的都发了。。:)

go不是最快的语言,“最快”要看应用场景,就算java在某种特定情况下也会比C快



作者: cais    时间: 28-12-2013 23:39
小何 发表于 28-12-2013 06:28
go不是最快的语言,“最快”要看应用场景,就算java在某种特定情况下也会比C快

LZ说的是编译速度最快的。
作者: cais    时间: 28-12-2013 23:40
编译原理是CS的基础课程。如果有兴趣做软件的话,建议学习之。
作者: trisun    时间: 29-12-2013 00:33
不用学原理,只要会用工具就行,比如ANTLR,一般足够用了。网上有现成的教程。
作者: caoglish    时间: 29-12-2013 14:58
如果要在编程技术上面下功夫,要想自己的编程能力更具有优势,就是看你是不是比别人掌握了更多的基础理论和能力。

你只要理解和掌握了编译原理,而且更具其思路来改进自己的编程技巧,你的水平就是又一个提升。

所以楼主看编译原理来提升自己的技术水平这个方向没有认为问题。

编程有内功和外功的区分,外功就是各种工具,标准和编程语言,这些会随着时间的变化而变化。而内功就基本上是不会有太大变化的,而且是跨语言的,学的越多对自己能力提升就越大。现在编程的内功,主要有编译原理,数据结构,设计模式,算法,重构等。还有工具级别的内功,如数据库,单元测试,依赖管理,框架等。等吧内功学好了,在使用外功来表现出来。你的编程水平就极大的提升了,也就是软件工程师和码农的差别了。
作者: cais    时间: 29-12-2013 23:42
caoglish 发表于 29-12-2013 14:58
如果要在编程技术上面下功夫,要想自己的编程能力更具有优势,就是看你是不是比别人掌握了更多的基础理论和 ...

我挺赞同这个内功外功的说法。
如果考虑到人的精力有限,只能学习有限的内功的话,那么内功也是有时效性的,你只能挑当前对你的外功有帮助的内功去学习。比如说二十年前,硬件知识是对于编程来说,也算比较重要的内功。现在可能没有那么重要。操作系统原理,现在也很重要,不过可能没有其它的如基本的数据结构,算法等重要。
当然这个也看你的侧重的领域。
LS据说的一些工具级别的,应该还能包括一些所谓的soft skill类别的,比如agile,testing之类的概念类的知识,对编程也很有帮助,也不太会随着编程语言的改变而改变太多。
作者: woailvzi    时间: 1-1-2014 19:15
https://class.coursera.org/compilers-003

FYI..
作者: black_zerg    时间: 1-1-2014 20:24
提示: 作者被禁止或删除, 无法发言 编译原理蛮难的,不过意义重大,有空闲确实值得研究。楼主研究好了多分享
作者: william_m76    时间: 15-1-2014 01:53
先看书,然后有兴趣就去看开源 gcc 的编译器源码。

C的编译器 会先把C code 转化为 汇编 code,再把 汇编 code 转化成对应CPU的机器指令。

这东西比较难学,了解一下很容易,学精不容易,听说 斯坦福 的本科这门课结课 每个学生都要做个简单的编译器出来。
作者: karl.lee.2004    时间: 19-1-2014 07:39
william_m76 发表于 15-1-2014 01:53
先看书,然后有兴趣就去看开源 gcc 的编译器源码。

C的编译器 会先把C code 转化为 汇编 code,再把 汇编 ...

我90年代中在國內上的是一所211大學的computer science,軟件專業,當時編譯原理是必修的。

最後的課程設計就是要做一個pascal的編譯器。可惜的是,全班40多人,除了我和另外一男一女共計3人是自己熬夜獨立完成的外,其他的都是抄以前師兄師姐流傳下來的程序。

而且這份編譯程序,居然還是計機系的傳家三件寶之一。
作者: kiluyar    时间: 19-1-2014 18:09
开发编译器机会不多,但是编译原理的思想是实际项目确实用的上的。
作者: jerryzh    时间: 19-1-2014 22:34
freeoz还有讨论这个的帖子。不容易。
compiler分为前端开发和后端开发。前端主要就是词法,语法,语义分析,什么YACC, BNF范式呀这些的。后端主要就是把前端分析出的东西在各个ISA上实现。
现在主要都是在后端做优化。前端的理论一直没有什么突破也就没啥大发展,有人在搞并行语言的前端,不过这方面高老大说数学没突破,想在这里做不容易。
我觉得不像做个helloworlder的话就是应该好好学学这些东西。编译原理算是算法,数据机构,体系结构的集成吧,所以说是CS领域非常重要的一部分。
说实话,当时我和我同事说全世界全职在做compiler上的应该不会超过1千人。而且做compiler的人的薪水也不一定会比你去做java开发的高。只是做过compiler的话,从工程角度来说,架构能力应该有很大提升。不是在局限于c++和java哪个快呀之类的问题了。
从学习的角度来说,去网上看教程挺好。龙书个人觉得太学究。看完了你也不知道怎么写compiler。有一本compiler design in C写得非常好。当然还有用java来实现的了。
所以说学编译原理能提升CS思维,但是不会让你知道如何做网页。不过要是能design a compiler from scratch up,去不去AGMF也就是你愿不愿意的问题了。
作者: kingsking    时间: 28-1-2014 02:00
本帖最后由 kingsking 于 27-1-2014 23:07 编辑

顶,前几天看清华的课程表,
编译原理是重要课程。。:)

hard to learn , i ahve lose my dream day by day .cause, i stayed in Beijing and feel no too bad. my god. dream is always dream..
and my stock or computer, all is not good




计算机科学与技术专业专题训练不少于5学分,其中计算机网络专题训练为必选
      课号课程名学分先修要求
       计算机网络专题训练1(秋)
       操作系统专题训练2(秋)
       编译原理专题训练2(秋)
       数据库专题训练2(秋)

作者: kingsking    时间: 28-1-2014 02:01
清华大学计算机专业核心课程(转) - 日志 - testxiaowei- 家里蹲大学《  -  》

计算机科学与技术专业核心课程6 门,17学分
      课号课程名学分先修要求
      40240433计算机系统结构  3(春)操作系统
      30240243操作系统3(春)计算机组成原理,数据结构
      40240144编译原理4(春)数据结构
      40240243计算机网络3(秋)操作系统
      40240432形式语言与自动机2(秋)离散数学(1)
      20240103汇编语言程序设计3(秋)

计算机科学与技术专业限选课不少于11学分,其中:
计算机系统结构-----计算机科学与技术专业选修不少于2学分
      课号课程名学分先修要求
      30240253微计算机技术3汇编语言程序设计
       嵌入式系统3计算机组成原理  操作系统
      40240412数字系统设计自动化2数字逻辑电路
      30240222VLSI设计导论2数字逻辑电路

计算机软件与理论---计算机科学与技术专业选修不少于2学分
      课号课程名学分先修要求
       初等数论及其应用       2离散数学
      30240192高性能计算导论2(英语讲课)计算机系统结构
      30240262数据库系统原理2数据结构
       网络编程与计算技术2计算机组成原理
       软件开发方法2C++  数据结构 软件工程
      30240134软件工程3C++ 数据结构


计算机应用技术-----计算机科学与技术专业选修不少于2学分
      课号课程名学分先修要求
      30240042人工智能导论2离散数学
      40240452模式识别2几何与代数 概率与统计 人工智能导论
      40240062数字图象处理2概率与统计 程序设计基础
      40240392多媒体技术基础及应用       2信号处理原理
      40240422计算机图形学基础       2数据结构
      40240472计算机实时图形和动画技术2几何与代数
      40240402虚拟现实2计算机组成原理
      40240462现代控制技术2系统分析与控制
      40240372信息检索       2数据结构
      40240362电子商务平台及核心技术2数据结构 JAVA程序设计 数据库系统原理
      40240492数据挖掘2数据库系统原理


计算机科学与技术专业专题训练不少于5学分,其中计算机网络专题训练为必选
      课号课程名学分先修要求
       计算机网络专题训练1(秋)
       操作系统专题训练2(秋)
       编译原理专题训练2(秋)
       数据库专题训练2(秋)

计算机科学与技术专业的任选课程
      课号课程名学分先修要求
      30240253微计算机技术3汇编语言程序设计
       初等数论及其应用       2离散数学
       网络编程与计算技术2计算机组成原理
      30240134软件工程3C++ 数据结构
      30240042人工智能导论2离散数学
      40240452模式识别2几何与代数 概率与统计 人工智能导论
      40240062数字图象处理2概率与统计 程序设计基础
      40240392多媒体技术基础及应用       2信号处理原理
      40240422计算机图形学基础       2数据结构
      40240472计算机实时图形和动画技术2几何与代数
      40240402虚拟现实2计算机组成原理
      40240462现代控制技术2系统分析与控制
      40240372信息检索       2数据结构
      40240362电子商务平台及核心技术2数据结构 JAVA程序设计 数据库系统原理
      40240492数据挖掘2数据库系统原理

硕士生课程目录

      课程编号课  程  名  称任课教师学分
       秋季学期课程  
      60240013组合数学黄连生3
      60240023数据结构 (全年)舒继武3
      60240052人工智能 陈群秀2
      7020013高等计算机系统结构郑伟民3
      70240023计算机网络体系结构史美林3
      70240033人工智能原理朱小燕3
      70240043计算机控制理论及应用孙增圻3
      70240063分布式数据库系统周立柱3
      70240083计算机视觉徐光佑3
      70240093数据安全罗平3
      70240113VLSI设计基础 (和本科生同上)蔡懿慈3
      70240143计算机辅助几何设计技术秦开怀3
      70240183计算几何邓俊辉3
      70240203分布式多媒体系统与技术史元春3
      80240213宽带交换网与Qos控制技术刘斌3
      80240083多媒体技术基础与应用林福宗3
      80240143高性能路由器体系结构与高速信息网络技术刘斌3
      80240203软件项目管理殷人昆3
       春季学期课程  
      60240033软件工程技术和设计殷人昆3
      60240063微型计算机系统接口技术李芬3
      60240073计算机图形学基础(和本科生同上)胡事民3
      70240052计算语言学苑春法2
      70240073智能控制孙增圻3
      70240103知识工程王克宏、李涓子3
      70240123语音信号数字处理吴文虎3
      70240133多媒体计算机技术钟玉琢、蔡莲红3
      70240162超大规模集成电路布图理论与算法洪先龙2
      70240173数字系统自动设计薛宏熙3
      70240193算法与算法复杂性理论黄连生3
      70240223计算机支持的协同工作CSCW史美林3
      70240233微计算机系统设计唐瑞春3
      70240243计算机图形学胡事民3
      课程编号课  程  名  称任课教师学分
      70240253计算机网络和计算机系统的性能评价林闯3
      70240262并行计算杨广文3
      80240023计算机视觉专题艾海舟3
      80240113科学计算可视化  
      80240123计算机网络中的形式化方法与协议工程学尹霞、吴建平3
      80240133现代优化算法――设计与实践董社勤3
      80240153计算科学与工程中的并行编程技术都志辉3
      80240193计算机网络前沿研究徐恪3
      80240183网格计算都志辉3
      80240033计算智能及机器人学孙富春3
       研究生院已批准课程  
      80240173下一代互联网徐明伟3
      80240312小波分析及其工程应用孙延奎2
      80240283网络系统的建模与分析任丰原3
      80240272基于网络处理器的系统设计与实现任丰原2
      80240303网络存储技术舒继武3
      80240253实时系统徐恪3
      80240242计算机系统性能测试陈文光2
      80240262信息检索的前沿研究张敏2
      80240292流媒体技术孙立峰2


作者: kingsking    时间: 28-1-2014 02:06
本帖最后由 kingsking 于 27-1-2014 23:16 编辑

说到计算机,也想谈谈股票。
我现在上班的事和这2个都没关系。。:)
现在的事是糊口,想发展,要靠新技术。

以前股票上赚了100W一年,膨胀了,这5年赔了100万,晕。
就想着计算机是不是可以再深入理解一些,因为我觉得计算机比股票和金融好找工作。和赚钱。

有人说你为什么不继续深入学金融或股票。我觉得我学了亚当斯密,凯恩斯和巴菲特对金融和股票已经足够理解不用学了,只用等机会就可以了。
计算机我还是不懂。。


巴菲特太牛了,什么也不太干,赚600亿,现在又投ibm和intel,看来他终于懂计算机了。。

当然,我现在 “恨死”(joke just a joke..))巴菲特了,我学了他8年,什么钱也没赚到。。。哭死啊。。
我太笨了,再等几年吧。。:((

注:就是说我现在再学巴菲特或是金融,我觉得都没进步了,就像学跑步,你不是这个材料怎么学也没用。。哭。。:((
作者: DDD888    时间: 28-1-2014 06:37
kingsking 发表于 28-1-2014 02:06
说到计算机,也想谈谈股票。
我现在上班的事和这2个都没关系。。:)
现在的事是糊口,想发展,要靠新技术 ...

那还不如我,我从不炒中国股票,所以我也没浪费时间啦
作者: kingsking    时间: 4-3-2014 22:54
顶,测试一下
作者: fatalucard    时间: 5-3-2014 09:20
很多人都推荐龙书,但是我觉得龙书真的是有点晦涩难懂,我推荐一个小众书,我之前看了觉得不错,至少是一步步带着你写一个简单的解释程序,龙书太抽象。《编程语言实现模式》,网上有pdf下载。
作者: zhjuqi    时间: 5-3-2014 09:42
用c#写了个c#的人飘过~~~
作者: 电视机    时间: 4-4-2014 16:53

1、所有的语法和词法都支持吗?
——你需要了解一下《形式语言与自动机》这门课程,人们说话的语言是0型文法,上下文有关文法是1型文法,上下文无关文法是2型文法。编译器能识别2型以上文法。

2、如何转成机器码?要硬件厂商的帮助吗?
——先转换成汇编语言(C、Pascal等)或中间语言(Java),到此90%的工作已经完成(这些工作与具体硬件无关,所谓的跨平台),剩下就是汇编器的事情了(把汇编语言或中间语言转换为不同的机器码),汇编器也不需要硬件厂商的特别支持,Intel每发布一款CPU都会向相关软件厂商提供每条指令(机器码)的具体格式。

3、现在经典的成熟的架构和模式是什么样的??
——编译器涉及操作系统和硬件2个抽象层次,市场上所有编译器的实现原理都是自动机理论,也就是说无论Java、Visual C++还是Delphi其本质上都是一样的。你看到不同编译器自带的类库千差万别,那是厂商把应用层的算法和数据结构捆绑销售给你,这些是应用层次的差别(你需要了解一下软件的抽象层次),跟编译原理没有任何关系。

作者: 艾瑞克    时间: 4-4-2014 17:39
不同种类的CPU有不同的指令集,通俗一点说,你可以理解成硬件指令,所谓的机器码就是用来直接执行这些指令的。如同楼上所说,从汇编语言到机器码是最后一步,其实没什么花头,就像是照着硬件厂商的说明书重新描述一遍而已。

至于前半部分,怎么从高级语言通过文法分析转换成汇编格式,这个就有点理论了,事实上,这玩意几十年来也都没有什么突破,因为硬件都被少数几家厂商垄断着,操作系统内核也都没有什么太大变化,所以编译技术也很难有太大发展。近年来在虚拟机和解释型语言上倒是有一些发展,不过虚拟机和解释器还是摆脱不了前面那些东西。

lz如果真的喜欢研究一些理论,建议先从计算机组成原理和操作系统看起,然后再看编译原理,因为没有操作系统的理论基础,看编译原理基本等同于看天书。
作者: williamcheng    时间: 27-5-2014 20:09
本人教过几届的编译原理,数据结构,离散数学。没想到这里还有这么多人感兴趣。编译原理,数据结构,离散数学,操作系统,体系结构,是CS的重要课程。通过自己多年的嵌入式系统工作经验,证实了它们的重要性。




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/ibbs/) Powered by Discuz! X3.2