㈠ 编译器做什么工作
1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。 2. 语法分析 语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。 3. 语义分析 语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。 4. 中间代码生成 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。 5. 中间代码优化 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。 6. 目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。 7 符号表管理 符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。 8 出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。
㈡ 做个编译器需要什么前置条件
用C语言比较好,效率比较高。
用java也可以,好调试。
我用过以上两种做过编译器,别的语言不好说。
做个编译器不难,一个人做也用不了太多时间。但相关的东西要做的话就花时间了。比如编辑环境,比如调试跟踪器。
㈢ 做编译器有前途吗
有,只要你能做个能用编译器,那就是高级软件工程师了,大多数高级工程师都没这水平,其实做编译器根本没有意义,因为你做出来的不会有人用。。。只有大型软件公司诸如苹果,微软,intel推出新新型软硬件开发环境,或者用新语言包装开发组件的才会去做编译器,你是要去这些公司工作吗???????普通人做的编译器根本无法推广,质量保证不了,还有就是非常麻烦,编译器是非常复杂的,最低也要精通目标环境的汇编,被编译的语言(可以自己开发新的,也可以沿用旧的诸如C++等),还有就是令人头疼的正则表达式,这些是最基本要求,这还牵扯不到编译原理。。。。。
㈣ java编译器和java解释器分别是干什么用的我只知道java编译成class文件需要编译器
如果做一件事情,需要三个步骤的话,写代码第一步,编译器做了第二步(把代码转换成字节码),解释器做第三步(把字节码解释成最终的执行代码),因为一次性到第三步有点复杂!想想现实生活中这样的例子吧,比如说多语种翻译之类的!
㈤ 开发一个 C++ 编译器的难度有多大,难点又在哪里
C++的前端是出了名的复杂度和可靠性要求并驾齐驱的软件。
(这两点都比它高一个数量级的大概就只有OS了)
对于这种系统,唯一的办法就是烧钱。
烧钱的作用主要包括:
1.留人;
2.填坑;
3.买买买。
先说留人:复杂度一般是“细节”的代名词。现实中的编译器大多数以递归下降为主,自底向上的归纳推导为辅。这两样在教科书上也就是几页纸的事情。但是现实总是很残酷的,人们总想让语言更加“易用”,这就意味着各种上下文相关的情况都会出现。
对于C++来说,你要判断一个符号是类型或者变量(比如这个符号被用在模板参数中),要看前面的声明/定义。这就是一个上下文相关的推导。然后你就会写大量的if else switch case之类的代码来解决各种各样的可能分支。写它的人当然知道它是做什么的,但是如果这个人离职了,新来一个人,就呆掉了,这写的都是什么煞笔玩意儿。因为它不知道现实中怎样的需求会导致奇形怪状的逻辑。所以人员的稳定,对于这种长周期迭代、逻辑复杂的项目是很重要的。但是人的水平要求高吗?不算高也不算低。总结来说就是:有逻辑,知好歹。技术什么都可以培养,但是态度和基本智商是比较难培养起来的。
至于怎么保证人员稳定?很简单:加薪。
再说填坑:编译器是对正确性要求很高的基础软件。这里的正确性既包括产生的代码的正确性,也包括编译器自身对于各种问题的容忍度和足够丰富的错误提示。容错和错误提示本身也是代码,也有很大的出错几率。所以这些软件,bug少不了。但是作为基础软件,你又不能随便就2+3搞成了2*3,这样还怎么让别人相信爱情。所以要烧很多钱来养一帮debugger。
再说买买买:古人日:我们不用很麻烦很辛苦也可以成佛。既然这么费神我们自己做干什么,不如买别人的吧。于是MS就干脆不自己做了,直接去EDG整了个前端,这样就可以少了不少人年。这就是传统土豪和水果这种新暴发户想的不一样的地方。
传统土豪想的是:我们有这么多钱为什么还要自己解决问题呢?买买买!
水果新贵则是:啊呀,不小心有了这么多钱,我们要不要给自己制造点问题好把这些钱花出去?
㈥ Java中,创建一个对象时,编译器到底做了些什么
首先JAVA虚拟机 检查创建这个对象的类是否是一个以前从没有见过的类型,如果不是,java虚拟机将为其分配内存,如果是,java虚拟机将调用具体的ClassLoader找到对应的.class文件,并将这个文件的内容读到内存中去
㈦ 编译器是什么意思,是做什么的
编译器
编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。
下面我们看看它是如何工作的。首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。
有一个称为LCC的编译器,还挺不错的;还有一个用于分析其规则的小工具;
㈧ 汇编语言编译器是怎么编写的
编译器自举!搜索这个关键字
程序都是编译器编译的。这个是肯定的
至于第一款X语言编译器是不是直接1010101010自己写的那就不知道啦
一般开发编译器的话。有两条路选择
1.利用yacc(或者其变种)&lex(词法分析)-等工具自己生成语法模板
词法语法都可以使用这些工具自己生成
然后自己编写生成的中间码和生成的机器码就可以了
一般做编译原理类似试验都是如此的。许多编译器也的确是这样
2.自己写词法分析和语法分析。可以参考一些开源的编译器
lcc-这个是ANSI C99标准的编译器是开源的
或者nasm,watcom等编译器到www.sf.net上不少开源的编译器
总的来说。高级语言编译器比较难写
如果想快速写出一个的话
可以采用第一种做法。利用工具生成语法词法模板
先写一个简单的汇编编译器比较简单
开源的有nasm,jwasm(支持masm语法开源的编译器)
http://www.japheth.de/JWasm.html
fasm(这款编译器是自举的.就是自己可以编译自己),
http://flatassembler.net/
剩下的就是自己做好语言规则关键字map
引用高手的话。语言map做好了你的编译器也做好一半了
剩下的都是机械性的工作了。
生成x86或者arm指令。
优化工作这个很难解释.根据你所需要的做吧
毕竟可以做出一个无错,又XX的编译器已经很难得
你可以选择使用现有的编译器开发自己的编译器
然后等到你的编译器支持相当数量指令和成熟度的时候
使用自己的语法重新写一遍编译器.
这样你就可以用自己的编译器开发自己的编译器了(是不是很邪恶?)
另外举几个例子
Delphi的编译器是C++ Builder开发的。
而C++ Builder的IDE是Delphi开发的
C++ Builder的编译器是C++ Builder开发的-这个就是编译器自举了。。Delphi和C++ Builder共享一个后端化优化器。
Delphi 早期的版本的编译器是tasm直接编译的。可见Anders的汇编功力多强悍(Anders也就是后来VJ++,C#,.NET工程的核心架构师.最关键的灵魂级人物)
VC++的编译器是VC++开发的。很明显这都说明了编译器自举
自己开发自己。如果一个编译器可以做到自己编译自己。那基本上就可以实现任何功能了。
关于编译器开发的书籍可以看一下
龙书《编译原理(第二版)》
虎书《现代编译原理-C语言描述》
鲸书《高级编译器设计与实现》
建议从鲸书看起。然后是龙书
再来是虎书--虎书里面描述了许多现代编译器(正如其名)技术
例如面向对象啦,优化,垃圾回收等等.
鲸书看完基本上就可以实现一个简单的Tiny C编译器了
然后在龙书巩固,读一下语言规范,自己看一些开源的汇编编译器代码
自己就可以尝试做一个汇编语言编译器了.等到技术提高了
在尝试做一些高级语法识别,参考LCC代码做一下ANSI C99的
C语言编译器。再来就看你自己的兴趣和领悟度拉
如果想支持C++的话就得要对编译器做许多方便的研究
类似Java那种跨平台或者Ruby,Python等动态语言
虎书中也有描述。当然看自己功力了
㈨ 急急急!怎么设计一个软件,第一步是在哪里设计呀
#1:程的是很不容易的事,软件编程就更是如此了.所谓的编程,就是告诉计算机,第一步做什么,第二步做什么,这个过程.你可以选择你列的任何的一种语言都可以的,按照它的语法结构,编写代码,然后由计算机自动编译成计算机语言(0011001100111)二进制,最后会生成一个可以执行的(*.exe)文件.就象QQ.EXE之类的软件了,它里面封装很多的代码,你只看见了他的可执行文件.
#2:设计程序--是在一定的开发环境下设计的,C语言设计就要在VC或TC下编写,ASP要在ASP的环境下编写。C#就就要在Visual studio 2005下编写,还要按照各自的语法规则写。这样才能在它的环境中被编译,生成可执行文件(*。EXE)
#3:编程后还要调试,看看是不是达到了我们所要求的结果,要是没有的话就要在修改程序代码,知道按照我门的要求输出结果为止。这样编程过程就OK啦
#4:封装对象,加密加外壳,这样一个就好了。以后只要我们电击*.EXE就可以由计算机来完成我们预期的工作了.
其实编程真的,我个人以为 很有意思的.
㈩ C语言源程序开发的第一步是什么
第一步
在程序编辑过程中,所输入源文件中的是一些字符码,但是机器能够直接处理的是0、1信息。为此,首先要将源程序文件翻译成0、1码所表示的信息,应用相应的文件保存。这种保存0、1码的文件称为目标程序文件。由源程序翻译成目标程序的过程称为编译。
在编译过程中,还要对源程序中的语法和逻辑结构进行检查。编译任务是由称为编译器的软件完成的。目标程序文件尚且不能执行,它们只是一些目标程序模块。
第二步
将目标程序模块以及程序所需的系统固有目标程序模块(如执行输入、输出操作的模块)链接成一个完成的程序。经正确链接所生成的文件才是可执行文件。完成链接过程的软件称为链接器。
第三步
C语言中的运算符种类很多,正确的使用这些运算符,有以下三点需要注意。
1.含义
要注意区分一个运算符符号在C语言程序中和在普通数学表达式中的意义的不同,如“=”。
2.优先级
在一个表达式中存在多个运算符时候,进行运算的先后顺序。
3.结合性
即在一个表达式中存在多个优先级别相同的运算符时,先进行哪个运算符的运算。
第四步
标识符也称为名字,如变量名、函数名、文件名等。在C语言程序中,所使用的标识符应当符合以下词法规则。
(1).标识符是大/小写字母、数字和下划线所组成的序列,但不能以数字开头。
(2)C语言区分同一字母的大/小写,如abc和abC就是不同的标识符。
(3)C89要求编译器所能识别的标识符长度不多于31个有效字符。C99要求编译器所能识别的标识符长度不多于63个有效字符。
(4)普通标识符不能使用对于系统有特殊意义的名字,如类型名、语句名等。这些对系统具有特殊意义的名字称为关键字。