精华内容
下载资源
问答
  • 编译过程的六个阶段

    千次阅读 2021-03-01 11:57:20
    从左到右扫描将一字符读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一单词。 语法分析(syntax analysis):在词法分析的基础上,将单词分解成各类语法词语,并表示成"语法树"。 语法分析特点...
    1. 词法分析(lexical analysis or scanning):自动分词,词性标注
      从左到右扫描将一个一个字符读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一个单词。

    2. 语法分析(syntax analysis):在词法分析的基础上,将单词分解成各类语法词语,并表示成"语法树"。判断由词构成的短语的排列顺序是否符合对应编程语言的语法。
      语法分析特点:
      1.每一种“高级语言”都有自己的语法规则
      2.每一种“高级语言”的编译(解释)程序都将一定将他的语法规则内嵌在其中。

    3. 语义分析(semantic analysis):按照语法树的层次关系和先后顺序,进行类型审查,审查每个算法是否符合语言规范,不符合时应报告错误。(类型审查,作用范围检查)类型分析如,java语言中,public,private,protected的区别
      特点:分为静态语义分析和动态语义分析,并且静态语义分析可以在编译时被实现,而动态的则不可以。

    4. 中间代码生成:在语法和语义分析完成后,将源程序变换成一种“内部表示形式”,该代码是一种简单的记号系统,三元组或者四元组。

    5. 代码优化:对中间代码进行变换,使代码更加高效。

    6. 目标代码生成:将中间代码变换成特定机器上的绝对指令或者可重定位的汇编指令代码。主要与硬件系统和指令含义有关。

    展开全文
  • 编译过程的五个阶段

    2021-10-14 11:29:12
    编译程序的工作,从输入源程序开始到输出目标程序为止的整个过程,是非常...类似地,编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。 第一阶段:词法

    编译程序的工作,从输入源程序开始到输出目标程序为止的整个过程,是非常复杂的。但就其过程而言,它与人们进行自然语言直接的翻译有许多相近之处。当我们把一种文字翻译为另一种文字,例如把一段英文翻译为中文时,通常需经下列步骤:

    (1)识别出句子中的一个个单词;

    (2)分析句子的语法结构;

    (3)根据句子的含义进行初步翻译;

    (4)对译文进行修饰;

    (5)写出最后的译文。

    类似地,编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

    第一阶段:词法分析

    词法分析的任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字(begin、end、if、for、while),标识符、常数、运算符和界符(标点符号、左右括号)。

    单词符号是语言的基本组成成分,是人们理解和编写程序的基本要素。识别和理解这些要素无疑也是翻译的基础。如同将英文翻译成中文的情形一样,如果你对英语单词不理解,那就谈不上进行正确的翻译。在词法分析阶段的工作中所依循的是语言的词法规则(或称构词规则)。描述词法规则的有效工具是正规式和有效自动机。

    第二阶段:语法分析

    语法分析的任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如“短语”、“句子”、“程序段”和“程序”等。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。语法分析所依循的是语言的语法规则。语法规则通常用上下文无关文法描述。词法分析是一种线性分析,而语法分析是一种层次结构分析。例如:

    Z = X + 0.618 * Y;

    代表一个“赋值语句”,而其中的X + 0.618 * Y 代表一个“算术表达式”。因而,语法分析的任务就是识别X + 0.618 * Y为算术表达式,同时,十倍上述整个符号串属于赋值语句这个范畴。

    第三阶段:词义分析与中间代码产生

    这一阶段的任务是:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。这一阶段通常包含两个方面的工作。首先,对每种语法范畴进行语义i安插,例如,变量是否定义、类型是否正确等等。如果语义正确,则进行另一方面工作,即进行中间代码的解释。这一阶段所依循的是语言的语义规则。通常使用属性文法描述语义规则。

    “翻译”仅仅在这里才开始涉及到。所谓“中间代码”是一种含义明确、便于处理的记号系统,它通常独立于具体的硬件。这种记号系统或者与现代计算机的指令形式有某种程度的接近,或者能够比较容易地把它变换成现代计算机的机器指令。例如,许多编译程序采用了一种与“三地址指令”非常近似的“四元式”作为中间代码。这种寺院是的形式是:

    算符左操作数右操作数结果

    它的意义是:对“左右操作数”进行某种运算(由“算符”指明),把运算所得的值作为“结果”保留下来。在采用四元式作为中间代码的情形下,中间代码产生的任务就是按语言的语法规则把各类范畴翻译成四元式序列。例如,下面的赋值语句

    Z = (X + 0.418) * Y / W;

    可被翻译为如下的四元式序列:

    其中,T1和T2是编译期间引进的临时工作变量;第一个四元式意味着把X的值加上0.418存放在T1中;第二个四元式值将T1的值和Y的值相乘存于T2中;第三个四元式指将T2的值除以Y的值留结果于Z中。

    一般而言,中间代码是一种独立于具体硬件的记号系统。常用的中间大妈,除了四元式之外,还有三元式、间接三元式、逆波兰记号和树形表示等等。

    第四阶段:优化

    优化的任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。优化的主要方面有:公关子表达式的提取、循环优化、删除无用代码等等。有时,为了便于“并行运算”,还可以对代码进行并行化处理。优化所依循的原则是程序的等价变换规则。

    第五阶段:目标代码生成

    这一阶段的任务是:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。这阶段实现了最后的翻译,它的工作有赖于硬件系统结构和机器指令含义。这阶段工作非常复杂,设计到硬件系统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以及寄存器和后援寄存器的调度,等等。

    目标代码的形式可以是绝对指令代码或可重定位的指令代码或汇编指令代码。如目标代码是绝对指令代码,则这种目标代码可立即执行。如果目标代码是汇编指令代码,则需汇编器汇编之后才行运行。必须指出,现在多数实用编译程序所产生的目标代码都是一种可重定位的指令代码。这种目标代码在运行前必须借助于一个连接装配程序把各个目标模块(包括系统提供的库函数)连接在一起,确定程序变量(或常数)在主存中的位置,装入内存中指定的起始地址,使之成为一个可以运行的绝对指令代码程序。

    展开全文
  • gcc的编译流程分为步骤,分别为:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项][目标文件]其中,目标文件可缺省,gcc默认生成可...

    gcc的编译流程分为四个步骤,分别为:

    预处理(Pre-Processing)

    编译(Compiling)

    汇编(Assembling)

    链接(Linking)

    gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项]

    [目标文件]

    其中,目标文件可缺省,gcc默认生成可执行的文件名为:编译文件.out

    如:#gcc -o hello hello.c

    该命令将hello.c直接生成最终二进制可执行程序a.out

    这条命令隐含执行了(1)预处理、(2)汇编、(3)编译并(4)链接形成最终的二进制可执行程序。这里未指定输出文件,默认输出为a.out。

    如何要指定最终二进制可执行程序名,那么用-o选项来指定名称。比如需要生成执行程序hello.exe

    那么

    #gcc hello.c -o hello.exe

    下面就具体来查看一下gcc是如何完成四个步骤的:

    (1)预处理阶段

    预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。

    在该阶段,用户可以使用gcc的选项”-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。

    预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。如hello.c中#include

    指令告诉预处理器读系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果就得到另外一个C程序,以.i作为文件扩展名。

    命令:gcc –E hello.c –o

    hello.i

    (2)编译阶段

    在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译

    成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。汇编语言是非常有用的,它为不同高级语言不同编译器提供

    了通用的语言。

    命令:gcc –S hello.i –o hello.s

    (3)汇编阶段

    汇编阶段是把编译阶段生成的”.s”文件转成目标文件,读者在此可使用选项”-c”就可看到汇编代码已转化为”.o”的二进制目标代码了。

    命令:gcc –c hello.s –o hello.o

    (4)链接阶段

    在成功编译之后,就进入了链接阶段。将编译输出文件hello.o链接成最终可执行文件hello.exe

    命令:gcc hello.o –o hello.exe

    运行该可执行文件,出现正确的结果如下。

    命令:./hello

    Hello World!

    一般的,我们不需要一步一步输命令查看整个的编译过程,我们通常一步生成或两步生成。

    命令:

    一步:gcc -o hello hello.c

    两步:gcc -c hello hello.c

    gcc -o hello hello.o

    输出结果: ./hello

    展开全文
  • 程序编译的四个阶段

    2021-01-20 22:00:59
    编译过程可以分为个阶段: 预处理(-E) 预处理就是对源程序中的伪指令(以#开头的指令)和特殊符号进行处理的过程。伪指令包含宏定义指令,条件编译指令和头文件包含指令。gcc对C源文件进行预处理后会输出 .i ...

    编译过程可以分为四个阶段:

    预处理(-E)

    预处理就是对源程序中的伪指令(以#开头的指令)和特殊符号进行处理的过程。伪指令包含宏定义指令,条件编译指令和头文件包含指令。gcc对C源文件进行预处理后会输出 .i 文件。

    主要处理规则如下:

    (1)将所有#define删除,并且展开所有的宏定义。

    (2)处理所有条件编译指令。如#if、#ifdef等

    (3)处理#include预编译指令,将被包含的文件插入该预编译指令的位置。

    (4)删除所有的注释

    (5)添加行号和文件标识,以便于编译时编译器产生调试用的行号信息及编译时产生编译错误或警告时能够显示行号信息

    (6)保留所有的#pragma编译器指令,因为编译器需要使用它们。

    编译(-S)

    编译就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码。使用gcc进行编译时,默认情况下,不输出该文件,生成的汇编文件是 .s 文件

    汇编(-c)

    汇编就是将汇编代码转变为机器可以执行的二进制代码,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

    链接

    在成功汇编之后,就进入链接阶段。链接主要是为了解决多个文件之间符号引用的问题。编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,那么这时在这个文件中该符号的地址是没法确定的,只能等链接器把所有的目标文件链接到一起,才能确定最终的地址,最终生成可执行文件。

    展开全文
  • GCC编译的四个阶段

    2021-01-30 23:30:52
    gcc编译流程分为4步骤,分别为: 预处理(Pre-Processing) 编译(compiling) 汇编(Assembling) 链接(Linking) (1)预处理阶段 在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用gcc...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼the corresponding member of the execution character set (2.14.3, 2.14.5); if there is no correspondingmember, it is converted to an implementation-defined ...
  • 答案:采纳了加我不懂问我一 C编译过程概述目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序.GCC不仅功能非常...
  • MySQL数据库编译过程

    2021-02-10 04:41:32
    编译安装MySQL准备工作卸载rpm方式安装的mysql-server、mysql安装ncurses-devel和cmake包yum -y install ncurses-devel cmaketar xf cmake-2.8.6.tar.gz -C /usr/srccd /usr/src/cmake-2.8.6/./configure &...
  • 软件方面出现了以批处理为主的操作系统、高级语言及其编译程序。 应用领域以科学计算和事务处理为主,并开始进入工业控制领域。特点是体积缩小、能耗降低、可靠性提高、运算速度提高(一般为每秒数十万次,可高达300...
  • Linux中C语言程序编译过程Linux中C语言程序编译过程如下内容参考链接为:https://www.cnblogs.com/wangshaowei/p/11279838.htmlhttps://blog.csdn.net/chun_1959/article/details/43731937在此对作者的付出表示感谢!...
  • 点赞关注,不再迷路,你的支持对我...(联系方式在 GitHub)前言经过前面几篇文章的积累,相信你已经掌握了 静态的 Class 文件的结构,也理解了虚拟机类加载和字节码执行的 动态过程;这篇文章,我们来聊一聊 Java ...
  • C语言编译过程

    2021-05-19 15:49:01
    概述我们写出的C语言代码(.c文件),若要在机器上运行,需要经过一个编译过程,主要分为如下四个阶段(参考1,表1):预处理阶段,即完成宏定义和include 文件展开等工作;生成.i文件。GCC命令为:·gcc -E根据编译参数...
  • Java程序的编译阶段

    2021-03-10 07:49:23
    1、简介:Java语言的...2、编译过程一般而言,其编译过程一般可分为以下3过程:解析与填充符号表过程插入式注解处理器的注解处理过程分析与字节码生成过程Javac的编译过程Javac编译过程的主体代码2.1、解析与...
  • Hive 底层执行架构Hive五组件基本流程Hive SQL 编译成 MapReduce 过程SQL编译成MapReduce具体原理Join的实现原理Group By的实现原理Distinct的实现原理 来源:大数据DT Hive是什么? Hive 是数据仓库工具,再...
  • Linux下C语言程序的编译过程使用gcc编译程序时,编译工程分为4个阶段:(1)预处理:(Pre-Processing)(2)编译:(Compiling)(3)汇编:(Assembling)(4)链接:(linking)预处理、编译、汇编是3不同的阶段,但gcc在实际...
  • java 程序编译和运行过程详解

    千次阅读 2021-02-12 09:48:28
    java整个编译以及运行的过程相当繁琐,这里有简单的例子。Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode);...Java 程序运行过程第一步(编译过程)创建完源文件之后,...
  • 描述Java编译原理Java 虚拟机(JVM)是可运行Java 代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。...这一编译过程同C/C++ 的编译有些不同...
  • Javac编译过程

    2021-03-02 11:13:47
    单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符都可以成为编辑,如“int a+b=2”这句代码中包含了6标记,分别是int、a、=、b、+、2,虽然关键字int由三字符...
  • 这篇文章,我们来聊一聊 Java 的编译过程,你将看到从源码到字节码再到本地代码的整个过程。请点赞,你的点赞和关注真的对我非常重要!目录1. 经典程序编译原理将源代码翻译为目标代码的过程,称为编译过程,经典的...
  • GCC编译过程

    2021-07-20 10:23:44
    GCC编译过程分按照顺序分为以下四步骤 1、预处理(Pre-Processing) 使用的工具是编译器 2、编译(Compiling) 使用的工具是编译器 3、汇编(Assembling) 使用的工具是汇编器 4、链接(Linking) 使用的工具是...
  • 编译阶段编译阶段分为 词法分析、 语法分析、 预编译个阶段。 1. 词法分析 将 字符流 转换为 词法单元流(token),就像英文句子一个个单词独立翻译,举例: var result = testNum1 - testNum2; 词法分析后的结果为...
  • c语言程序的编译过程

    2021-02-02 02:13:11
    操作系统:ubantu 工具gcc 文件:test.c abner@DESKTOP-M6D2HEN:~/mytest$ cat test.c #include<stdio.h> #define MAXC 3 #define MAXB MAXC + 1 #define MAXA MAXB + 2 ...主要为四个阶段 ...C语言编译过程分成
  • 1.1.1 摘要我们知道计算机不能...1.1.2正文非托管环境的编译过程(C/C++)纯C/C++的程序通常运行在一非托管环境中,类是由头文件(.h)和实现文件(.cpp)组成,每类形成了一单独的编译单元,当我们编译程序时,几...
  • 计算机分为下述四发展阶段第1代:电子管数字机(1946—1958年)硬件方面,逻辑元件采用的是真空电子管,主存储器采用汞延迟线电子管数字计算机、阴极射线示波管静电存储器、磁鼓、磁芯;外存储器采用的是磁带。软件...
  • 图片来自bilibili 传送门 首先我们来看helloworld.cpp文件的内容 ...接下来,通过一条简单的命令即可完成对源代码的编译,生成可执行程序helloworld gcc -o helloworld helloworld.cpp 通过这条命令,编译器gcc就会将
  • Java程序的编译过程

    2021-02-12 10:12:07
    Java的编译期是一模糊的概念,需要具体分析。将 *.java文件转为 *.class的过程称为编译器的前端(前端编译)。例如:JDK的javac编译器。把字节码( *.class文件) 转变为 本地机器码 的过程称为Java虚拟机的即时编译...
  • java整个编译以及运行的过程相当繁琐,我就举一简单的例子说明:编译原理简单过程:词法分析 --> 语法分析 --> 语义分析和中间代码生成 --> 优化 --> 目标代码生成Java程序从源文件创建到程序运行要...
  • C语言编译过程

    2021-05-23 11:46:27
    C语言编译过程 编译的概念 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,153
精华内容 44,461
关键字:

编译过程共分为个阶段