编译器的链接原理
A. c++ 编译器 链接器 如何运行 原理是什么
#include "fun.cpp"
这一句使得在编译的时候fun.cpp全文将被复制到主程序文件中,在主文件里面当然能使用了,这不是文件作用域的问题。
至于前一个问题,你没给出程序的全文,我也看不出来。
另外:对楼主的回复:
你对fun.cpp也使用include的话,则fun.cpp中的内容肯定也是要复制过去的,只要你用include。(include这个保留字的含义就是告诉编译器除了读包含include这个语句的文件之外还要读取include语句包含的文件).一般来说,我们在include后面包含的都是xxxx.h这样的头文件,这是因为在头文件里面包含的都是声明而不是定义,在一个工程中声明可以重复多次但是定义(不管它在哪个文件里面定义)只能一次。像楼主这样包含fun.cpp的话肯定会导致重复定义的(fun.h和fun.cpp编译之后形成的fun.obj里面有函数的实现,main.cpp由于把fun.cpp里面的内容include进来所以里面也有函数的实现).至于加了static后为什么对这是因为static保留字限制了其后所定义的函数或变量只能在本文件中使用.
建议楼主把主程序文件中的#include"fun.cpp"改成#include"fun.h"再试试,另外,找本书看看include和static(主要是静态全局变量而不是静态局部变量)相关的内容。
对楼主的再次答复:.h和.cpp中包含的东西是不一样的。一般来说,.h中放置声明语句(主要是供编译器进行类型及函数原型检查),而.cpp中放置数据的定义以及函数的实现等。而#include语句只包含.h文件。这一点我不知道是不是c语言的规定,但是一般来说编程都是这样做的。
如果不怕困难,建议你去看一本书,linker and loader 中文版+英文版,网址是:http://download.csdn.net/source/331053
B. C语言中编译程序和连接程序的作用和原理是什么关键是原理,越详细越好,谢了~
详细了你也不一定能理解,你对底层的了解程度如何?
简单的来说编译就是生成语言无关的obj文件,连接就是将所有的obj文件连接起来,查找里面的符号按照COFF文件的标准生成dll或EXE。
C. linux下c语言编译器的工作原理是怎么样的/
c语言编译器的工作原理都差不多的。一般来说分为四个阶断;
1、预处理阶断,主要是文本替换操作。有预处理器完成。
2、编译阶断,将C源码生成汇编代码,这个是有C语言编译器来完成的,默认linux下是cc。
3、汇编阶断,将汇编代码,生成相应的可执行体,即二进制文件。
这个过程都可以自己通过给gcc加入参数来详细的获取这些过程的,具体可以参考:http://jingyan..com/article/03b2f78c1d6ede5ea237aed7.html
D. 汇编编译器工作原理
首先这个一一对应的关系是确定的
其次汇编编译就是简单对应和少量计算,就是查一个特别大的表而已
具体可以了解一下编译原理(这是个大坑,慎入)
E. 汇编的编译器的原理
建议直接从C51学汇编,来的直观
F. 编译器有哪几部分构成.编译原理
1. 词法分析
词法分析器根据词法规则识别出源程序
中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器
的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。
2. 语法分析
语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。
3. 语义分析
语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。
4. 中间代码生成
中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。
G. 交叉编译器的原理
编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
H. 编译器的工作原理
编译 是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
所以我们电脑上的文件都是经过编译后的文件。
I. 编译器的工作原理实际上就是自动机吗
不是。一个完整的编译器包含词法分析、语法分析、语义分析、中间代码生成、目标代码翻译和性能优化等诸多步骤。你说的有限自动机是仅用于词法分析的词法识别器。
J. 编译器构造原理
编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。
编译器将源程序作为输入,翻译产生使用目标语言的等价程序。源程序一般为高级语言,如C++等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。
一个现代编译器的主要工作流程如下:
源代码→预处理器→编译器→汇编程序→目标代码→连接器→可执行程序