找回密码
 FreeOZ用户注册
查看: 7008|回复: 35
打印 上一主题 下一主题

[其他] 关于计算机编译原理。。。:)-

[复制链接]
跳转到指定楼层
1#
发表于 15-9-2013 20:14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
现在正在自学这一块。。
不了解。。

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

谢谢,如果有了解的Tz,大侠请多多指教。。。:)
回复  

使用道具 举报

2#
发表于 15-9-2013 20:24:09 | 只看该作者

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

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

评分

参与人数 1威望 +50 收起 理由
kingsking + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

3#
 楼主| 发表于 15-9-2013 20:25:35 | 只看该作者

写是不可能了。。

我是想用。。

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

比如某人说他的服务器好,或是产品好,不是他说好就好了。为什么好,好在哪里?如果你不是很清楚的话,很有可能最后不能做出正确的决定
回复  

使用道具 举报

4#
 楼主| 发表于 15-9-2013 20:27:56 | 只看该作者
编译器这个东西看似不重要,因为大多数人用别人写好的工具。。
但是这个工具是不是适合你,有时也不一定。。。

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

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

其实从理论上来说,计算机底层是物理上层是数学。这是极限。。
只有对计算机很理解很理解,对物理数学很理解很理解,才能创新。。否则永远是跟在别人后面没有(大的)前途。。
回复  

使用道具 举报

5#
 楼主| 发表于 15-9-2013 20:30:02 | 只看该作者
第一个发明硬盘,发明cpu发明,操作系统。发明编译器的都发了。。:)


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

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

我个人觉得学习任何东西,都是原理最重要。只有彻底的掌握了他的原理,才有可能立于不败之地
回复  

使用道具 举报

6#
发表于 15-9-2013 20:56:52 | 只看该作者

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

比如编写浏览器这种应用,还是逻辑层面的设计思想更重要,Chrome的做法是抓住浏览器里面的瓶颈 -- Javascript的解释器,他们做了一个牛逼高效的Javascrpt解释器,直接就提高了用户体验。

评分

参与人数 1威望 +50 收起 理由
kingsking + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

7#
 楼主| 发表于 15-9-2013 21:01:55 | 只看该作者
ubuntuhk 发表于 15-9-2013 17:56
我觉得主要看做什么样的应用,通过学习编译原理来提高编写应用程序的技巧,效率不够高,也不够直接。还不 ...

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

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



编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)
回复  

使用道具 举报

8#
 楼主| 发表于 15-9-2013 21:06:52 | 只看该作者
我个人觉得,先有一个整体的了解会比较好。。


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


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

我总觉得,任何东西,方向比行动有时更重要。。
当然只有方向也不行。。但方向最重要。。个人观点。。:)
回复  

使用道具 举报

9#
发表于 15-9-2013 21:39:06 | 只看该作者
不是太会, 就我所知无责任回复一下吧:

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

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

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

以前是用lex进行词法分析, yacc. 现在的听说有clang llvm之类 (具体这是什么东西我也不懂, 要看楼下怎么说).

评分

参与人数 2威望 +70 收起 理由
wangbo + 20 回答的好!
kingsking + 50 thank you.:)

查看全部评分

回复  

使用道具 举报

10#
发表于 16-9-2013 01:19:01 | 只看该作者
如果同时懂C/C++和汇编的话,编译原理都不用看就知道怎么回事了
回复  

使用道具 举报

11#
发表于 16-9-2013 09:00:05 | 只看该作者
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就是充分利用了那些知識)。
回复  

使用道具 举报

12#
发表于 16-9-2013 09:08:45 | 只看该作者
Compiler was a very tough class in CS program
回复  

使用道具 举报

13#
发表于 16-9-2013 16:34:43 | 只看该作者
这个领域还是看书吧,龙书

评分

参与人数 1威望 +50 收起 理由
cais + 50 我很赞同!

查看全部评分

回复  

使用道具 举报

14#
发表于 16-9-2013 16:49:08 | 只看该作者
编译就是词法、语法的转换,,
-- 说漏了。编译是三步,词法分析、句法分析和语义分析。
问题是
1、所有的语法和词法都支持吗?
-- 编译是从一种形式语言翻译成另一种形式语言。可以是任何语言。
2、如何转成机器码?要硬件厂商的帮助吗?
-- 就是第三步语义分析
3、现在经典的成熟的架构和模式是什么样的??
-- 不知道你问的是什么,编译原理始于自动机理论,从来没变过。

评分

参与人数 1威望 +50 收起 理由
蓝山夜妖 + 50 正解!

查看全部评分

回复  

使用道具 举报

15#
发表于 28-12-2013 06:28:26 | 只看该作者
kingsking 发表于 15-9-2013 20:30
第一个发明硬盘,发明cpu发明,操作系统。发明编译器的都发了。。:)

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


回复  

使用道具 举报

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

LZ说的是编译速度最快的。
回复  

使用道具 举报

17#
发表于 28-12-2013 23:40:38 | 只看该作者
编译原理是CS的基础课程。如果有兴趣做软件的话,建议学习之。
回复  

使用道具 举报

18#
发表于 29-12-2013 00:33:03 | 只看该作者
不用学原理,只要会用工具就行,比如ANTLR,一般足够用了。网上有现成的教程。
回复  

使用道具 举报

19#
发表于 29-12-2013 14:58:57 | 只看该作者
如果要在编程技术上面下功夫,要想自己的编程能力更具有优势,就是看你是不是比别人掌握了更多的基础理论和能力。

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

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

编程有内功和外功的区分,外功就是各种工具,标准和编程语言,这些会随着时间的变化而变化。而内功就基本上是不会有太大变化的,而且是跨语言的,学的越多对自己能力提升就越大。现在编程的内功,主要有编译原理,数据结构,设计模式,算法,重构等。还有工具级别的内功,如数据库,单元测试,依赖管理,框架等。等吧内功学好了,在使用外功来表现出来。你的编程水平就极大的提升了,也就是软件工程师和码农的差别了。

评分

参与人数 1威望 +50 收起 理由
cais + 50 我很赞同!

查看全部评分

回复  

使用道具 举报

20#
发表于 29-12-2013 23:42:22 | 只看该作者
caoglish 发表于 29-12-2013 14:58
如果要在编程技术上面下功夫,要想自己的编程能力更具有优势,就是看你是不是比别人掌握了更多的基础理论和 ...

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

使用道具 举报

21#
发表于 1-1-2014 19:15:51 | 只看该作者
回复  

使用道具 举报

22#
发表于 1-1-2014 20:24:17 | 只看该作者
提示: 作者被禁止或删除, 无法发言
编译原理蛮难的,不过意义重大,有空闲确实值得研究。楼主研究好了多分享
回复  

使用道具 举报

23#
发表于 15-1-2014 01:53:52 | 只看该作者
先看书,然后有兴趣就去看开源 gcc 的编译器源码。

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

这东西比较难学,了解一下很容易,学精不容易,听说 斯坦福 的本科这门课结课 每个学生都要做个简单的编译器出来。
回复  

使用道具 举报

24#
发表于 19-1-2014 07:39:43 | 只看该作者
william_m76 发表于 15-1-2014 01:53
先看书,然后有兴趣就去看开源 gcc 的编译器源码。

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

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

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

而且這份編譯程序,居然還是計機系的傳家三件寶之一。
回复  

使用道具 举报

25#
发表于 19-1-2014 18:09:49 | 只看该作者
开发编译器机会不多,但是编译原理的思想是实际项目确实用的上的。
回复  

使用道具 举报

26#
发表于 19-1-2014 22:34:11 | 只看该作者
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也就是你愿不愿意的问题了。

评分

参与人数 2威望 +100 收起 理由
cais + 50 谢谢分享!
ubuntuhk + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

27#
 楼主| 发表于 28-1-2014 02:00:38 | 只看该作者
本帖最后由 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(秋)
回复  

使用道具 举报

28#
 楼主| 发表于 28-1-2014 02:01:31 | 只看该作者
清华大学计算机专业核心课程(转) - 日志 - 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

回复  

使用道具 举报

29#
 楼主| 发表于 28-1-2014 02:06:52 | 只看该作者
本帖最后由 kingsking 于 27-1-2014 23:16 编辑

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

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

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


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

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

注:就是说我现在再学巴菲特或是金融,我觉得都没进步了,就像学跑步,你不是这个材料怎么学也没用。。哭。。:((
回复  

使用道具 举报

30#
发表于 28-1-2014 06:37:38 | 只看该作者
kingsking 发表于 28-1-2014 02:06
说到计算机,也想谈谈股票。
我现在上班的事和这2个都没关系。。:)
现在的事是糊口,想发展,要靠新技术 ...

那还不如我,我从不炒中国股票,所以我也没浪费时间啦

评分

参与人数 1威望 +50 收起 理由
kingsking + 50 谢谢分享!

查看全部评分

回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 22-12-2024 23:39 , Processed in 0.053142 second(s), 46 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表