首页 常见问题 把高级语言编写的源程序转换为可执行程序,要经过什么?

把高级语言编写的源程序转换为可执行程序,要经过什么?

Aug 31, 2020 pm 03:44 PM
可执行程序 源程序 高级语言

把高级语言编写的源程序转换为可执行程序,要经过“编译和连接”。用高级语言编写的源程序不能在机器上直接执行,必须经过编译和连接。

把高级语言编写的源程序转换为可执行程序,要经过什么?

程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。接下来通过几个简单的例子来详细讲解一下这些过程。

对于上边用到的几个选项需要说明一下。

使用 gcc 命令不跟任何的选项的话,会默认执行预处理、编译、汇编、链接这整个过程,如果程序没有错,就会得到一个可执行文件,默认为a.out

-E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执行了。

-S选项:提示编译器执行完编译就停下来,不去执行汇编和链接了。

-c选项:提示编译器执行完汇编就停下来。

所以,这三个选项相当于是限定了编译器执行操作的停止时间,而不是单独的将某一步拎出来执行。

上述程序的执行过程大家应该都很熟悉了,就不浪费口舌了。

一、预处理:

       使用-E选项,表示只进行预编译,对应生成一个 .i 文件。

预处理过程进行的操作:

  • 将所有的“#define”删除,并且展开所有的宏定义
  • 处理所有的条件编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”
  • 处理“#include”预编译指令,将被包含的头文件插入到该编译指令的位置。(这个过程是递归进行的,因为被包含的文件可能还包含了其他文件)
  • 删除所有的注释“//”和“/* */”。
  • 添加行号和文件名标识,方便后边编译时编译器产生调试用的行号心意以及编译时产生编译错误或警告时能够显示行号。
  • 保留所有的#pragma编译指令,因为编译器需要使用它们。

使用一个简单的程序来验证一下事实是否如上述所说的一样

编写一个简单的程序,然后使用-E选项执行预处理过程,打开生成的 .i 文件与源文件进行比对,结果一目了然

       对于给代码加上行号这个就不在这里演示了,我们在写代码的时候是不会手动添加行号的,我们看到的行号都是自己使用的编辑工具自动加上的,而这些行号编译系统是看不到的,但是呢,我们发现如果我们哪一行的代码出现了问题,编译的时候就会给出提示说哪行的代码有什么问题,这就已经证明,编译器是会自动添加行号的。

二、编译:

        使用-S选项,表示编译操作执行完就结束。对应生成一个 .s 文件。

        编译过程是整个程序构建的核心部分,编译成功,会将源代码由文本形式转换成机器语言,编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

  • 词法分析:

        词法分析是使用一种叫做lex的程序实现词法扫描,它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(运算符、等号等),然后他们放到对应的表中。

  • 语法分析:语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。对于不同的语言,只是其语法规则不一样。用于语法分析也有一个现成的工具,叫做:yacc。

  • 语义分析:

       语法分析完成了对表达式语法层面的分析,但是它不了解这个语句是否真正有意义。有的语句在语法上是合法的,但是却是没有实际的意义,比如说两个指针的做乘法运算,这个时候就需要进行语义分析,但是编译器能分析的语义也只有静态语义。

       静态语义:在编译期就可以确定的语义。通常包括声明与类型的匹配、类型的转换。比如当一个浮点型的表达式赋值给一个整型的表达式时,其中隐含一个从浮点型到整型的转换,而语义分析就需要完成这个转换,再比如,将一个浮点型的表达式赋值给一个指针,这肯定是不行的,语义分析的时候就会发现两者类型不匹配,编译器就会报错。

       动态语义:只有在运行期才能确定的语义。比如说两个整数做除法,语法上没问题,类型也匹配,听着好像没毛病,但是,如果除数是0的话,这就有问题了,而这个问题事先是不知道的,只有在运行的时候才能发现他是有问题的,这就是动态语义。

  • 中间代码生成

       我们的代码是可以进行优化的,对于一些在编译期间就能确定的值,是会将它进行优化的,比如说上边例子中的 2+6,在编译期间就可以确定他的值为8了,但是直接在语法上进行优化的话比较困难,这时优化器会先将语法树转成中间代码。中间代码一般与目标机器和运行环境无关。(不包含数据的尺寸、变量地址和寄存器的名字等)。中间代码在不同的编译器中有着不同的形式,比较常见的有三地址码和P-代码。

       中间代码使得编译器可以分为前端和后端。编译器前端负责产生于机器无关的中间代码,编译器后端将中间代码换成机器代码。

  • 目标代码生成与优化

代码生成器将中间代码转成机器代码,这个过程是依赖于目标机器的,因为不同的机器有着不同的字长、寄存器、数据类型等。

最后目标代码优化器对目标代码进行优化,比如选择合适的寻址方式、使用唯一来代替乘除法、删除出多余的指令等。

三、汇编

汇编过程调用汇编器as来完成,是用于将汇编代码转换成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

使用命令as hello.s -o hello.o 或者使用gcc -c hello.s -o hello.o来执行到汇编过程结束,对应生成的文件是.o文件。

四、链接

链接的主要内容就是将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括了地址和空间分配、符号决议和重定向

符号决议:有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。

                比如说 int a = 6;这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是4.

重定位:重新计算各个目标的地址过程叫做重定位。

最基本的链接叫做静态链接,就是将每个模块的源代码文件编译成目标文件(Linux:.o  Windows:.obj),然后将目标文件和库一起链接形成最后的可执行文件。库其实就是一组目标文件的包,就是一些最常用的代码变异成目标文件后打包存放。最常见的库就是运行时库,它是支持程序运行的基本函数的集合。

更多相关知识,请访问:PHP中文网

以上是把高级语言编写的源程序转换为可执行程序,要经过什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

机器语言、汇编语言、高级语言各有什么特点 机器语言、汇编语言、高级语言各有什么特点 Apr 22, 2021 pm 04:00 PM

机器语言的特点:难学、难懂、难理解;无通用性;需要人为分配内存;运行速度最快。汇编语言的特点:程序的执行效率非常高、占用存储空间小、运行速度快;缺乏通用性,程序不易移植。高级语言的特点:容易、有一定通用性、计算机不能直接识别和执行。

能够把高级语言编写的源程序翻译成目标程序的系统软件是什么 能够把高级语言编写的源程序翻译成目标程序的系统软件是什么 Jan 22, 2021 pm 05:36 PM

能够把高级语言编写的源程序翻译成目标程序的系统软件是“编译程序”。编译程序属于采用生成性实现途径实现的翻译程序;它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。

汇编语言是高级语言吗 汇编语言是高级语言吗 Jan 30, 2023 pm 03:14 PM

汇编语言不是高级语言;它和机器语言一样,都属于低级语言。汇编语言和高级语言的区别:1、汇编语言的编程效率不高,而高级语言的编程效率高于汇编语言;2、高级语言的可读性比汇编语言高;3、汇编语言是一种面向机器的语言,而高级语言是简化靠近人的自然语言。

把高级程序设计语言编写的程序转换成等价的可执行程序需要经过什么 把高级程序设计语言编写的程序转换成等价的可执行程序需要经过什么 Jan 12, 2021 pm 02:41 PM

把高级程序设计语言编写的程序转换成等价的可执行程序需要经过编译和连接。高级程序设计语言可摆脱计算机指令系统和机器语言随机器不同的约束,把源程序转换为CPU能识别的目标代码。

机器语言是高级语言吗 机器语言是高级语言吗 Aug 22, 2023 pm 05:13 PM

机器语言不是高级语言,是一种用于计算机硬件的低级语言,它直接与计算机的底层硬件进行交互,机器语言使用二进制编码表示指令和数据,每个指令对应着计算机硬件的一种操作或功能,高级语言是一种更接近人类语言的编程语言,提供了更高的抽象能力和开发效率,机器语言和高级语言在编程中扮演着不同的角色,各自有着各自的优势和适用场景。

发布全球首个支持JS/ArkTS高级语言的基于开源鸿蒙的人形机器人 发布全球首个支持JS/ArkTS高级语言的基于开源鸿蒙的人形机器人 Nov 17, 2023 pm 08:07 PM

快科技11月17日消息,今天上午,深开鸿宣布,其和乐聚机器人共同研发的,首款基于开源鸿蒙的KaihongOS人形机器人正式发布。根据官方介绍,这是一款搭载了KaihongOS以机器人为载体的万物智联教学系统,涵盖工业、服务等多场景。这个机器人装备了血氧心率传感器、温湿度传感器、红外测温传感器、人体感应传感器、NFC、OLED显示屏、LED灯。通过多元联合感知,它可以智能地执行决策同时,该机器人还可以与手机、平板、电脑等设备实时互联,摆脱传统线束连接方式,提升教学效率。同时,这款机器人还拥有17个

c源程序中main函数的位置是什么? c源程序中main函数的位置是什么? Nov 19, 2020 am 11:06 AM

C语言规定,在一个源程序中,main函数的位置:可以是任意的;在执行一个c语言编写的程序时,main函数就相当于是执行程序的入口;不论main函数在整个过程中的位置如何,一个C程序总是从mam函数开始执行的。

Go语言的特性分析:它是否属于高级语言? Go语言的特性分析:它是否属于高级语言? Mar 23, 2024 pm 04:00 PM

Go语言的特性分析:它是否属于高级语言?Go语言是一种由Google开发的静态强类型编程语言,它设计简洁,易于阅读和编写,同时具备高效的并发特性。那么,根据高级语言的定义,我们来分析一下Go语言是否属于高级语言。高级语言的定义高级语言是一种相对于机器语言更接近人类语言的编程语言。它具有语法简洁、易读易写、抽象层次高等特点,能够让程序员更专注于解决问题本身,而