导航:首页 > 源码编译 > 编译器中的连接器

编译器中的连接器

发布时间:2022-04-24 17:57:44

1. 编译器是什么

一个现代编译器的主要工作流程如下:源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(objectcode)→连接器(Linker)→可执行程序(executables)编译语言与解释语言对比:许多人将高级程序语言分为两类:编译型语言和解释型语言。然而,实际上,这些语言中的大多数既可用编译型实现也可用解释型实现,分类实际上反映的是那种语言常见的实现方式。(但是,某些解释型语言,很难用编译型实现。比如那些允许在线代码更改的解释型语言。)编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。把一个程序写好,这时利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。

2. 什么是编译器

编译器

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

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

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

* 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

工作原理

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

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

编译器种类

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

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

编译器分析(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),如何合并几句代码成一句等等。

3. 易语言连接器是什么啊

所谓的静态编译不过是调用VC编译器滴.,.连接器就是VC编译器.

4. 源代码到可执行 文件之间的转换用到的 编译器如gcc、汇编器、连接器等是怎么集成到IDE环境中的

在VisualC 2005中,如何调用其它编译器编译cpp文件呢?换句话说,如何把其它编译器集成到VC2005的IDE中呢?

象ICC这样的编译器安装之后会自动集成进来,要集成其他编译器那还得自己动手。下面介绍一种简单、浅层的“集成”方法。

你也许注意到了,在VC2005的IDE中是不能编译单个.cpp文件的,除非把它放在工程中。但是,我们可以通过调用外部工具实现编译单文件。

下面以调用G 为例说明如何编译单个.cpp文件。如果要编译单个.c文件,使用GCC即可,方法同理。

也许你现在还不知道G 。G 是GCC中的一员。GCC的含义是GNU编译器集合(GNUCompilerCollection),包括C、C 、Objective-C、Fortran、Java、Ada连同与这些语言相配的库等。GCC被誉为“世界上最重要的软件”。许多免费的编译器都是GCC的移植版—MinGW(MinimalistGNUforWindows)中携带的编译器就是如此。

以MinGW为例,我们可以下载DevC ,DevC 目前最新版为4.9.9.2。安装DevC 的同时就安装了MinGW,其中包含了G 3.4.2.

假设DevC 安装在D:\Dev-Cpp目录下。

下面我们在VC2005的菜单点击“工具(Tools)->外部工具(ExternalTools)->添加(Add)”。

分别填入:

标题(Title):GNUC Compiler

命令(Command):D:\Dev-Cpp\bin\g .exe

参数(Arguments):-Wall-o$(ItemFileName)$(ItemFileName)$(ItemExt)-time

初始目录(Initialdirectory):$(ItemDir)

再钩选下面的"使用输出窗口(UseOutputwindow)".

说明:如果你已经把D:\Dev-Cpp\bin\目录添加到系统环境变量中,那么Command指定为g .exe即可。Cygwin同理。

这些参数只是一个参考。你可以查阅VC编译器的宏设置你需要的参数。

干脆顺带补充一下DigitalMarsC 编译器的参考参数设置:

标题(Title):DigitalMars

命令(Command):C:\dm\bin\dmc.exe

参数(Arguments):$(ItemFileName)$(ItemFileName)$(ItemExt)

初始目录(Initialdirectory):$(ItemDir)

好,下面切换到main函数所在文件,点击工具(Tools)菜单下的“GNUC Compiler”开始编译。

注意g 此时编译的指是纯C 程序,对于包含int_tmain(intargc,_TCHAR*argv[])这类VC特有的C 程序自然是无法通过编译的。

如果编译没有出错,对于早期版本的g 而言,Outputwindow是没有任何输出的。

而对于较新版本的g ,将输出类似以下的信息:

#cc1plus0.670.22
#as0.050.01
#collect20.360.19

这是-time报告的编译过程中每个子过程所占用的CPU时间。

当然,你还可以更改编译参数,使输出窗口输出其他编译信息。

我们还可以通过添加外部工具来实现运行g 生成的程序的功能。步骤如下:

在VC2005的菜单点击“工具(Tools)->外部工具(ExternalTools)->添加(Add)”。

分别填入:

标题(Title):RunasC Application

命令(Command):%systemroot%\system32\cmd.exe

参数(Arguments):/c$(ItemFileName).exe

初始目录(Initialdirectory):$(ItemDir)

不要钩选下面的“使用输出窗口”和“退出时关闭”。

注意:cpp文件必须放在工程中,g 生成的程序才能被运行!

用MinGW的g 编译出的程序可以在没有安装MinGW的Windows系统上运行!

但是在Cygwin/gcc下编译出来的程序,在windows执行必须依赖cygwin1.dll。

通过VC2005创建不带预编译头的Win32控制台应用程序空环境,这样编译出来的可执行文件也不是放在哪台机子都能跑的。但是常规空环境可以做到。

下面讲讲如何设置快捷键。

点击菜单中的"工具->自定义",

点击右下角的"键盘",

点击"按快捷键"下面的文本框,

按下Shift Ctrl F7,如果这个快捷键已经分配给了其他的命令,更换一个即可。

5. 在VS2010的VC++中如何编译、链接、运行、调试程序

在vc2010中看不到像VC6.0显式的编译、连接按钮了。只有工具栏(启动调试)和菜单栏(测试)

这些功能包含编译、链接、运行(调试)所有步骤,都一键完成。

实际上这些功能是编译器使用以下工具实现的:

编译器CL.EXE,将.c/.cpp源代码编译成目标代码.obj,

连接器LINK.EXE,将目标代码和库连接生成最终文件;

资源编译器RC.EXE(.rc)将资源编译,最终通过连接器存入最终文件.

注意编译准备:VCVARS32.bat拷贝到当前的workspace下在cmd下执行之后就可以

直接使用这些编译工具在cmd下编译.

-----------------------------------------------------------

例子:记事本编辑hello.c,在按照上面要求拷贝到当前目录下,打开cmd

CL.EXE /c hello.c只编译不连接

LINK.EXE hello.obj 用到的库文件,生成可执行文件.如:

LINK.EXE hello.obj user32.lib

RC.EXE Hello.rc

-----------------------------------------

CL.EXE,LINK.EXE,vcvars32.bat所在目录:假定VS2010使用默认安装路径

C:Program FilesMicrosoft Visual Studio 10.0VCin

rc.exe所在路径:

C:Program FilesMicrosoft SDKsWindowsv7.1ABin

注意:

(1)这些EXE文件在vs2010下可能存在多个不同路径,但都是一样的,可以通用

(2)如果电脑上安装了不同的VS版本,这些文件会不同,注意区分。使用同一VS版本下的文件。

6. VC6.0的编译器、连接器在命令提示符中如何使用

你是想在命令行下编程吧?
这个第一,可以去看看win32汇编,罗云斌的书
第二,你该看看什么事nmake工具。
第三,我不知道你为什么要在命令行下编译呢?要是这样的话你还不如去使用TC呢

回答完毕

7. Visual Unit 设定编译器和连接器

预先安装好VC,比如我安装的是Microsoft visual studio 2005.

再来,Visual Unit 4.0 安装,完成后,重新打开进入演示版。
在窗口的主界面,点击菜单栏“工程”-》“打开示例工程”,选择一个自己想打开的项目。
点击菜单栏“工具”-》“设定”。里面便有“编译器”和“编辑器”。

点击“编译器”,“名称”项,选择你安装VC对应的Visual C++ 版本,比如"Visual C++ 2005". 编译器和链接器,同样道理,选择之前你安装VC的根目录下,对应的编译器和链接器。比如:
“D:\Program files\Microsoft Visual Studio 2005\VC\bin\cl.exe”
“D:\Program files\Microsoft Visual Studio 2005\VC\bin\link.exe”。
这样便可以了。

如果项目执行测试,还是有类似编译器或者链接器的问题,请继续看以下注意事项,检查下工程属性是否一致:

待工程打开加载后,再次点击菜单栏“工程”-》“工程属性”,
在“常规”界面,选择你需要的测试代码编译器,比如我装的VC2005,那么我就选择Visual C++ 2005.

点击第五个tab "链接"。点击“环境变量”。在变量名下拉列表中,点击您安装VC的版本对应的dir,比如“vc2005_dir”. 在下面的“值”一栏,点击“浏览”找到VC对应的根目录。比如“D:/Program files/Microsoft Visual Studio 2005”。“OK”确认。再点击当前小窗口的“保存”。关闭小窗口。
退回到“工程属性”窗口,检查“库文件搜索目录”,是否是自己设定的vc2005_dir为头的目录,比如:“$(vc2005_dir)/vc/lib”.

其它地方比如“头文件”里的目录设置,亦是如此。不过只要你设置了一处的环境变量,其它地方也就会自动调用你设置的路径下的编译器了。

希望对你有帮助。:)

8. ccs中c编译器生成的段有哪些

out文件与ojp文件。
依次点击project--new,在新建一个工程的时候,在弹出的对话框里有一个选项是选择编译输出文件,有out文件和lib文件可选,选择lib,则工程编译通过后是生成库文件。
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码(sourcecode)→预处理(preprocessor)→编译器(compiler)→目标代码(objectcode)→连接器(Linker)→可执行程序(executables)。

9. 编译器由什么组成

编译器:翻译工具,把高级语言源程序翻译为汇编语言源程序,再把汇编源序翻译成目标代码供连接程序使用。
语言:一个规则。例如:C语言,它规定程序入口为main(),和其它规定。并把这些 <规定的集合> 命名为C语言。
TC:一个开发工具,它包括文本编辑器,编译器,连接程序,调试环境等等。TC中的编译器是TCC.EXE文件。

关于汇编:
汇编语言是一个规则,
汇编程序是一个翻译工具
汇编源程序是一个 符合(汇编语言)规则的程序代码
汇编是一个过程,这个过程是汇编程序 把汇编源程序 翻译 为目标代码的过程
对于高级语言:翻译的过程叫做编译,翻译工具叫做编译程序或编译器。

阅读全文

与编译器中的连接器相关的资料

热点内容
php前补零 浏览:731
算法推荐广告伦理问题 浏览:921
亚马逊云服务器的选择 浏览:810
单片机频率发生器 浏览:732
备份与加密 浏览:623
用什么app可以看论坛 浏览:52
javajdbcmysql连接 浏览:473
制作linux交叉编译工具链 浏览:751
编程负数除以正数 浏览:512
app和aso有什么区别 浏览:326
手机vmap是什么文件夹 浏览:36
塔科夫锁服如何选择服务器 浏览:290
消费者生产者问题java 浏览:61
程序员筱柒顾默结婚的时候 浏览:578
安卓截长屏怎么弄 浏览:475
优信办理解压手续怎么那么慢 浏览:605
私有云服务器一体机安全吗 浏览:430
python的tk界面禁用鼠标 浏览:186
怎么看服务器mac地址 浏览:291
安卓如何将图镜像翻转 浏览:325