编译器的发展史

作者&投稿:钭孙 (若有异议请与网页底部的电邮联系)
手机C++编译器~

一直以来都喜欢用手机看书,尤其是在上班时。看的最多的是编程一类的书,主要是C++,看着就想写写代码,可是电脑用不能用,怎么办?于是想到用UC浏览器找找看网上有没有在线的编译器,想什么时候写代码都可以验证。于是就找了几个,各有千秋吧。中文的我没找到,全是英文的,不过英文不难,其实也不需要懂英文,只要知道在什么地方写代码,然后点击按钮进行在线编译就行了。好了,下面看介绍:

1、http://codepad.org/

推荐星级:★★★★

是否需注册:否(注册的话也很快,几秒钟而已)

优点:网页界面简洁,一目了然,适合手机浏览器。且支持C,C++,D,PHP,PYTHON,Perl,Ruby等十几种编程语言,非常强大。查看执行结果时,高亮显示代码。

缺点:有时点击提交按钮后,给出一个出错页面,需多次提交才给出结果。另外不具有交互性,且不提供编译后的可执行文件。

2、http://www.comeaucomputing.com/tryitout/

推荐星级:★★

是否注册:貌似不需要(网页上显示,注册后功能更多)

优点:编译器的版本多

缺点:页面文字较多,不适合手机浏览,且编译后显示结果不明了,反正我最简单的"Hello World"程序好像都通不过

3、http://www.botskool.com/online-compiler(本人最喜欢的)

推荐星级:★★★★☆

是否注册:需要(注册简单,绝对值得)

优点:自动记录上一次所写代码,执行结果显示明显,并且可以进行简单的交互(我认为是亮点)。网站提供了交流论坛,编程学习资料。

缺点:页面广告文字较多,不过手机浏览的话还可以接受。无论是编写代码还是查看结果,页面大面积是其他用户代码示例,显得页面臃肿。支持语言少,只有C,C++,Java三种。

4、http://onlinecompiler.net/(现在不知道为什么打不开了,前几天还可以用,在这列出来先)

推荐星级:★★★

优点:记不清了,只记得可以下载编译后的exe文件(这就是我列出来的原因)

缺点:不记得了

5、http://cmpe150-1.cmpe.boun.edu.tr/phpccompiler/login.php

推荐星级:★★★

是否注册:否

优点:编辑时有感应提示框,高亮显示语法,可下载编译后exe文件。界面简洁。

缺点:只支持C语言。只支持IE6以上浏览器,其他浏览器一概不支持,手机无法浏览。不在线显示运行结果。没有出错提示。

6、http://ideone.com

推荐星级:★★★★★

是否注册:否(注册后功能更强大)

优点:我见过的支持语言最多的,多达58种(哥惊呆了),编辑功能最强大的(显示行号,语法高亮,查找,定位到行,全屏显示,行信息,列信息显示),错误信息显示清晰,结果显示明显,有简单交互功能,可以上传源文件进行编译,并且可以下载exe文件,界面简洁更难能可贵。

我用的是VS2008

编译器
编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源程序一般为高级语言(High-level language),如Pascal,C++等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

一个现代编译器的主要工作流程如下:

源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)
目录 [隐藏]
1 工作原理
2 编译器种类
3 预处理器(preprocessor)
4 编译器前端(frontend)
5 编译器后端(backend)
6 编译语言与解释语言对比
7 历史
8 参见

工作原理
翻译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。

编译器种类
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

预处理器(preprocessor)
作用是通过代入预定义等程序段将源程序补充完整。

编译器前端(frontend)
前端主要负责解析(parse)输入的源程序,由词法分析器和语法分析器协同工作。词法分析器负责把源程序中的‘单词’(Token)找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端词法分析器看到的是“a, =, b , +, c;”,语法分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。

编译器后端(backend)
编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。

一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。

编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。 不同的分析,优化发生在最适合的那一层中间代码上。

常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的 变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointer analysis),数据依赖分析(data dependence analysis)等等。

上述的程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。 优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threaded code)。

机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。

编译语言与解释语言对比
许多人将高级程序语言分为两类: 编译型语言 和 解释型语言 。然而,实际上,这些语言中的大多数既可用编译型实现也可用解释型实现,分类实际上反映的是那种语言常见的实现方式。(但是,某些解释型语言,很难用编译型实现。比如那些允许 在线代码更改 的解释型语言。)

历史
上世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。

有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。

人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。

当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。

在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节。

在九十年代,作为GNU项目或其它开放源代码项目的一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感性趣的人可以很容易的得到它们的免费源代码。

大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。

编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。

编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。


文言文《指南针》中的指南针“活”体现在哪里?
《梦溪笔谈》,北宋科学家、政治家沈括(1031年-1095年)撰,是一部涉及古代中国自然科学、工艺技术及社会历史现象的综合性笔记体著作。该书在国际亦受重视,英国科学史家李约瑟评价为"中国科学史上的里程碑"。 据现可见的最古本元大德刻本,《梦溪笔谈》一共分30卷,其中《笔谈》26卷,《补笔谈》3卷,《续笔谈》1卷...

中国近代史的开端:鸦片战争
十八世纪末至十九世纪中前期,英国完成了第一次工业革命,科学技术的飞速发展使英国经济社会飞速进步。然而,在世界贸易中,英国却屡屡在中国“碰壁”。于是,一个雄心勃勃的新帝国在东方找到了旧帝国,发生了激烈的碰撞。 这场打开中国近代史大门的战争是在什么背景下爆发的?一是马戛尔尼访华,帝国主义未能打开中国的大门...

电脑的发展史
C.电脑的限制 a.只有正确的资料输入,才有正确的结果输出(GIGO).b.问题必须量化.c.计算机非万能:人类必须提出解决方法,并将其程式化,电脑才能处理.2.电脑的发展史及趋势 A.美国社会学家杜佛勒,将人类社会的变迁形容成「波」:第一波是农业革命,第二波是工业革命,第三波是资讯革命....

请用英语简述电脑的发展史,120词左右,最后要翻译 ,谢谢
电脑的学名为电子计算机,是由早期的电动计算器发展而来的。1945年,世界上出现了第一台电子数字计算机“ENIAC”,用于计算弹道。是由美国宾夕法尼亚大学莫尔电工学院制造的,但它的体积庞大,占地面积500多平方米,重量约30吨,消耗近100千瓦的电力。显然,这样的计算机成本很高,使用不便。1956年,晶体管...

求英语和中文的发展史 英文版
汉语的历史:上古汉语 相传黄帝时中原有“万国”,夏朝时还有三千“国”,周初分封八百诸侯国,“五方之民,言语不通”(《礼记•王制》)。上古汉语存在于周朝前期和中期(公元前11世纪到前7世纪),文字记录有青铜器上的碑铭、诗经集、历史书书经以及部分《易经》。春秋初期,见于记载的诸侯国...

哪位好心人帮忙翻译点英语啊我很着急翻译器的别进
One hundred years ago,the Movies was invented by the people .But in the last centery , the Movies has been a rapidly development which due to the progress of the film's technology and the progress of the director's logos . The films's technology had been reformed in ...

...一女一男史前人类冷冻,解冻后语言不通,最后翻译器制造出
《冰人》[法] 勒内·巴雅维尔 著)这本书

牧野之战史上第一次扭转乾坤的战役!
所以,黄河流域一带的城池成为了千百年来兵家必争之地,上演了一场又一场惊心动魄的战役,我们所熟知的历史大事件﹣﹣牧野之战,就发生在这里! 这一战有两大军事特征:先发制人、以少胜多。也正是这一战,大商帝国没能扭转乾坤,让西岐顺利器完成改朝换代的历史进程! 大商帝国在东线正与东夷部落打得难解难分,而...

英语论文翻译求大神帮翻译 谢绝翻译器的。。谢谢大大们了
Advertisement translator should think about the audiences' aesthetic psychology of the conversion process from the source language to the target language,takes the keeping aesthetic as consideration.The translator can weaken or completely abandon the source language text for the sake of the ...

中国工商银行历史翻译,急!!!翻译器就不用麻烦了哈!
Industrial and Commercial Bank of China was founded in January 1, 1984, registered capital of 20.8 billion, total assets of 333.3 billion yuan.June 1985 Industrial and Commercial Bank of China as an international association of savings banks Member.The first time in October 1989 ...

进贤县18462469336: 编译器的发展史 -
仪卷莱亿: 编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序.编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序.源程序一般为高级语言(High...

进贤县18462469336: 编译器的发展历史是怎样的呢?
仪卷莱亿: 1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64(TM)的源代码,后被全世界多个编译器研究小组用来做研究平台进行改进,并命名为Open64

进贤县18462469336: 关于编译器的产生 -
仪卷莱亿: 编译器本身也是程序,通常也是C语言写的,世界上第一个编译器的部分内容肯定只能用机器码写...但机器码建立的一些文本处理功后,自然就用这个功能处理宏文本来代替机器码...当然第一台计算机能用一种文本语言来代替机器码,...

进贤县18462469336: 世界上第一个编译器是用什么编译器编译出来的 -
仪卷莱亿: 最初的语言 就是01代码 也就是机器语言 是不需要编译的 第一个编译器 就是这样一点点写出来的,是汇编到二进制的编译器 所以 第一个编译器本身不需要编译,直接运行即可.

进贤县18462469336: 第一个 C 语言编译器是用什么语言编写的 -
仪卷莱亿: 参考 Dennis M. Ritchie 写的 The Development of the C Language:Chistory,C 语言诞生的基本过程就是 Ken Thomson 不满意 BCPL,于是设计了 B 语言,并且用 BCPL 为 B 语言写了一个编译器,然后从这个编译器开始自举写新的 B ...

进贤县18462469336: 第一个java编译器是那一年推出的 -
仪卷莱亿: 1995年5月 jdk 就是 一个编译器 只是要手动在dos下面去编译而已 所以 java 是1995年5月发布的 同时 也发布了jdk 所以 编译器就产生了

进贤县18462469336: java的编译器是哪一年推出的? -
仪卷莱亿: 关于Sun JDK,大致可以分作如下几个阶段:*1996年1月,JDK 1.0,JDK的首个版本.*1996年12月,JDK 1.1,重写AWT(引入新的事件模型),JavaBean组件规范,inner class,math包*1998年,JDK 1.2,Swing,Java 2D,Collection Framework...

进贤县18462469336: 汇编语言编译器是怎么来的? -
仪卷莱亿: 第一个软件,显然是用机器语言写的.当用机器语言写成了文字处理软件,才能用屏幕、键盘打字.当用机器语言写成了编译软件,才能把打好的字,编译成机器码.

进贤县18462469336: C#的发展历史 -
仪卷莱亿: C#的发展史1999年,就听说微软公司在研发一种名为“cool”的新开发语言,而具体内幕一直是个谜,直到2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,这个谜底终于揭晓了,这种新的、先进的、面向对...

进贤县18462469336: 历史上出现过的主流C/C++ 编译器都有哪些 -
仪卷莱亿: C++编译器很多的:Visual C++GNU C++Inter C++Sun C++clang等等.一般都用VC和GNU C++,其他的都是专业人士使用的.关于IDE,C++有很多,一些其他语言的IDE现在也支持C++了;Visual Studio系列(目前最新版本是VS2013)Dev C++(目前最新非官方版是Dev c++ 5.4.1)Code BlockNetBeansC-Free

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网