编译器如何来的
1. 最早的C语言编译器是什么做的
汇编。这真的是最早最早的。
准确的来说,这和编译器的开发有关,不用说太细,很麻烦怕你不懂。你现在假设第一个编译器是用会变写出来的,它的功能很简单,就是解释简单一种类似于C语言的高级语言,但是这种所谓的高级语言还没有完全拥有C语言的所有特性。只有比较简单核心功能,比如能把文本文件的高级语言转换成机器代码并且执行。
有了这个原型之后,就可以用这个编译器来解释简单C程序,就可以用C重写编写一个新的编译器,这样就有更多的C的功能。于是,从此之后就用现有的编译器解释更复杂的语言,用更复杂的语言写出更好的编译器,然后不断这样迭代。这确实是编译器的演变。
然后最后一个问题就是当一个新的CPU发明过后,怎么办,需要重写又从汇编开始写编译器吗?答案是不用。假设你有一个CPU A执行一些代码,你用汇编写了一个基础的C编译器,然后用C写出了更复杂的编译器,接受更复杂的C功能,然后不断循环演化。现在你有了CPU B,CPU B和CPU A执行两套完全不同的代码,那如何让CPU B的机器也可以变异C语言呢?因为现在A上面已经可以运行非常复杂的C语言程序了,所以你可以在A上面开发一个编译器把C语言程序转化为CPU B的执行代码。然后用这个程序,直接编译你的C语言编译器,再把这个程序转换到有B命令集的电脑上面,这样你就开发出了B电脑需要的C语言编译器。
所以除非你真的是活在非常早起的人类。否在现在的编译器基本上都利用这种原理直接编译已经用C语言或者其它高级语言写好的代码来产生新的编译器就行了。理论上可以只使用C语言来开发C的编译器,不过处于一些历史原因和底层效率等因素的考量,部分代码还是使用汇编来实现的。
我举得不过是一个例子,不一定是真实的C语言编译的进化,何况有这么多不同的C语言编译器,每一个的发展历史都有小的不同。但是基本上都是利用了这种编译器编译新的编译器的思想来实现了。而这样回溯回去,最早的编译器只能使用汇编来些。而其实最早的汇编语言的编译器就只能使用机器语言来写了。不过都是先处理简单的转换任务,有了这个核心功能过后,就可以写程序转换更复杂的语法。然后越来越复杂。就有了各种各样的高级语言编译器了。
2. 程序是通过编译器编译才能执行的,那么编译器又是怎么
一般来说,程序语言的编译有两个变量,一个是语言本身的语法体系,另外一个是目标机器的指令集体系结构。
对于前者,我们要发明一个新的编程语言的时候,一般是用已有的编程语言写新语言的编译器;
对于后者,要进行交叉编译,即在A指令集的计算机上编译B指令集计算机要用到的二进制程序。
本质上是一个鸡生蛋蛋生鸡的问题。
然而还是会绕到最终的问题:最最开始的第一只鸡(蛋(编译器))哪里来的?
当然是拿汇编语言写的啦~
那第一个汇编语言的汇编器是怎么写的?当然是直接手写二进制代码啊。。。
3. 编译器的历史
20世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。它已是编译原理中的一个标准部分。
有限状态自动机(Finite Automation)和正则表达式(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系统开发)是这其中的佼佼者。
在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。
编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它正迅速地成为计算机科学课程中的中心环节。
在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。
大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。
编译器相关专业术语: 1. compiler编译器;编译程序 2. on-line compiler 连线编译器 3. precompiler 预编译器 4. serial compiler 串行编译器 5. system-specific compiler 特殊系统编译器 6. Information Presentation Facility Compiler 信息展示设施编译器 7. Compiler Monitor System 编译器监视系统
4. 请问编写软件的第一个语言程序是如何诞生的
早期的计算机软件都是用汇编语言直接编写的,这种状况持续了数年。当人们发现为不同类型的CPU编写可重用软件的开销要明显高于编写编译器时,人们发明了高级编程语言。由于早期的计算机的内存很少,当大家实现编译器时,遇到了许多前源技术难题。
大约在20世纪50年代末期,与机器无关的编程语言被首次提出。随后,人们开发了几种实验性质的编译器。第一个编译器是由Grace Hopper于1952年为A-0语言编写的。通常认为,1957年由IBM的约翰·巴科斯领导的FORTRAN团队介绍了第一个完整的编译器。1960年,COBOL成为一种较早的能在多种架构下被编译的语言。
高级语言在许多领域流行起来。由于新的编程语言支持的功能越来越多,计算机的架构越来越复杂,这使得编译器也越来越复杂。
早期的编译器是用汇编语言编写的。首个能编译自己源程序的编译器启悔简是在1962年由麻省理工学院的Hart和Levin制作的。从20世纪70年代起,实现能编译自己源程序的编译器变得越来越可行,不过还是用Pascal和C语言来实现编译器更加流行。制作某种语言的第一个能编译器,要么需要用其它语言来编写,要么就像Hart和Levin制作Lisp编译器那样,悄裤用解释器来运行编译器。
引自 : 维基网络
5. 最早的编程软件是怎么来的
最早的没有现在意义上的编译器,是靠打孔器打纸带编程。大型机靠读纸带执行程序。
由于机器语言由0、1组成,难以阅读。所以在机器语言的基础上开发了汇编语言。最早的汇编语言编译器应该是机器语言编写的。一旦第一个汇编语言编译器开发出来以后,以后的版本都可以用汇编语言来编写了。
由于汇编语言还是很难使用,所以开发出高级语言。也可以预见,第一个高级语言编译器是由汇编语言编写的。有了第一个高级语言编译器,以后的高级语言编译器便可以用这个高级语言编译器生成。
也就是说,现在我们使用的C++语言编译器,可以用C++语言来编写。
6. 计算机语言是如何开发出来的
计算机语言是“设计”出来的,设计只需要思考和写文档,而该语言的编译器才是“开发”出来的。编译器也是程序,所以也需要用编程语言来编写,至于用什么语言就随开发者的便了。很多编程语言是用别的更基础的语言开发的,其中用最多的就是C语言。C语言编译器很多,大部分都是用别的C语言编译器编译出来的,而最早的C语言编译器是用汇编语言写出来的,最早的汇编语言编译器是通过“编译器自举”开发出来的。
相关回答
一个很深奥的问题
一、新建项目 启动Microsoft Visual Studio 。NET,新建一个C#项目MyApp,本例工程存放于F:\Csharp\MyApp。 二、添加控件 在Form1 窗体上添加三个控件(见图1):主菜单MainMenu、标签Label1和按钮Button1。
Label1和Button1控件的属性均采用缺省设置。MainMenu控件中添加三个菜单项menuItem1、menuItem2、menuItem3。Text属性分别设为“语言”、“中文”和“English”。
menuItem2、 menuItem3 的RadioCheck属性设为True。 图 1 三、创建配置文件 在项目中添加一个文本文件 i,保存当前程序的语言版本设置。该文件中只有一行内容。
如果是“English”,则表示程序为英文版;如果是“Chinese”则为中文版。这里暂且保存为“English”。 四、创建资源文件 。NET中的资源文件有三种: 文本(。txt )文件、XML 格式的。
7. 编译器是由谁来长期维护和组织以及更新的
有CPU的制造商(例如 Intel 有 icc),也有其他的开源组织(例如 GNU 的gcc),或者其他的公司(例如 Microsoft 的 MSVC)。
如果有国际标准或者事实标准的话,编译器一般会对这些标准给点面子 —— 当然 Intel 之类的本身就有制定标准让别人认可的能力。
CPU的制造商会提供这种CPU使用的指令集,以及其他一些关于CPU的架构的信息。例如网上可以找到 Intel 的 manual 。依照这些就可以写出具有特定功能的二进制指令。
上面说的 icc、gcc、MSVC可以从各自的网站下载,此外一些操作系统会自带编译器(例如 Linux 系统通常会自带 gcc )
8. 汇编语言编译器是怎么来的
第一个软件,显然是用机器语言写的。
当用机器语言写成了文字处理软件,才能用屏幕、键盘打字。
当用机器语言写成了编译软件,才能把打好的字,编译成机器码。