当前位置:首页 » 编程软件 » 编译后的代码分为几个段

编译后的代码分为几个段

发布时间: 2023-05-23 15:52:23

编译过程包括哪几个主要阶段及每个阶段的功能。

【答案】:编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5个阶段。
词法分析的功能是弊则对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。
语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程指或序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。
词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。表达语义的中间代码与机器租逗棚代码相似,可以认为这一步进行了翻译工作,把源程序翻译成了与具体机器指令系统无关的抽象指令代码。
优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。
目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。

② 编译程序分为哪几个主要部分

1、词法分析

词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。

2、语法分析

编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。

3、中间代码生成

中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现。中间代码即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。

4、代码优化

代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。

5、目标代码生成

目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。



(2)编译后的代码分为几个段扩展阅读:

特点

数据结构分析和综合时所用的主要数据结构,包括符号表、常数表和中间语言程序。符号表由源程序中所用的标识符连同它们的属性组成。

其中属性包括种类(如变量、数组、结构、函数、过程等)、类型(如整型、实型、字符串、复型、标号等),以及目标程序所需的其他信息。常数表由源程序中用的常数组成,其中包括常数的机内表示,以及分配给它们的目标程序地址。

分析部分源程序的分析是经过词法分析、语法分析和语义分析三个步骤实现的。词法分析由词法分析程序(又称为扫描程序)完成。

其任务是识别单词(即标识符、常数、保留字,以及各种运算符、标点符号等)、造符号表和常数表,以及将源程序换码为编译程序易于分析和加工的内部形式。


③ 描述一般的编译程序可分为哪些阶段,每个阶段的目的是什么

其目的是保证标识符和常数的正确使用,把必要的信息...综合部分 综合阶段必须根据符号表和中间语言程序产生...目标程序质量,也可以把一个逻辑步骤的工作分为几遍.

④ C语言文件的编译与执行的四个阶段并分别描述

开发C程序有四个步骤:编辑、编译、连接和运行。

任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。

1、预处理:导入源程序并保存(C文件)。

2、编译:将源程序转换为目标文件(Obj文件)。

3、链接:将目标文件生成为可执行文件(EXE文件)。

4、运行:执行,获取运行结果的EXE文件。

(4)编译后的代码分为几个段扩展阅读:

将C语言代码分为程序的几个阶段:

1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。

2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。

3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。

4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。

⑤ 编译为什么要分成不同的阶段请解释编译的几个不同阶段

编译过程分为分析和综合两个部分,并进一步划分为词法分析、语法分析、 语义分析、 代码优化、存储分配和代码生成等六个相继的逻辑步骤。
这六个步骤只表示编译程序各部分之间的逻辑联系,而不是时间关系。编译过程既可以按照这六个逻辑步骤顺序地执行,也可以按照平行互锁方式去执行。在确定编译程序的具体结构时,常常分若干遍实现。对于源程序或中间语言程序,从头到尾扫视一次并实现所规定的工作称作一遍。每一遍可以完成一个或相连几个逻辑步骤的工作。例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;代码优化和存储分配作为第三遍;代码生成作为第四遍。反之,为了适应较小的存储空间或提高目标程序质量,也可以把一个逻辑步骤的工作分为几遍去执行。例如,代码优化可划分为代码优化准备工作和实际代码优化两遍进行。

⑥ C语言源程序的编译过程包括哪三个阶段

编译:将源程序转换为扩展名为.obj的二进制代码
连接:将obj文件进行连接,加入库函数等生成可执行文件
运行:执行可执行文件,有错返回修改,无错结束

⑦ C语言代码组成 - BSS、Data、Stack、Heap、Code、Const

一段C语言经过编译连接后,成为一段可以运行的代码,可运行的代码可以分为以下四个部分组成:全局变量/静态变量区、堆、栈、代码区。其中全局变量/静态变量区又分为未初始化变量区和初始化变量区,代码区又分为代码和常量区。即汇总下来,代码可以分为6部分组成,包括:BSS区(未初始化的全局变量/静态变量区)、Data区(实始化的全局变量区)、Stack区(栈区)、heap区(堆区)、Code区(代码区)、const区(常量区)。

一、BSS区和Data区

C语言编程中定义的全局变量、静态局部变量,就是分配在全局变量/静态变量区域,但是为什么又要分为BSS区域和Data区域呢?其实我们在定义全局或者静态变量区,有时我会对它赋初始值,有的又不会赋初始化,比如我们定义的全局变量,初始化的赋值,是怎么样写到变量区域中的,我们定义的静态局部变量,在定义时初始化后,为什么后面函数被调用,又不会再初始化呢?这个局部静态变量是怎么样实始化的,什么时候初始化的?

如果分析编译后的汇编代码,就会发现在代码运行起来后,会有一段给变量赋值的指令,这一段代码,不是我们C代码对应的汇编,而是C编译器生成的汇编译代码,这段代码的作用就是给初始化了的静态变量和全局变量进行初始化。这也是为什么全局/静态变量区域,要分BSS和Data的原因。

二、Stack区

栈是一种先进后出的数据结构,这种数据结构正好完美的匹配函数调用时的模型过程,比如函数f(a)在运行过程中调用函数f(b),f(a)在运行过程中的变量就是分配在栈中,通过在调用f(b)前,会将代码中用到的R0~Rn寄存器的值保存到栈中,同时将函数的传入参数写入到栈中,然后进入f(b)函数,函数f(b)的变量b分配在栈中,当函数运行完毕后,释放变量b,将栈中存放的f(a)函数的运行的R0~Rn寄存器值恢复到寄存器中,同时f(b)的返回结果存入到栈中,这样f(a)继续运行。当一个函数运行完毕后,它在栈中分配的临时变量会全部释放。

对于中断也是一样的,中断发生时,也是一个函数打断了另一个函数的运行,这种现场的保存(即寄存器的值),都是通过栈来完成的。所以栈的作用有:

三、Heap区

全局变量分配的内存在代码整个运行周期内都是有效的,而在栈区分配的内存在函数调用完成后,就会释放。这两种内存模型都是由编译器决定它的使用,代码是无法控制的。那有没有内存是由用户控制的,要用时,就自由分配,不用时,就自行释放?答案是肯定的,这部分内存就是堆。

用户需要使用的动态内存,就是通过malloc函数,调用分配的,在没有释放前,可一直由代码使用。当这部分内存不再需要使用时,可以通过free函数进行释放,将它归还到堆中。从这中可以看出,堆的内存,是按需分配的。这就是赋予了代码很大的自由度,但这也是会带来负作用的,比如:内存碎片化导致的malloc失败;忘记释放内存导致的内存泄露,而这些往往是致命的失误。

四、Code区

代码区就是编译后机器指令,这些指令决定了功能的执行。我们编译的代码一般是下载进flash中,但是运行,却有两种方式:在RAM中运行和在ROM中运行。 在RAM中运行,即是boot启动后,将flash中的代码复制到RAM中,然后PC指针在指到RAM中的代码中开始运行。 有时在调试时,我们可以直接将代码下载进RAM中运行进行调试,这样加快调试速度。便是大部分的情况我们的代码是从flash中开始运行的。

五、常量区

代码中的常量,一部分是作为立即数,在代码区中,但是像定义的字符串、给某数组赋值的一串数值,这些常量,就存在常量区,我们常用const来定义一个常量,即该变量不能再必变。这部分的变量,编译器一般将它定义的flash中。

六、各个区域大小的是如何决定的:

code区和const区:是由代码的大小和代码中常量的多少来决定的。

bss区和data区:这是由代码中定义的全局变量和局部变量的多少来决定的。

stack区:这个可以由使用都自行定义大小,但使用都要根据自已代码的情况,评估出一个合理的值,再定义其大小,如果定义的太小,很容易爆栈,导至代码异常,但是如果定义的太大,就容易浪费内存。

heap区:RAM剩下的部分,编译器就会作为堆区使用。

七、嵌入式代码一般启动过程

以STM32为例,通过分析其汇编启支代码,大致可以分为以下几个步骤:

如果大家想看编译扣,代码文件的组成,可以查看统后生的map文件,里面有详细的数据,包括各个函数的分配内存,BSS,Data,Stack,Heap,Text的分配情况。

如果相要了解详细的代码启动过程,可看它的启动汇编文件。

⑧ 编译程序的工作过程一般可以划分为哪5个基本阶段,还自始至终伴随进行哪两项工作

1、编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;中间代码生成;代码优化;目标代码生成。

2、编译程序的工作过程一般自始至终伴随进行信息表管理和出错处理两项工作。

主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

(8)编译后的代码分为几个段扩展阅读:

解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。解释程序的工作过程如下:

1、由总控程序完成初始化工作。

2、依次从源程序中取出一条语句进行语法检查,如有错,输出错误信息;如果通过了语法检查,则根据语句翻泽成相应的指令并执行它。

3、检查源程序是否已经全部解释执行完毕,如果未完成则继续解释并执行下一条语句,直到全部语句都处理完毕。

⑨ 典型的编译器可以划分成几个主要的逻辑阶段

这是我们今天的作业,

典型的编译器可以划分成七个主要的逻辑阶段,分别是词法分析器、语法分析器、语义分析器、中间代码生成器、独立于机器的代码优化器、代码生成器、依赖于机器的代码优化器。各阶段的主要功能:

(1)词法分析器:词法分析阅读构成源程序的字符流,按编程语言的词法规则把它们组成词法记号流。

(2)语法分析器:按编程语言的语法规则检查词法分析输出的记号流是否符合这些规则,并依据这些规则所体现出的该语言的各种语言构造的层次性,用各记号的第一元建成一种树形的中间表示,这个中间表示用抽象语法的方式描绘了该记号流的语法情况。

(3)语义分析器:使用语法树和符号表中的信息,依据语言定义来检查源程序的语义一致性,以保证程序各部分能有意义地结合在一起。它还收集类型信息,把它们保存在符号表或语法树中。

(4)中间代码生成器:为源程序产生更低级的显示中间表示,可以认为这种中间表示是一种抽象机的程序。

(5)独立于机器的代码优化器:试图改进中间代码,以便产生较好的目标代码。通常,较好是指执行较快,但也可能是其他目标,如目标代码较短或目标代码执行时能耗较低。

(6)代码生成器:取源程序的一种中间表示作为输入并把它映射到一种目标语言。如果目标语言是机器代码,则需要为源程序所用的变量选择寄存器或内存单元,然后把中间指令序列翻译为完成同样任务的机器指令序列。

(7)依赖于机器的代码优化器:试图改进目标机器代码,以便产生较好的目标机器代码。

⑩ 编译过程分为哪几个阶段各阶段的遵循的原则、识别机构、使用的文法编译原理

编译原理中的遍概念
编译阶段也常常划分为两大步骤,分析步骤和综合步骤 分析步骤和综合步骤 分析步骤是指对源程序的分析 -线性分析(词法分析或扫描) -层次分析(语法分析) -语义分析 综合步骤是指后端的工作,为目标程序的生成而进行的综合

你分析过吗?若按照这种组合方式实现编译程序,可以设想,某一编译程序的前端加上相应不同的后 端则可以为不同的机器构成同一个源语言的编译程序。也可以设想,不同语言编译的前端生成同一种中间 语言,再使用一个共同的后端,则可为同一机器生成几个语言的编译程序。

一个编译过程可由一遍、两遍或多遍完成。所谓"遍",也称作"趟",是对源程序或其等价的中间语言程 序从头到尾扫视并完成规定任务的过程。每一遍扫视可完成上述一个阶段或多个阶段的工作。例如一遍可 以只完成词法分析工作;一遍完成词法分析和语法分析工作;甚至一遍完成整个编译工作。对于多遍的编 译程序,第一遍的输入是用户书写的源程序,最后一遍的输出是目标语言程序,其余是上一遍的输出为下 一遍的输入。

在实际的编译系统的设计中,编译的几个阶段的工作究竟应该怎样组合,即编译程序究竟分成几遍, 参考的因素主要是源语言和机器(目标机)的特征。比如源语言的结构直接影响编译的遍的划分;像 PL/1 或 ALGOL 68 那样的语言,允许名字的说明出现在名字的使用之后,那么在看到名字之前是不便为包含该名 字的表达式生成代码的,这种语言的编译程序至少分成两遍才容易生成代码。另外机器的情况,即编译程 序工作的环境也影响编译程序的遍数的划分。遍数多一点,整个编译程序的逻辑结构可能清晰些,但遍数 多即意味着增加读写中间文件的次数,势必消耗较多时间,一般会比一遍的编译要慢。

热点内容
memcache数据库 发布:2025-09-17 10:23:01 浏览:67
安卓机如何锁软件 发布:2025-09-17 10:18:34 浏览:945
二手3系买哪个配置好 发布:2025-09-17 10:07:16 浏览:740
sqlserver2000xp 发布:2025-09-17 09:36:19 浏览:829
c9什么时候升级安卓70 发布:2025-09-17 09:35:36 浏览:211
速算法中 发布:2025-09-17 09:30:50 浏览:380
怎么进网站服务器 发布:2025-09-17 09:18:15 浏览:462
小火箭服务器订阅是什么 发布:2025-09-17 09:01:40 浏览:736
c语言入门基础 发布:2025-09-17 08:54:30 浏览:668
副卡服务密码是多少位 发布:2025-09-17 08:45:44 浏览:438