1. 编译器的工作原理
编译 是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
所以我们电脑上的文件都是经过编译后的文件。
2. 数据库,数据结构,编译原理对编程有那些影响和帮助
他们太重要了,
(1)数据结构:首先要明白---->程序=算法+数据
“数据结构”就是做数据这块的,例如一个“电影播放器”程序,首先要有“电影”吗,这个就是“数据”,那么就要用“数据结构”的知识,怎么存储每一帧,怎么高效,怎么能无损,怎么空间最节省.........,然后才是怎么去“解码”(解码就是“算法”做的啦),当然这么讲起来不是很严谨,但你可以看得出,数据结构可以说的上是有50%的重要性了。
(2)编译原理:不要以为,自己不去开发“语言”,编译原理就没有用啦,它能让你从根本上理解编译器,这对怎么提高程序的效率,怎么变出漂亮的程序很有用................当然貌似如果从事,“人工智能”这一块的话,编译原理也非常重要。
(3)数据库:又是刚才哪一点----------->程序=算法+数据
数据以文件的形式存储,是在不是很高效,所以,为了方便数据的管理与查找等等..........人类作出了“数据库”,说白了,它就是用来解决“数据”这部分内容的,现在基本无论你做什么都离不开数据库了,从大型网游到网站,到手机等的移动设备编程,都要用到数据库
--------------------------------------------------------------------------------------------------
从你的体温来看,你可能刚刚接触编程,没有做过什么成品,随着你越来越了解这个领域,你会刚到这些东西非常重要,当然还有很多东西,与以上三者地位相当,或更高,例如,微型计算机组成原理,等一些硬件方面的知识.......................................
---------------------------------------------------------------------------------------------------
还是“广泛阅读”吧。
3. 不同编译环境 对同一程序可能有哪些影响
可能的,原因很多,无法一一列举,只是举两个例子,
比如某些编译环境(通常debug环境),会给变量付初始值,比如int给0,指针给null,这样的话如果程序本身实现忘了给初始值,那么可能还是能够正常工作下去。但是在不给变量付初始值的编译环境,就会出错了。
另一个例子是对于内存的安全检查,如果程序存在内存溢出的情况,那么不对内存做安全检查的编译环境编译后生成的代码可能可以正常工作,但是对内存做安全检查的编译器出来的就可能会出现异常了
4. 为什么大学老师教c语言用的是Turbo C , 感觉好麻烦
你说的是写程序的软件?那我说一说我用过的版本:1turboc2.0:当年学习C语言时在机房只让用这个软件,全英文版本,操作很……反正那一学期过后我就再也没用过,不太明白当时老师为什么一定要让学生用这个软件(一代代传下来的?),也许操作过程可以让学生对C理解得更深(反正我是没体会到……),不过因为是很原始的东西,所以不会有“篡改”函数的问题(所谓篡改就是编译器为了优化、安全等问题,可能会把c中的一些原函数改了,改成一个换了名字的新函数,比如下面介绍的vs,对初学者来说会很烦人,因为会花一些时间去找为什么根本没有错的代码会报错……)2vc6.0:当时接触了之后第一反应:好东西啊!跟turboc比起来,那简直是方便太多太多了,居然可以鼠标点击随意定位代码位置(用turboc久了就是这么容易满足……),终于告别了turboc那蓝色的窗口,可以十分舒服的敲代码和调试了3vs2013:很好很强大,用了一下便把vc给卸了,和vc6.0相比,vs让我更舒服(也变得更懒)。 总结一下:turboc虽然各种让人讨厌,但小巧,学习c语言基础有它确实就够了,还不用担心一些编译器优化所导致的报错;vc自然比turboc好用得多,而且也不大,不过6.0也有点古老,和win7就有兼容的问题,有时会出错,不过vc++还有新版本,更加好用不过体积也更大;vs很强大(很强很大),集成了很多功能(c++、c#、数据库、网站建设……),所以体积你懂得,vc++那些新版本的体积和它一比就是轻量级……只是学习c语言的话,用vs性价比太低了 建议:老师教学就用老师建议的版本,自学就用看的书中建议的版本,这样不用担心因编译器版本问题而导致的代码报错。但如果实在不想用那就选vc吧,6.0相对来说还是比较适合初学者的,也可以选vc其他版本,不过不建议太新的版本,因为新版本往往代表着功能的增加,作为初学者把时间浪费在熟悉编译器环境上有些不值,把精力放在c语言的学习上才是初学者应该做的(等打好基础了再去选一个好点的编译器来提高效率吧)
5. 关于编译器
看来你还没入门哦,就想写一个操作系统了
嗯!有志不错,相信有一天你会成功的。
一般地说写一个OS你要会一门高级语言(如C++)一门低级语言(如汇编asm)高级语言用来做界面这方面比较容易一点。而低级用来做低层驱动这方面是高级语言所不能相比的。
当然C语言介于两者之间,也能对硬件编程,但C是16位的程序对于图形处理不是很好,我个人建议你低级语言用汇编,对硬件编程时没有那么抽象,想传送的数据很清楚知道来去的方面,但要对硬件这方面的知道要了解。还有就是像要懂操作系统原理还要知道怎么去实践这些原理这些才是重要的,选择语言不是难事,给你一个组合吧(C和asm)虽然不能做出XP这种效果来,但这个图形操作系统还是很的,就看你自己的功夫了。
对于你补充的问题呐,程序的位数好像指CPU的寄存器的位数吧,在386以前的CPU好像一条指令大是16位的(当然有的指令没这么大,有8位的)在386后的新加的指令中才有32位的,为了使386以后的CPU能使用以前的指令,规定在16位指令加上不同的指令前缀,形成32位指令形式,这里的32指令就是32位程序的指令,而你说的64位程序。。在我所学的指令里没有64位的指令,但以以前的指令在在64位上运行,也要兼容的问题吧!之所以有64位的CPU所来是指CPU一次处理数据的位数,比如说32的CPU一次能处理32位的数据,而要处理64位的就要分两次从内存中取数据而占用总线,这样会使CPU有空闲,而64位的CPU只要一次就行了,所以你理解错了,
最后一个问题是人家生在那个年代,和人家有远见,成绩不好并不代表实践不好,理论和实践是两回事,理论在好不会实践也是废话,所以人家敢做,在实践中学习,在加上机遇。这个事不是你我能说清的,只能说说个人见解罢了。。
对于计算机硬件的知道只能告诉你这么之了,,大家相互学习,共同进步吧!!
如果你想找资料的话!你把你的邮箱留下,我这有硬件,操作系统,指令这些用于写操作的资料!!
6. 现在的在校大学生学c语言使用用的编译器还是那个很老的那个vc6.0吗为什么高校不使用新一点的编译
经典啊,教材资料都是针对vc6.0的,如果换的话,就需要换教材换资料,老师的工作量就会变大,学校就要多花钱,说到这了,你懂的!
7. 什么是编译原理
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。
这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的 必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪 50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟 编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间 诞生不少名着的相关数论。
8. 大学里java教学用什么编译器
一 eclipse / myeclipse
当年学习java,最先接触到的就是 eclipse。喔了个噻,当时感觉eclipse好牛啊,有好多先进的功能:
1. 可以方便地进行包管理。可视化窗口,创建目录和文件都很方便,移动包,复制包等都可以方便的进行。
2.热键操作。复制保存啥的就不说了,代码提示这个功能还是很不错的,在写着写着,脑子突然短路的时候,可以通过快捷键把脑子快速带回来。
3.代码调试。有时候,写着写着代码,突然间就报错了,不知道哪里错了,咋整,这时候,如果使用编辑器的话,就可以使用 debug模式进行调试了,找出问题所在,解决问题。
4.一些代码管理等插件。在企业中肯定要用到代码同步工具,svn 或者 git , 在编辑器中会提供这样的插件,方便代码的管理。
二 idea
相比 eclipse 和 myeclipse ,idea 的基本功能差不多。
1. 包管理:也是有方便的包和资源管理。
2.热键:也是提供热键管理的,而且还很好用。
3.代码调试:debug模式用起来也是很舒服。
4.插件方面:也是支持一些插件的,如 热部署插件等。
三 比较
1. 操作:两个软件有不同的快捷键,虽然idea兼容部分eclipse快捷键,但是不建议这样做。
2.资源消耗:idea更能吃内存啊呦喂,电脑配置低的伤不起啊。eclipse要更柔和一点。
3.是否免费:eclipse 是免费的,myeclipse和idea 是要付费的呦。但是嘛,你懂得。
4.专业性:idea 应该是更专业的,有更高的代码更新机制和代码提示功能。但是 eclipse 涉及的范围更广,除了java 和可以编辑其他语言的项目。
四 建议
1. 如果电脑配置比较低,建议使用 eclipse ,并且使用较低版本的,这样,电脑不会太吃力。如果配置比较高,比如,16G内存,固态硬盘,那就使用idea吧。
2. 没有最好的编辑器,只有最适合自己的编辑器。任何一个编辑器用习惯了,都是很不错的。
希望对您有所帮助!~
9. 您好,我现在学单片机,但是老师讲的是汇编语言,我感觉听懂比较困难,我们没有任何的汇编基础,我现在编
当然有影响啦,是很好的影响,让你知道怎么样去设定基本的指令。汇编其实不是很难懂的。指令掌握了,理解下基本的程序就可以了。C语言编程的也要靠汇编进行解决问题。我之前也是学汇编的,现在工作基本上用C来写,真的多亏学校老师教的知识来应对。现在上手比较快。学的东西多,我觉得不会有相克的原理。对嵌入式的没有影响。都是语言。没关系的。不难。C应用范围会更广点。
10. 为什么要学习编译原理
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名着的相关数论。
推荐参考书
虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。
第一本书的原名叫《CompilersPrinciples,Techniques,andTools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐?砘?嘴域确实?忻?所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是着名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。
第二本书的原名叫《ModernCompilerDesign》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。
第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器TinyC.等你把整本书看完,差不多自己也可以写一个TinyC了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。
推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。
编译原理的实质
几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。
词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。
语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。
等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。
关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。
本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。
关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课