导航:首页 > 源码编译 > 编译器是如何识别程序的

编译器是如何识别程序的

发布时间:2022-10-02 23:56:11

‘壹’ 编译器的工作原理

编译 是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
所以我们电脑上的文件都是经过编译后的文件。

‘贰’ 哪位大牛能告诉我,c语言中的'&'这个符号,到底编译器是怎么识别并运用它的

'&'是多功能运算符,至于如何解释该符号,编译器是根据“上下文”来判断的。
由于在C中每个变量必须先声明后使用,比如有声明 :
int x = 3,y = 5,z;
int *p,fun(int &, int &); // 这里显然是引用操作符啦!
对于
z = x & y; // 很明显的,这是逻辑与(and)运算
x &= y; // 这里也是
p = &x; // 这是取址运算,注意,新版的C中没有 =& 双目运算符
-----------------------------------------------------------------------------------------------------------------------
在C++中,有运算符重载函数,比如
aClass operator&(const aClass &x,const aClass &y);,功能是实施类x和y的逻辑与,并返回aClass的实例,这里operator&中的“&”是被重载的运算符,&x,&y中的“&”是引用操作符。
----------------------------------------------------------------------------------------------------------------------
如果你希望了解编译程序的细节,请参考相关书籍。

‘叁’ 计算机是如何识别C语言的

计算机是不能直接识别C语言的,它需要经过特殊的编译器,编译之后的二进制才能被计算机识别,计算机只能识别二进制代码。

整个程序的编译过程中有三个角色:程序员——编译器——计算机。

程序员和编译器之间的交流是C语言,同时编译器也能把C语言经过翻译成二进制指令。编译器相当于程序员和计算机之间的翻译官。

一个C语言程序的过程有以下步骤:
一、程序员使用C语言编写代码;
二、编译把代码翻译成二进制指令;这里也有四个步骤:
a.预处理,这里主要处理头文件,和程序中的一些宏代码;
b.编译,主要是把每个C语言文件编译成二进制目标代码;
c.链接,把上一步生成的目标代码和库文件进行链接,最终生成可执行程序。

以上就是C语言到计算机可识别代码的转换过程。

‘肆’ 计算机是怎样识别程序语言的

计算机并不认识任何程序,它只认识高低电压,也就是01代代码,0代表低电压,1代表高电压。由不同顺序组成的01代码就成了计算机认识的语言即机器语言。面我们一般人只懂几种语言,我们所用的语言经过汇编语言自动翻译最后就变成计算机认识的机器语言即01代码的字符串,计算机从而可以识别。

‘伍’ 你好,请问如何将 语言 写入程序,例如 C++、/.// java 这些编程语言~~ 是如何被编译器识别的

这个楼主你问得太泛了,很难回答啊!
1.首先每种编程语言都具有不同语法特点,这就需要编译器,可以有 判断文法 的功能( 语法分析)
根据各种语法下推自动机就可以分析出你输入的代码是否符合语言要求,或者作为报错处理.

下面是(要看懂BNF啊)
C 文法
http://lists.canonical.org/pipermail/kragen-hacks/1999-October/000201.html
java 文法
http://www.daimi.au.dk/dRegAut/JavaBNF.html
ruby 文法
http://www.cse.buffalo.e/~regan/cse305/RubyBNF.pdf
还有其他语言就不一一列举了.
编译器就是根据上面文法来为每个语言工作的.

其次,哎 就没有其次了,还是先看上面吧
以后的语义分析需要你有前面的基础啊

‘陆’ 计算机是怎样识别程序语言的

这里有几个概念,语言、指令。

这里说的语言是指计算机语言,例如C语言、C++语言等而不是人类语言,汉语、英语等。
人们使用这些语言表达自己需要完成的一系列功能,就形成程序,而这个程序就是用这种语言写的文字。

语言是通过编译器将其转换成处理器指令。就像人类的翻译。

语言和指令存在着某种等价关系。
就是说给定一个特定语言写的程序,编译器都将其转换对应的处理器指令序列。

而处理器指令本质上数学上的一组0和1。

而0和1的问题就数字电路的问题了。

‘柒’ 程序的编译过程是怎样的程序的解释过程是怎样的

编译器首先用扫描程序扫描源代码,然后用语法分析程序分析得到语法树,然后经过语义分析、优化处理,最后通过代码生成程序得到目标代码的文件。
整个编译过程就是(扫描-语法分析-语义分析-优化-目标代码生成)。通常生成的是汇编代码,机器代码,可以直接执行,不需要解释。
而解释的过程只使用与解释型语言,这种语言只编译成一种中间文件,在运行时通过虚拟机读取中间文件进行解释运行。这种语言天生速度比较慢,但可以达到所谓的跨平台效果。
如果想深入了解,推荐看一看《编译原理》,如果只是想大概了解,推荐看一看《编译原理》的目录~呵呵

‘捌’ 编译原理

C语言编译过程详解
C语言的编译链接过程是要把我们编写的一个C程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下:

从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。
一、编译过程
编译过程又可以分成两个阶段:编译和汇编。
1、编译
编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:
第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。
主要是以下几方面的处理:
(1)宏定义指令,如 #define a b。
对于这种伪指令,预编译所要做的是将程序中的所有a用b替换,但作为字符串常量的 a则不被替换。还有 #undef,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。
这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
(3) 头文件包含指令,如#include "FileName"或者#include <FileName>等。
在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。包含到C源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与C源程序放在同一目录下,此时在#include中要用双引号("")。
(4)特殊符号,预编译程序可以识别一些特殊的符号。
例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
第二个阶段编译、优化阶段。经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,}, +,-,*,\等等。
编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。
后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。
2、汇编
汇编实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:
代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。
UNIX环境下主要有三种类型的目标文件:
(1)可重定位文件
其中包含有适合于其它目标文件链接来创建一个可执行的或者共享的目标文件的代码和数据。
(2)共享的目标文件
这种文件存放了适合于在两种上下文里链接的代码和数据。
第一种是链接程序可把它与其它可重定位文件及共享的目标文件一起处理来创建另一个 目标文件;
第二种是动态链接程序将它与另一个可执行文件及其它的共享目标文件结合到一起,创建一个进程映象。
(3)可执行文件
它包含了一个可以被操作系统创建一个进程来执行之的文件。汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。
二、链接过程
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
我们在linux使用的gcc编译器便是把以上的几个过程进行捆绑,使用户只使用一次命令就把编译工作完成,这的确方便了编译工作,但对于初学者了解编译过程就很不利了,下图便是gcc代理的编译过程:

从上图可以看到:
预编译
将.c 文件转化成 .i文件
使用的gcc命令是:gcc –E
对应于预处理命令cpp
编译
将.c/.h文件转换成.s文件
使用的gcc命令是:gcc –S
对应于编译命令 cc –S
汇编
将.s 文件转化成 .o文件
使用的gcc 命令是:gcc –c
对应于汇编命令是 as
链接
将.o文件转化成可执行程序
使用的gcc 命令是: gcc
对应于链接命令是 ld
总结起来编译过程就上面的四个过程:预编译、编译、汇编、链接。了解这四个过程中所做的工作,对我们理解头文件、库等的工作过程是有帮助的,而且清楚的了解编译链接过程还对我们在编程时定位错误,以及编程时尽量调动编译器的检测错误会有很大的帮助的。
是否可以解决您的问题?

‘玖’ c与c++语言编译器是如何识别关键字

根据编译器的不同,有不同的识别方式,例如VC6.0使用系统内建关键字列表,如果用户定义变量的时候使用了系统默认的关键字,则会在编译的时候产生错误。

附上:
C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

1 数据类型关键字(12个):
(1) char :声明字符型变量或函数
(2) double :声明双精度变量或函数
(3) enum :声明枚举类型
(4) float:声明浮点型变量或函数
(5) int: 声明整型变量或函数
(6) long :声明长整型变量或函数
(7) short :声明短整型变量或函数
(8) signed:声明有符号类型变量或函数
(9) struct:声明结构体变量或函数
(10) union:声明联合数据类型
(11) unsigned:声明无符号类型变量或函数
(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)

(2)控制语句关键字(12个):
A循环语句
(1) for:一种循环语句(可意会不可言传)
(2) do :循环语句的循环体
(3) while :循环语句的循环条件
(4) break:跳出当前循环
(5) continue:结束当前循环,开始下一轮循环
B条件语句
(1)if: 条件语句
(2)else :条件语句否定分支(与 if 连用)
(3)goto:无条件跳转语句
C开关语句
(1)switch :用于开关语句
(2)case:开关语句分支
(3)default:开关语句中的“其他”分支
D
return :子程序返回语句(可以带参数,也看不带参数)

3 存储类型关键字(4个)
(1)auto :声明自动变量 一般不使用
(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)
(3)register:声明积存器变量
(4)static :声明静态变量

4 其它关键字(4个):
(1)const :声明只读变量
(2)sizeof:计算数据类型长度
(3)typedef:用以给数据类型取别名(当然还有其他作用
(4)volatile:说明变量在程序执行中可被隐含地改变

‘拾’ 编译器 如何识别源程序是c或c++

例如linux下有
gcc
,windows下有ms
vs
系列。c的源程序经过这些编译器每种平台都有自己的c编译器的,再与各自平台的连接器就可以生成该平台下对应的二进制执行代码了。
但由于c语言很多时候会涉及很多硬件级调用的,这个对平台依赖性极大。所以移植性这种东西,我只能说,哈哈

阅读全文

与编译器是如何识别程序的相关的资料

热点内容
人工智能及其应用pdf 浏览:616
有漏胸的电影 浏览:625
打真军香港电影 浏览:617
汇款app原理是什么 浏览:170
法国电影一个偷画 浏览:879
店长的h命令必须服从 浏览:94
cad填充命令是什么 浏览:870
java引用类型值类型 浏览:240
徐锦江叶子楣方唐镜 浏览:59
可以在线看片的网站 浏览:133
小米加密兔手机壁纸 浏览:613
2019程序员笔记本 浏览:477
武大小孩子厉害的电影有哪些 浏览:35
找一个可以看的网址 浏览:79
四个字的国外电影,小孩儿 浏览:411
推荐看片网站 浏览:652
主角叫林飞的小说是什么 浏览:683
闲置服务器能干什么工作 浏览:949
asdr q-2299123 浏览:987
中国最大尺度古装电影 浏览:695