c的编译器是怎么做的
⑴ 编译器是怎么被编译出来的
我们要在Y系统上做一个c语言的编译器,假定:X与Y是不同的两种计算机,其指令系统不兼容。考虑以下几种情况:
Case 1: Y上没有C语言编译器,但X系统上有。
那么我们可以先在X系统上开发一个针对Y系统的C语言交叉编译器。然后用这个交叉编译器重新编译已有的这个C编译器的源代码,就可以得到能在Y系统上运行的C语言编译器了。(交叉编译器:在X系统上运行的编译器,但编译出来的目标代码在Y系统上运行。嵌入式平台上的程序基本都是交叉编译得到的,因为嵌入式平台上很少会有自己的编译器)
Case 2: X,Y上都没有C语言编译器,但有另一种语言的编译器。
a.我们可以先划出C语言的一个子集,这个子集必须满足两个条件:首先,必须足够简单,简单到可以用另一种语言来编写接受这个子集的编译器;其次,必须足够强大,强大到用这个语言子集就可以编写出接受C语言的编译器。(你一定奇怪为什么一个语言的子集就能写出接收整个语言的编译器,呵呵。我猜是因为一个语言的很多复杂特性都是由简单特性构成的,就像一个struct结构完全可以用几个定义在一起的简单变量代替实现;而且,编译器的实现往往不会用到这个语言的高级特性,需要用的都加到那个子集里就行。)
b.再用另一种语言编写一个能接受这个C语言子集的编译器,只要保证可以在Y系统上正确运行就行,并不对其效率作要求,因为基本上它只被用一次。
c.然后,用C语言的子集编写一个在Y系统上的C语言编译器,用上一步得到的编译器编译得到可用的Y系统上的C编译器。
⑵ 怎样去写一个编译器(用C语言写C语言编译器),需要哪些知识做铺垫,可以给一下相关网站和书籍的推荐吗
书籍请参考编译原理的龙书,以及flex,bison,llvm的manual。
如何写我可以给你一个大致的流程,
编译器由词法分析器->语法分析器->中间代码生成器->后端组成。
用C语言写编译器一般可以按照以下步骤:
1.使用flex生成词法分析器。(flex可以通过自己编写的描述文件来自动生成词法分析器)
2.使用bison生成语法分析器。(bison可以通过自己编写的描述文件来自动生成语法分析器)
3.通过语法分析器得到输入代码的语法树表示。
4.编写遍历函数遍历语法树生成中间代码。(这里推荐使用LLVM的中间代码表示)
5.利用LLVM工具集来编译执行所得到的中间代码。
相关网站:
龙书(当当上去买一本)
http://dinosaur.compilertools.net/flex/index.html(flex手册)
http://dinosaur.compilertools.net/bison/index.html(bison手册)
http://www.llvm.org(LLVM官网)
⑶ 第一个 C 语言编译器是怎样编写的
第一个C语言编译器
是先制定了简单的C语法后,用B语言写的
这个是C语言的前身。
当时B语言已经比较成熟 只不过 没有C强大
于是 发明了C语言
之所以叫C,其实也是因为在B基础上加一。
后续的C编译器 就都是用C写的了。
⑷ c语言编译器是用什么于语言写的
第一个C语言编译器应该是用汇编写的,但是第一个成熟的C语言编译器应该是由汇编和C语言共同写的。
编译原理讲到了“自举编译器”。大意就是先用底层语言(应该是汇编)写一个能运行,但效率极低的C语言编译器(底层语言不好优化),有了C语言的编译器以后,就可以用C语言好好写一个编译器了,用之前那个运行没问题,但效率低得编译器编译一下,就得到了可以使用的编译器了。
⑸ c编译器是如何编译程序的
每种平台都有自己的C编译器的,例如linux下有 gcc ,windows下有ms vs 系列。c的源程序经过这些编译器,再与各自平台的连接器就可以生成该平台下对应的二进制执行代码了。
但由于C语言很多时候会涉及很多硬件级调用的,这个对平台依赖性极大。所以移植性这种东西,我只能说,哈哈!
⑹ c编译程序是什么
c编译程序是将c语言程序编译成目标代码程序的程序,即正确答案应该选择D。
1、c语言是目前世界上最流行、使用最广泛的面向过程的高级程序设计语言。 c语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用c语言明显优于其它高级语言,许多大型应用软件都是用c语言编写的。
2、编译就是利用编译程序从源语言编写的源程序产生目标程序的过程,其中的五个阶段分别是词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
(6)c的编译器是怎么做的扩展阅读
c编译程序的语言特点
对于c编译程序来说,其语言的特点如下:
1、c语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护,而且表现能力和处理能力极强。
2、c语言具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。
3、由于c语言实现了对硬件的编程操作,因此集高级语言和低级语言的功能于一体。它既可用于系统软件的开发,也适合于应用软件的开发。
4、此外,c语言还具有效率高、可移植性强等特点。因此它广泛地移植到了各类各型计算机上,从而形成了多种版本。
⑺ C语言编译器是用来做什么的
编译器,是将便于人编写,阅读,维护的高阶计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。
一个现代编译器的主要工作流程如下:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 连接器 (Linker) → 可执行程序 (executables)
⑻ 第一个C语言编译器是怎样编写的
任何一个功能
任何一个语言 都能实现
所以 关键的不在于语言 而在于 算法
C语言被人设计出来
设计了它的语法和规则
然后 根据这个规则,用B语言(Ken Thompson发明的B语言,而 B语言则源自BCPL语言。) 加汇编 编写了第一个C的编译器
没用多久
因为C语言更好用
于是 后续的C语言编译器 都是C语言自己写的了。