什么是编译器,链接器,加载器?

我想深入了解编译器,链接器和加载器的意义和工作。 参考任何语言,最好是c ++。     
已邀请:
=====> COMPILATION PROCESS <======

                     |
                     |---->  Input is Source file(.c)
                     |
                     V
            +=================+
            |                 |
            | C Preprocessor  |
            |                 |
            +=================+
                     |
                     | ---> Pure C file ( comd:cc -E <file.name> )
                     |
                     V
            +=================+
            |                 |
            | Lexical Analyzer|
            |                 |
            +-----------------+
            |                 |
            | Syntax Analyzer |
            |                 |
            +-----------------+
            |                 |
            | Semantic Analyze|
            |                 |
            +-----------------+
            |                 |
            | Pre Optimization|
            |                 |
            +-----------------+
            |                 |
            | Code generation |
            |                 |
            +-----------------+
            |                 |
            | Post Optimize   |
            |                 |
            +=================+
                     |
                     |--->  Assembly code (comd: cc -S <file.name> )
                     |
                     V
            +=================+
            |                 |
            |   Assembler     |
            |                 |
            +=================+
                     |
                     |--->  Object file (.obj) (comd: cc -c <file.name>)
                     |
                     V
            +=================+
            |     Linker      |
            |      and        |
            |     loader      |
            +=================+
                     |
                     |--->  Executable (.Exe/a.out) (com:cc <file.name> ) 
                     |
                     V
            Executable file(a.out)
C预处理器: - C预处理是编译的第一步。它处理:
#define
陈述。
#include
陈述。 有条件的陈述。 宏 该单元的目的是将C源文件转换为Pure C代码文件。 C编译: 该单元有六个步骤: 1)词法分析器: 它结合了源文件中的字符,形成“TOKEN”。一个 token是一组没有'space','tab'和'new line'的字符。 因此,这个编译单元也称为“TOKENIZER”。它也删除了 注释,生成符号表和重定位表条目。 2)句法分析器: 此单元检查代码中的语法。例如:
{
    int a;
    int b;
    int c;
    int d;

    d = a + b - c *   ;
}
上面的代码将生成解析错误,因为方程式不是 均衡。本单元通过生成解析器树来内部检查 如下:
                            =
                          /   
                        d       -
                              /     
                            +           *
                          /          /   
                        a       b   c       ?
因此该单元也称为PARSER。 3)语义分析器: 本单元检查语句中的含义。例如:
{
    int i;
    int *p;

    p = i;
    -----
    -----
    -----
}
上面的代码生成错误“不兼容类型的分配”。 4)预优化: 该单元独立于CPU,即有两种类型的优化 预优化(独立于CPU) 后优化(取决于CPU) 此单元以下列形式优化代码: I)消除死代码 II)子代码消除 III)循环优化 I)死代码消除: 例如:
{
    int a = 10;
    if ( a > 5 ) {
        /*
        ...
        */
    } else {
       /*
       ...
       */
    }
}
这里,编译器在编译时知道'a'的值,因此它也是 知道if条件总是正确的。因此它消除了其他 代码中的一部分。 II)子代码消除: 例如:
{
    int a, b, c;
    int x, y;

    /*
    ...
    */

    x = a + b;
    y = a + b + c;

    /*
    ...
    */
}
可以如下优化:
{
    int a, b, c;
    int x, y;

    /*
     ...
    */

    x = a + b;
    y = x + c;      // a + b is replaced by x

    /*
     ...
    */
}
III)循环优化: 例如:
{
    int a;
    for (i = 0; i < 1000; i++ ) {

    /*
     ...
    */

    a = 10;

    /*
     ...
    */
    }
}
在上面的代码中,如果'a'是本地的而不是在循环中使用,那么它可以是 优化如下:
{
    int a;
    a = 10;
    for (i = 0; i < 1000; i++ ) {
        /*
        ...
        */
    }
}
5)代码生成: 在这里,编译器生成汇编代码以便更多 经常使用的变量存储在寄存器中。 6)后优化: 这里的优化与CPU有关。假设有多个 在代码中跳转然后将它们转换为一个:
            -----
        jmp:<addr1>
<addr1> jmp:<addr2>
            -----
            -----
控件直接跳转到。 然后最后一个阶段是链接(创建可执行文件或库)。 运行可执行文件时,它需要的库是Loaded。     
编译器读取,分析代码并将其转换为目标文件或错误消息列表。 链接器将一个或多个目标文件和可能的一些库代码组合成一些可执行文件,一些库或错误消息列表。 加载程序将可执行代码读入内存,执行某些地址转换并尝试运行程序,从而导致运行程序或错误消息(或两者)。 ASCII表示:
[Source Code] ---> Compiler ---> [Object code] --*
                                                 |
[Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader 
                                                 |                                    |
[Source Code] ---> Compiler ---> [Object code] --*                                    |
                                                 |                                    |
                                 [Library file]--*                                    V
                                                                       [Running Executable in Memory]
    
希望这能帮到你一点点。 首先,看看这个图:
                         (img source->internet)
然后,您创建一段代码并保存文件(源代码) 预处理: - 顾名思义,它不是编译的一部分。它们指示编译器在实际编译之前进行必要的预处理。您可以调用此阶段文本替换或解释由#表示的特殊预处理程序指令。 编译: - 编译是一种用一种语言编写的程序被翻译成另一种目标语言的过程。如果存在一些错误,编译器将检测它们并报告它。 汇编: - 汇编代码转换为机器代码。您可以将汇编程序称为特殊类型的编译器。 链接: - 如果这些代码需要链接其他一些源文件,链接器会链接它们以使其成为可执行文件。 之后会发生很多过程。是的,你猜对了装载机的作用: Loader: - 将可执行代码加载到内存中;创建程序和数据堆栈,初始化寄存器。 小额外信息: - http://www.geeksforgeeks.org/memory-layout-of-c-program/,你可以在那里看到内存布局。     
编译器:这是一个将高级语言程序翻译成机器语言程序的程序。编译器比汇编器更智能。它检查各种限制,范围,错误等。但它的程序运行时间更长,并占据更大的内存部分。它的速度很慢。因为编译器遍历整个程序,然后将整个程序转换为机器代码。如果编译器在计算机上运行并为同一台计算机生成机器代码,那么它就被称为自编译器或驻留编译器。另一方面,如果编译器在计算机上运行并为其他计算机生成机器代码,那么它被称为交叉编译器。 链接器:在高级语言中,存储了一些内置的头文件或库。这些库是预定义的,它们包含对执行程序至关重要的基本功能。这些函数通过名为Linker的程序链接到库。如果链接器找不到函数库,则它会通知编译器,然后编译器会生成错误。编译器会自动调用链接器作为编译程序的最后一步。 它不是内置的库,它还将用户定义的函数链接到用户定义的库。通常,较长的程序被分成称为模块的较小子程序。并且必须组合这些模块来执行程序。组合模块的过程由链接器完成。 Loader:Loader是一个程序,它将程序的机器代码加载到系统内存中。在计算中,加载器是负责加载程序的操作系统的一部分。这是启动计划过程中的重要阶段之一。因为它将程序放入内存并准备执行。加载程序涉及将可执行文件的内容读入内存。加载完成后,操作系统通过将控制权传递给加载的程序代码来启动程序。支持程序加载的所有操作系统都有加载器。在许多操作系统中,加载器永久驻留在存储器中。     
维基百科应该有一个很好的答案,这是我的想法: 编译器:读取something.c source,写something.o对象。 链接器:将几个* .o文件连接到可执行程序中。 Loader:将可执行文件加载到内存并启动它运行的代码。     
编译: 它将读取源文件,该文件可能是.c或.cpp等类型,并将其转换为.o文件,称为目标文件。 链接: 它将可能为多个源文件生成的几个.o文件组合成可执行文件(GCC中的ELF格式)。有两种类型的链接: 静态链接 动态链接 装载机: 将可执行文件加载到计算机主存储器的程序。 有关Linux中程序执行的这三个阶段的详细研究,请阅读此内容。     
* 关于基于linux / unix的系统进行了解释,尽管它是所有其他计算系统的基本概念。 * LinuxJournal的链接器和加载器清晰地解释了这个概念。它还解释了经典名称a.out是如何产生的。 (汇编输出) 快速摘要,
c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)
我们得到了可执行文件,现在将此文件提供给您的朋友或需要此软件的客户:) 当他们运行这个软件时,可以在命令行输入./a.out
execute in command line ./a.out  --> [Loader] --> [execve] --> program is loaded in memory
程序加载到存储器后,通过使PC(程序计数器)指向
a.out
的第一条指令,控制转移到该程序。     
操作系统:操作系统(OS)是管理计算机硬件和软件资源并为计算机程序提供公共服务的系统软件。操作系统是计算机系统中系统软件的组件。应用程序通常需要操作系统才能运行。 编译器:编译器是一个计算机程序(或一组程序),该变换用编程语言源代码(源语言)到另一个计算机语言(目标语言),后者通常具有被称为对象的二进制形式码。 解释器:解释器是一种计算机程序,它直接执行,即执行用编程或脚本语言编写的指令,而不事先将它们编译成机器语言程序。 汇编程序:汇编程序是一个程序,它接收基本的计算机指令并将它们转换为计算机处理器可用于执行其基本操作的位模式。 Loader:加载器是操作系统的一部分,负责加载程序和库。它是启动程序过程中的关键阶段之一,因为它将程序放入内存并为执行做好准备。 链接器:链接器是一个将对象模块组合在一起形成可执行程序的程序。 Preproccesor:Preproccesor是一个文本替换工具,它指示编译器在实际编译之前进行必要的预处理。     
编译器更改检查源代码中的错误并将其更改为目标代码。这是操作系统运行的代码。 您通常不会在单个文件中编写整个程序,因此链接器会链接所有目标代码文件。 你的程序不会被执行,除非它在主存中     
编译器:将人类可理解的格式转换为机器可理解的格式 链接器:将机器可理解的格式转换为操作系统可理解的格式 Loader:实际上是将程序加载并运行到RAM中的实体 链接器和口译员是互相排斥的 解释器逐行获取代码并逐行执行。     
编译器是将程序源代码文件编译成可执行程序的软件程序。它作为集成开发环境IDE的一部分包含在大多数编程软件包中。 编译器获取以高级语言(如C,BASIC或Java)编写的源代码文件,并将代码编译为低级语言,如机器代码或汇编代码。此代码是为特定处理器类型创建的,例如Intel Pentium或PowerPC。然后,程序可以被处理器识别并从操作系统运行。 Loader是一个操作系统实用程序,它将程序从存储设备复制到主存储器,在那里可以执行它们。除了将程序复制到主存储器之外,加载器还可以用物理地址替换虚拟地址。 大多数加载器都是透明的,即您无法直接执行它们,但操作系统会在必要时使用它们。 链接器是一个调整两个或多个机器语言程序段的程序,以便它们可以作为一个单元同时加载和执行 链接器也称为链接编辑器和绑定器,它是一个将对象模块组合在一起形成可执行程序的程序。许多编程语言允许您分别编写不同的代码片段,称为模块。这简化了编程任务,因为您可以将大型程序分解为更小,更易于管理的部分。但最终,您需要将所有模块放在一起。这是链接器的工作。     
编译器:转换完整语言的语言翻译器 程序转换成机器语言来生成 计算机可以在其中处理的程序 整体。 链接器:实用程序,它接受一个或多个编译的目标文件,并将它们组合成可执行文件或另一个目标文件。 Loader:将可执行代码加载到内存中 ,创建程序和数据堆栈 ,初始化寄存器 并启动代码运行。     
编译器是一个特殊的程序,它处理用特定编程语言编写的语句,并将它们转换为计算机处理器使用的机器语言或“代码”。     
编译器将编程语言中的代码行转换为机器语言。 链接器在两个程序之间创建链接。 Loader将程序加载到主数据库,程序等的内存中。     
编译器:它是一个纠正程序,目标文件,消息等错误的系统软件 链接器:它是一个系统软件,它将一个或多个对象文件和可能的一些库代码组合成一些易于理解的某些库或错误列表 加载程序:将可执行文件加载到计算机主存储器的程序     

要回复问题请先登录注册