编译指令重复执行吗
❶ 简述将源程序编译成可执行程序的过程
一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、删除所有的注释,“//”和“/**/”。
5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。
(1)编译指令重复执行吗扩展阅读:
编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。
❷ 如何让一个命令反复执行若干次
1.for
循环语句
for
语句格式为
:
for(
表达式
1;
表达式
2;
表达式
3)
语句
:/*
循环体
*/
该语句执行过程如下
:
①先对表达式
1
赋初值
;
②判别表达式
2
是否满足给定条件
,
若其值为真
,
满足循环条件
,
则执行
循环体内语句
,
然后执行表达式
3,
进入第二次循环
,
再判别表达式
2……;否
则判断表达式
2
的值为假
,
不满足条件
,
就终止
for
循环
,
执行循环体外语
句。
for
语句语法流程如下图所示
:
@@01L14300.GIF;
图
1.@@
例题
:f7_1.c
# include
main ()
{
int n,nu;
nu=0;
for (n=1;n<=200;n++)
点击此处添加图片说明
nu+=n;
printf ("nu=%d\n",nu);
}
编译并执行后
,
屏幕显示
:
nu=20100
在程序中
,for
语句小括号内的三个表达式分别为
:n=1;n<=200;n++
。
表
达式
1,n=1
是给
n
赋初值
,
表达式
2
是关系表达式
,n
小于等于
200
时
,
表达
式都为真
,
则执行循环体内的语句
nu+=n;(
即
nu=nu+n;),
然后执行表达式
3(n++),
进入下一轮循环
;
若
n
大于
200
时
,
表达式
2
为假
,
则终止循环
,
执行
printf()
语句
,
在屏幕上打印出
:nu=20100
。
几种特殊
for
语句的用法
:
(1)for
小括号内三个表达式为空
例
for(;;)
printf ("test");
在小括号内只有两个分号
,
无表达式。表示无限循环。这种无限循环适
用于菜单选择程序中。
具体的:http://wenku..com/link?url=dTWyK99jmWEZq9r-Cvgh9jpcAhiH_isbqOuDit5RFE_
❸ 编译执行和解释执行的区别
一、主体不同
1、编译执行:由编译程序将目标代码一次性编译成目标程序,再由机器运行目标程序。
2、解释执行:将源语言直接作为源程序输入,解释执行解释一句后就提交计算机执行一句,并不形成目标程序。
二、优势不同
1、编译执行:相比解释执行编译执行效率高,占用资源小,适合复杂程序
2、解释执行:开发速度快,出现严重BUG的几率小。
三、缺点不同
1、编译执行:兼容性差,例如在windows平台上写的编译程序一般不可以在unix平台上运行。
2、解释执行:解析需要时间,不生成目标程序而是一句一句的执行的方式会造成计算机资源的浪费,即执行效率低。
❹ 程序重复运行代码
当一个或者多个指令(程序)重复多次(次数可知)时,可使用FOR指令。
FOR为有限次循环指令。
程序循环结构用于描述一段程序的重复循环执行。由FOR和NEXT指令构成程序的循环体。FOR指令标记循环的开始,NEXT指令为循环体的结束指令。
FOR指令为指令盒格式,主要参数有使能输入EN、当前值计数器INDX、循环次数初始值INIT和循环计数终值FINAL。
❺ 64位gcc编译浮点加法为什么每次mov指令都执行两次
这个,你需要先查一下x86_64传递参数的规则。浮点数是用 xmm0, xmm1,xmm2,xmm3来传递参数的。
你还需要了解一下SIMD指令集。
http://en.wikipedia.org/wiki/X86_calling_conventions
我不知道为什么你反汇编出来是这样。我自己测试了一下,反汇编结果比你的简单多了。
你的编译器,可能规则和我的稍有不同。比我的复杂一些。
大概翻译如下:
0x00000000004014f0<+0>:push%rbp
0x00000000004014f1<+1>:sub$0x4,%rsp
0x00000000004014f5<+5>:lea0x80(%rsp),%rbp
0x00000000004014fd<+13>:movss%xmm0,-0x6c(%rbp)====>参数s保存在xmm0中,把它压到栈上位置为-0x6c(%rbp)
0x0000000000401502<+18>:movss-0x6c(%rbp),%xmm0====>xmm0可以保存4个float,这样,仅仅把-0x6c(%rbp)位置的一个floats传递到xmm0寄存器,准备做float的运算
0x0000000000401507<+23>:addss%xmm0,%xmm0====>2个float相加,相加结果保存在xmm0中
0x000000000040150b<+27>:movss%xmm0,-0x80(%rbp)==>把相加的结果,保存在栈上位置为-0x80(%rbp),但是这里是4个float,其中高位三个都是0.0,最低位一个是s+s的结果
0x0000000000401510<+32>:mov-0x80(%rbp),%eax==>eax是保存结果的规定寄存器,保存一份结果,这下只会保存最低位的float,也就是我们需要的结果
0x0000000000401513<+35>:mov%eax,-0x80(%rbp)==>传回去,有点绕,本质上是编译器的不同,一些编译器有一些特定的规则,主要的目的是为了下面传递给xmm0,只能从栈上穿,movss指令只能这样用。
0x0000000000401516<+38>:movss-0x80(%rbp),%xmm0==>返回结果需要保存在xmm0中,所以又传给它了。为什么要穿来传去呢,因为xmm0可以保存4个float,可以同时进行4个float运算,上面的步骤是为了保证,只有最后一个float运算的结果被保存,前面三个float,结果都是0.0,但是不管是什么,结果都被忽略了。
0x000000000040151b<+43>:add$0x4,%rsp==>清除栈,返回
0x000000000040151f<+47>:pop%rbp
0x0000000000401520<+48>:retq
❻ C语言既可以编译执行又可以解释执行吗 编译执行怎么解释 解释执行又怎么解释
C 语言程序仅可以解释执行。
解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机执行这个目标程序,得到计算结果。
相对于编译性语言,其优点是可移植性好,只要有解释器环境,程序就可以在不同的操作系统上运行。
缺点是代码需要有专门的解释器,在程序运行时,除要给用户程序本身分配内存空间外,解释器也占用系统资源,所以其运行速度较慢。另外,也很难达到像C、C++那样操作系统底层操作的目的。
解释型语言常用于,一是对运行速度要求不高(如一些网页脚本等)的场合,二是对跨平台(操作系统的兼容性)有要求的场合。
(6)编译指令重复执行吗扩展阅读
1、Python和Java语言,专门有一个解释器能够直接执行Python程序,每个语句都是执行的时候才翻译。
2、Python代码在运行前,会先编译成中间代码,每个 .py 文件将被换转成pyc 文件,pyc 就是一种字节码文件,它是与平台无关的中间代码。不管放在 Windows 还是 Linux 平台都可以执行,运行时将由虚拟机逐行把字节码翻译成目标代码。
❼ c++头文件中的开头代码是啥意思
if
!defined
xxx
#define
xxxx
这是预编译指令,是说,如果代码中没有定义xxx,则定义xxx,目的是,在引用文件时,防止重复定义
比如:在aaa.h中定义了AAA变量,
而在main.cpp
中#include
“AAA.h”,main.cpp也同时要使用fun.cpp.
并且在fun.cpp
中也#include“AAA.h”
那么如果没有预编译指令的话
两个文件都定义了AAA这个变量.那么就造成了AAA的多次定义。
/*****************************/
/***文件一***main.cpp***********/
#include
"AAA.h"
int
main()
.....
/**文件二*****AAA.h************/
const
int
AAA
=
123;
/**文件三*****fun.cpp**************/
#include
"AAA.h"
.....
这样,main文件包含了AAA变量的定义,由于main文件中会调用的fun.cpp,而fun.cpp文件包含了AAA.h也就是定义了AAA,
所以就会造成main文件定义了两次AAA变量。
如果使用了预编译指令,
则可以在定义了一次之后
不知道我说清楚了没有,清楚了就请加分吧
不再定义第二次
由于
❽ 单片机执行完main主程序之后,会一遍接一遍的反复再执行吗
不会。要在主程序结束前加一条返回指令。
C的可以main前面加一条while(1),汇编的可以在主程序结束后面加一条LJMP MAIN
❾ 头文件重复编译
只要简单的理解为用头文件里面的内容替换#include的地方,就可以了。
之所以会重复编译,是因为你的头文件有可能相互直接include或者间接include,
直接点比如你add.c中直接使用两次#include "stdio.h",又stdio.h中有定义函数scanf();
编译时,编译器会找到两个scanf()函数体,编译失败。
而加上#ifndef _dedd
#define _dedd
#include"stdio.h"
#endif
(在任何引用stdio.h头文件的时候都这样写),那么,在第一次编译器把stdio.h包含过来后,
后面#include "stdio.h"的地方都会检测到 _dedd已经 define了,所以不会再包含该头文件。
❿ Python同一个程序只需一次编译,即可重复执行
咨询记录 · 回答于2021-12-01