汇编器编译器链接器
⑴ C语言源程序文件、目标文件和可执行文件的扩展名是什么
C语言源程序文件扩展名:.c
目标文件扩展名:.obj
可执行文件扩展名:.exe
源程序:程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。C语言源程序的扩展名为“.c”。源程序不能直接在计算机上执行,需要用“编译程序”将源程序编译为二进制形式的代码。
目标程序:源程序经过“编译程序”编译所得到的二进制代码称为目标程序。目标程序
的扩展名为“.obj”。
目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行程序。
可执行程序:目标程序与库函数连接,形成的完整的可在操作系统下独立执行的程序
称为可执行程序。可执行程序的扩展名为“.exe“。
(1)汇编器编译器链接器扩展阅读:
C语言创建程序的步骤:
编辑:就是创建和修改C程序的源代码-我们编写的程序称为源代码。
编译:就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件。扩展名为.o或者.obj。(该部分编译是指汇编器编译汇编语言或者编译器编译高级语言)
链接:链接器将源代码由编译器产生的各种模块组合起来,再从C语言提供的程序库中添加必要的代码模块,将它们组成一个可执行的文件。在windows下扩展名为.exe,Unix下无扩展名。
执行:运行程序。
IT专家网——C语言编程程序编译全过程剖析
⑵ 汇编编译器的工作和生成可执行文件的执行过程是怎样的
汇编器,先生成目标代码,其中有一些数据,代码,还有一些表(重定位表等)
然后调用链接器,链接成可执行文件。
早期的汇编器,只负责生成目标代码,链接器是一个独立的程序。
需要手工分别作汇编,和链接
现在的汇编器,可以合并这两步,直接调用链接器,是直接生成可执行文件。
伪指令是汇编命令,是用来操作汇编器的命令。
不是指令,不生成对应的代码。
CPU只能识别二进制代码,数据通过加载器的加载,或者烧写器的烧写,初始化,有些代码,会在加载时重新定位。
代码也可能是烧写的,比如BIOS代码。
对于PC:
操作系统的启动代码,是由BIOS中的专门代码;
从磁盘的固定位置,加载在内存的固定位置的。
操作系统的其他部分,是由操作系统的启动代码加载的。
⑶ 编译器跟编辑器有什么区别。还有什么是链接器
链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。
是软体程序,一般是指用来修改电脑档案的编写软件,但也有人称 PE2、HE4(汉书)……等文书软件为编辑器。常见的编辑器有文本编辑器、网页编辑器、源程序编辑器、图像编辑器,声音编辑器,视频编辑器等。
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
⑷ 汇编器和编译器有什么区别
汇编器(Assembler)是将汇编语言翻译为机器语言的程序。一般而言,汇编生成的是目标代码,需要经链接器(Linker)生成可执行代码才可以执行。
汇编语言是一种以处理器指令系统为基础的低级语言,采用助记符表达指令操作码,采用标识符表示指令操作数。作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。常用的高级语言编译器有Microsoft公司的MASM系列和Borland公司的TASM系列编译器,还有一些小公司推出的或者免费的汇编软件包等。
编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)
⑸ stm32中是谁在区分C程序和汇编程序
在STM32中,区分C程序和汇编程序的过程实际上是由编译器和链接器完成的。
编译器将C程序源代码转换为汇编代码,然后再将汇编代码转换为机器码。编译器会根据源代码中的语法和语义信息,生成相应的汇编和机陆配喊器指令。而对于汇编程序,编译器将直接将汇编代码转换为机器码。
链接器负责将编译器生成的目标文件以及其他需要的目标文件合并为可执行文件。在这个过程中,链接器会将不同目标文件中的符号(函数、变量等)进行链接,并生成相应的重定位信息。在链接的过程中,链接器会检查函数的调用关系,如果函数被定义为使用了栈或堆等C语言运行环境,则链接器会将相关的运行环境添加到可早野执行文件中。
因此,在执行某个函数时,处理器并不知道这个函数是来自C程序还是汇编程序,但是在链接器的处理过程中,链接器会根据函数的定义和调用关系,确定函数需要使用哪些运行环境,将这些运行环境添加到可执行文件中,使得函数能够正确地执行。
总之,在STM32中,C程序和汇编程序最终都会被编译器和链接器转换为机卖乎器码,处理器只认识机器码,因此区分C程序和汇编程序的过程实际上是由编译器和链接器完成的
⑹ 电脑编程的基础知识——编译器和连接器
我从没见过(不过应该有)任何一本C++教材有讲过何谓编译器(Compiler)及连接器(Linker)(倒是在很老的C教材中见过),现在都通过一个类似VC这样的编程环境隐藏了大量东西,将这些封装起来。在此,对它们的理解是非常重要的,本系列后面将大量运用到这两个词汇,其决定了能否理解如声明、定义、外部变量、头文件等非常重要的关键。
前面已经说明了电脑编程就是一个“翻译”过程,要把用户的程序翻译成CPU指令,其实也就是机器代码。所谓的机器代码就是用CPU指令书写的程序,被称作低级语言。而程序员的工作就是编写出机器代码。由于机器代码完全是一些数字组成(CPU感知的一切都是数字,即使是指令,也只是1代表加法、2代表减法这一类的数字和工作的映射),人要记住1是代表加法、2是代表减法将比较困难,并且还要记住第3块内存中放的是圆周率,而第4块内存中放的是有效位数。所以发明了汇编语言,用一些符号表示加法而不再用1了,如用ADD表示加法等。
由于使用了汇编语言,人更容易记住了,但是电脑无法理解(其只知道1是加颂隐法,不知道ADD是加法,因为电脑只能看见数字),所以必须有个东西将汇编代码翻译成机器代码,也就是所谓的编译器。即编译器是将一种语言翻译成另一种语言的程序。即使使用了汇编语言,但由于其几乎只是将CPU指令中的数字映射成符号以帮助记忆而已,还是使用的空迹电脑的思考方式进行思考的,不够接近人类的思考习惯,故而出现了纷繁复杂的各种电脑编程语言,如:PASCAL、BASIC、C等,其被称作高级语言,因为比较接近人的思考模式(尤其C++的类的概念的推出),而汇编语言则被称作低级语言(C曾被称作高级的低级语言),因为它们不是很符合人类的思考模式,人类书野亏厅写起来比较困难。由于CPU同样不认识这些PASCAL、BASIC等语言定义的符号,所以也同样必须有一个编译器把这些语言编写的代码转成机器代码。对于这里将要讲到的C++语言,则是C++语言编译器(以后的编译器均指C++语言编译器)。
因此,这里所谓的编译器就是将我们书写的C++源代码转换成机器代码。由于编译器执行一个转换过程,所以其可以对我们编写的代码进行一些优化,也就是说其相当于是一个CPU指令程序员,将我们提供的程序翻译成机器代码,不过它的工作要简单一些了,因为从人类的思考方式转成电脑的思考方式这一过程已经由程序员完成了,而编译器只是进行翻译罢了(最多进行一些优化)。
还有一种编译器被称作翻译器(Translator),其和编译器的区别就是其是动态的而编译器是静态的。如前面的BASIC的编译器在早期版本就被称为翻译器,因为其是在运行时期即时进行翻译工作的,而不像编译器一次性将所有代码翻成机器代码。对于这里的“动态”、“静态”和“运行时期”等名词,不用刻意去理解它,随着后续文章的阅读就会了解了。
编译器把编译后(即翻译好的)的代码以一定格式(对于VC,就是COFF通用对象文件格式,扩展名为.obj)存放在文件中,然后再由连接器将编译好的机器代码按一定格式在Windows操作系统下就是Portable Executable File Format--PE文件格式)存储在文件中,以便以后操作系统执行程序时能按照那个格式找到应该执行的第一条指令或其他东西,如资源等。至于为什么中间还要加一个连接器以及其它细节,在后续文章中将会进一步说明。