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
总结起来编译过程就上面的四个过程:预编译、编译、汇编、链接。了解这四个过程中所做的工作,对我们理解头文件、库等的工作过程是有帮助的,而且清楚的了解编译链接过程还对我们在编程时定位错误,以及编程时尽量调动编译器的检测错误会有很大的帮助的。
是否可以解决您的问题?
2. 关于编译和编程
编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。
什么叫编译程序
编译程序:是指这样的程序,它能够把某种语言的程序转换成另一种语言的程序,而后者与前者在逻辑上是等价的.如果源语言是诸如FORTRAN,Pascal,C,Ada,Smalltalk或Java这样的"高级语言",而目标语言如汇编语言之类的"低级语言"这样的翻译程序则称之为编译程序.
注意编译程序与解释程序的区别,一个语言的解释程序是着样的程序:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身.
术语"编译"的内涵是实现从源语言表示的算法向目标语言表示的算法的等价变换.
你说学编程还是学编译啊?
3. 编程的科普小知识
1.编程是什么
简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。
计算机虽然功能十分强丛坦大。可以供你上网、打游戏、管理公司人事关系等等,但是没有程序,它就等于是一堆废铁,不会理会我们对它下达的“命令”。
于是,我们要驯服它,只有通过一种方式——程序,这也是我们和计算机沟通的唯一方式。 那程序到底是什么呢? 程序也就是指令的 *** ,它告诉计算机如何执行特殊的任务。
打个比方说,它好比指导你烹调菜品的菜谱或指挥行驶一路到达目的地的交警(或者交通路标)。没有这些特殊的指令,就不能执行预期的任务。
计算机也一样,当你想让计算机为你做一件事情的时候,计算机本身并不能主动为我们工作,因此我们必须对它下达指令,而它根本不会也不可能听懂人类自然语言对事情的描述,因此我们必须使用程序来告诉计算机做什么事情以及如何去做?甚至对最简单的任务也需要指令,例如如何取得击键,怎样在屏幕上放一个字母,怎样在磁盘中保存文件等等。 这么麻烦,连这些东西编程都要考虑!怪不得人家说编程好难!你错了,其实许多这样的指令都是现成的,包含在处理芯片中内置于操作系统中,因此我们不必担心它们工作,他们都是由处理器和操作系统来完成的,并不需要我们来干预这些过程。
上面讲到的计算机本身不会主动的做任何事情。因此我们要通过程序的方式来让计算机为我们“效劳”。
而这个过程就是我们“编”出来的。编程可以使用某一种程序设计语言来实现,按照这种语言的语法来描述让计算机要做的事情。
我们这里所讲的语法和外语中的语法完全两码事,这里讲的语法只是读你的程序书写做出一写规定而已。 写出程序后,再由特殊的软件将你的程序解释或翻译成计算机能够识别的“计算机语言”,然后计算机就可以“听得懂”你的话了,并会按照你的吩咐去做事了。
因此,编程实际上也就是“人给计算机出规则”这么一个过程。 随计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。
电脑每做的一次动作,一个步骤,都是按照已经用计算机语言编好的程序来执行,程序是计算机要执行的指令的 *** ,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。
计算机所能识别的语言只有机器语言,即由构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。
目前通用的编程语言有两种形式:汇编语言和高级语言。 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。
它同样需要编程者将每一步具体的操作用命令的形式写出来。 汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。
高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。
由于省略了很多细节,所以编程者也不需要具备太多的专业知识。 高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。
(1)解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不局燃能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。 (2)编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。
但应用程序一旦需要修改,必须先桐郑虚修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如Visual Basic、Visual C++、Visual Foxpro、Delphi等。
这个问题其实很简单。前面我们讲到,程序是人与计算机进行沟通的唯一方式,因此我们要让计算机为我们服务,就必须有程序,而程序从哪里来?当然是由我们编写出来了。
或许你又会问到另一个问题:现在要什么程序有什么程序, *** 嘛还要编程呢?这你就错了,现在的程序虽然很多,需要什么样的程序直接到网上不需要很长时间就可以找到类似的,而且有可能就是你所需要的。但是,就好比去买衣服,虽然卖衣服的到处都是,但是哪一件是为你“量身定做”的呢! 程序还能够做很多事情不同的程序可以完成不同的。
2.科普小知识资料有哪些
科普小知识按研究对象不同可分为自然科学、社会科学和思维科学。
1、自然科学是关于自然现象的各门具体科学,研究自然界的本质和规律。
例如,数学、物理学、化学、天文学、地理学、生物学等等。
2、社会科学是关于社会现象的各门具体科学、力求揭示社会的本质和规律。
例如,经济学、政治学、军事学、社会学、管理学、教育学等等。
3、人文科学是关于人类文化现象的各门具体科学、力求揭示社会文化领域的本质和规律。
例如,语言学、历史学、考古学、伦理学、美学、宗教学等等。
科学知识普及简称科普,又称大众科学或者普及科学,是指利用各种传媒以浅显的、让公众易于理解、接受和参与的方式向普通大众介绍自然科学和社会科学知识、推广科学技术的应用、倡导科学方法、传播科学思想、弘扬科学精神的活动。科学普及是一种社会教育。
参考资料
科学的分类.360个人图书馆[引用时间2018-4-4]
3.计算机编程入门
选择一门编程语言、建立基本的编程思想、注重实验和学习相关知识。
1、选择一门编程语言。
虽然目前编程语言有600种左右,但是比较流行的编程语言只有几十种,所以尽量选择流行程度比较高的编程语言来入门编程。对于没有明确编程场景的初学者来说,尽量选择全场景编程语言,比如Java、Python、C#等就是不错的选择,不仅应用范围广泛,而且也有大量的开发案例可以参考学习。
2、建立基本的编程思想。
编程语言本身的难度并不高,只要掌握了相应的编程规则就能逐渐建立起自己的编程思想。建立编程思想的第一步是了解编程语言的基本语法规则,以Java语言为例,要掌握各种抽象概念,比如类、对象、属性、方法等;第二步是了解基本的编程过程,比如类的定义、对象的创建、方法的调用;第三步是学习经典的编程模式。
3、注重实验。
学习编程语言一定要重视实验,实验不仅能够帮助理解各种抽象概念,也能在一定程度上积累编程经验。
4、学习相关知识。
在学习编程语言的过程中,也需要同时学习计算机网络、数据库等相关知识,在当前的云计算和大数据时代背景下,还需要掌握如何通过云计算(PaaS)来辅助开发,以及如何利用大数据平台的各种资源。
(3)编译算法简化计算吗扩展阅读
注意事项:
1、网上有很多编程社区,编程论坛,以及免费的学习教程、视频资源等。刚开始学习,除了看书,要亲自上手实践,遇到问题去这些地方查找。
2、要学习电脑编程,对于刚入门的新手来说,一定要多实践,多敲代码,遇到bug上网查找,多看看别人的博客、个人网站,向程序员大牛学习。
4.计算机的科学、学问除了编程一大方面还有哪几个方面
计算机的科学?与计算机有关的学科有:计算机科学,数学,计算机程序设计,软件工程,计算机工程等。
如你所说的微电子学,电学等都是以上学科的基础性课程。如学数字电子技术(或称计算机逻辑),再学计算机组成与结构,再学微机原理接口,学具体的微机(MCU,DSP)。
课程都是一门承接着一门的。以下可做参考:硬件 结构控制和指令系统 算法和逻辑结构 存储器结构 冯·诺伊曼结构 哈佛结构 输入/输出和数据通信 数字逻辑 逻辑设计 集成电路 计算机系统组织 计算机系统结构 计算机网络 分布式计算 网络安全 计算机系统实现 软件 系统软件 操作系统 编译器 应用软件 计算机游戏 办公自动化 网络软件 CAD软件 计算机程序 程序设计和程序设计实践 面向对象技术 程序设计语言 软件工程 软件复用 驱动程序 计算机模拟 程序设计方法学 数据和信息系统 数据结构 数据存储表示 数据加密 数据压缩 编码与信息论 文件 信息系统 管理信息系统 决策支持系统 - 专家系统 数据库 信息存储和数据存取 信息交互与表达 主要的研究领域 形式化基础 逻辑学 谓词逻辑 模态逻辑 时序逻辑 描述逻辑 数学 泛代数 递归论 模型论 概率论和数理统计 逻辑代数 布尔代数 离散数学 组合数学 图论 网论 信息论 理论计算机科学 形式语言 自动机 可计算性 算法 计算复杂性 描述复杂性 编译器 程序设计理论 信息论 类型理论 指称语义 微程序 遗传算法 并行计算 计算方法学 人工智能 计算机图形学 图像处理与计算机视觉 模式识别 语音识别 文字识别 签名识别 人脸识别 指纹识别 仿真与建模 数字信号处理 文档与文本处理 计算机应用 数值计算 数值分析 定理机器证明 计算机代数 工程计算 计算机化学 计算机物理 生物信息论 计算生物学 非数值计算 工厂自动化 办公室自动化 人工智能 信息存储与检索 符号语言处理 计算机辅助科学 计算机辅助设计 计算机辅助教学 计算机辅助管理 计算机辅助软件工程 机器人学 多媒体技术 人机交互 电子商务 特定技术 测试基准 机器视觉 数据压缩 软件设计模式 数字信号处理 文件格式 信息安全 国际互联网络 超大规模集成电路设计 网络传输协议 网络处理器技术 整数运算器 浮点运算器 矩阵运算处理器 网格 计算科学史 计算机历史 软件业历史 编程思想。
5.科普小知识的内容是什么
科普小知识的内容是什么?
科普知识是一种用通俗易懂的语言,来解释种种科学现象和理论的知识文字。用以普及科学知识为目的。
科普知识涵盖了科学领域的各个方面,无论是物理、化学、生物各个学科,还是日常生活无不涉及到科普知识。由于其范围的广泛性,奠定了科普知识的重要意义和影响。科普知识的重要意义必然要求我们的科普教育必须与时俱进的与我们所提倡的素质教育同行。同步发展。使科普知识,科普教育真正意义上走进人们的生活。科普知识的意义和影响必将是深远的、长久的。
这里举两个例子:
1.为甚么星星会一闪一闪的?
我们看到星闪闪,这不是因为星星本身的光度出现变化,而是与大气的遮挡有关。
大气隔在我们与星星之间,当星光通过大气层时,会受到大气的密度和厚薄影响。大气不是绝对的透明,它的透明度会根据密度的不同而产生变化。所以我们在地面透过它来看星星,就会看到星星好像在闪动的样子了。
2. 为甚么人会打呵欠?
当我们感到疲累时,体内已产生了许多的二氧化碳。当二氧化碳过多时,必须再增加氧气来平衡体内所需。因为这些残留的二氧化碳,会影响我们身体的机能活动,这时身体便会发出保护性的反应,于是就打起呵欠来。
打呵欠是一种深呼吸动作,它会让我们比平常更多地吸进氧气和排出二气化碳,还做到消除疲劳的作用呢。
……
6.科普小知识
科学知识
1白天,鸟儿们在枝头穿梭呜叫,在蓝天下自由飞翔,到了晚上,它们和我们人一样也要休息、睡觉,恢复体力,不过它们睡觉的姿势可是各不相同的。
2冰糕冒气是因为外界空气中有不少眼睛看不见的水汽,碰到很冷的冰糕时,一遇冷就液化成雾滴包围在冰糕周围,看上去似乎是冰糕在“冒气”一样。
3向日葵的茎部含有一种奇妙的植物生长素。这种生长素非常怕光。一遇光线照射,它就会到背光的一面去,同时它还 *** 背广义面的细胞迅速繁殖,所以,背光的一面就比向光的一面生长的快,使向日葵产生了向旋光性弯曲。
4蝉的外壳(外骨骼)是坚硬的,不能随着蝉的生长而扩大,当蝉生长到一定阶段时,蝉的外骨骼限制了蝉的生长,蝉将原有的外骨骼脱去,就是蝉蜕。
5蜂先把采来的花朵甜汁吐到一个空的蜂房中,到了晚上,再把甜汁吸到自己的蜜胃里进行调制,然后再吐出来,再吞进去,如此轮番吞吞吐吐,要进行100~240次,最后才酿成香甜的蜂蜜
6我们看到星闪闪,这不是因为星星本身的光度出现变化,而是与大气的遮挡有关。大气隔在我们与星星之间,当星光通过大气层时,会受到大气的密度和厚薄影响。大气不是绝对的透明,它的透明度会根据密度的不同而产生变化。所以我们在地面透过它来看星星,就会看到星星好像在闪动的样子了。
7当我们感到疲累时,体内已产生了许多的二氧化碳。当二氧化碳过多时,必须再增加氧气来平衡体内所需。因为这些残留的二氧化碳,会影响我们身体的机能活动,这时身体便会发出保护性的反应,于是就打起呵欠来。打呵欠是一种深呼吸动作,它会让我们比平常更多地吸进氧气和排出二气化碳,还做到消除疲劳的作用呢。
8蛇的身上有很多鳞片,这是它们身上最外面的一层盔甲。鳞片不但用来保护身体,还可以是它们的“脚”。蛇向前爬行时,身体会呈S形。而每一片在S形外边的鳞片,都会翘起来,帮助蛇前进时抓住不平的路面。这些鳞片跟蛇的肌肉互相配合,并能推动身体向前爬行,所以蛇没有脚也可以走动呀!
9我们的头发中有一种叫“黑色素”的物质,黑色素愈多头发的颜色便愈黑。而黑色素少的话,头发便会发黄或变白。人类到了老年时,身体的各种机能会逐渐衰退,色素的形成亦会愈来愈少,所以头发也会渐渐变白啊
10当别人搔自己时,我们会倍感痕痒,而且不断大笑;可是,当自己搔自己的时候,我们不单不会大笑,而且更不感痕痒。基于我们的思想上已有了准备,大脑会发出一种 “不会有危险”的讯息,神经亦随之放松,所以便不会大笑起来和感到痕痒了!
11望向大海,很多时也发现海水呈现蓝、绿色。可是,当你把海水捞起时,你却只能看到它像往日的水般,透明无色。原来,海水本身与我们日常所接触到的水没有大分别,也是透明的。我们所看到的绿色,其实是海水对光吸收能力而产生出来的现象。只有绿光能被海水吸收,从而反射出来;当海水更深时,绿光也被吸收,海水看上去便成了蓝色。
12我们的皮肤表面长着汗毛,而每一个毛孔下都有一条竖毛肌,当受到神经 *** (例如:生气、害怕、受凉等情况)后,身体的温度会下降,而竖毛肌便会收缩而令毛发竖立起来,形成鸡皮疙瘩。除了有着保温的作用外,这个生理系统亦可使动物的体型看起来比实际更大,从而吓退敌人
7.科学小知识大全
科学小知识 冰糕为什么会冒气? 冰糕冒气是因为外界空气中有不少眼睛看不见的水汽,碰到很冷的冰糕时,一遇冷就液化成雾滴包围在冰糕周围,看上去似乎是冰糕在“冒气”一样。
向日葵为什么总是向着太阳? 向日葵的茎部含有一种奇妙的植物生长素。这种生长素非常怕光。
一遇光线照射,它就会到背光的一面去,同时它还 *** 背光一面的细胞迅速繁殖,所以,背光的一面就比向光的一面生长的快,使向日葵产生了向光性弯曲。 蝉为什么会蜕皮? 蝉的外壳(外骨骼)是坚硬的,不能随着蝉的生长而扩大,当蝉生长到一定阶段时,蝉的外骨骼限制了蝉的生长,蝉将原有的外骨骼脱去,就是蝉蜕。
蜜蜂怎样酿蜜? 蜂先把采来的花朵甜汁吐到一个空的蜂房中,到了晚上,再把甜汁吸到自己的蜜胃里进行调制,然后再吐出来,再吞进去,如此轮番吞吞吐吐,要进行100~240次,最后才酿成香甜的蜂蜜。
4. 什么是编译原理
问题一:什么是编译原理 编译:就是将程序语言进行翻译,生成可供用户直接执行的二进制代码,即可执行文件。
任务是个比较模糊的概念,指的是操作系统中正在进行的工作,既可以指进程,也可以指程序春坦灶。
程序指的是可以连续执行,并能够完成一定任务的一条条指令的 *** 。
进程是程序在一个数据 *** 上运行的过程,它是传统操作系统进行资源分配和调度的一个独立单位。
线程是一个指令执行序列,是操作系统调度的最小单位。一个或多个线程构成进程,构成一个进激的线程之间共享资源。进程和线程之间的最大区别就是线程不能独立拥有资源,进程拥有自己的资源。
问题二:编译原理中V*是什么意思 V是一个符号 *** ,假设V指的是三个符号a, b, c的 *** ,记为 V = {a, b, c }
V* 读作“V的闭包”,它的数学定义是V自身的任意多次自身连接(乘法)运算的积,也是一个 *** 。
也就是说,用V中的任意符号进行意多次(包括0次)连接,得到的符号串,都是V*这个 *** 中的元素。
0次连接的结果是不含任何符号的空串,记为 ε
1次连接就是只有一个符号的符号串,比如,a,b, c
2次连接是两个符号构成的符号串,比如,aa, ab, ac, ba, bb, bc,等等
……
n次连接是一个长度为n、由a、b、c三个符号构成的符号串,比如abaacbbac……
因此,V*包含一切由a,b,c三个符号连接而成的、任意长度的符号串(以及空串ε)
问题三:编译原理 V+什么意思,例如下面的例子。。。 v表示终结符和非终结符 *** 。
+表示 *** 中的一个或多个元素构成的串的 *** 。
所以v+表示由一个或多个终结符或非终结符构成的串的 *** 。比如如果a∈VT,A∈VN,那么a,A,aA,Aa,aAA,AaA等都是v+中的元素。
问题四:谁能够解释下编译原理中什么是FIRSTVT,和LASTVT,尽量浅显易懂点谢谢 Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的那个)。
然后要注意他们可都是终结符的 *** 。
Firstvt
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
攻 A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt
问题五:编译原理 什么是语义分析 在编译原理中,语法规则和词法规则不同之处在于:规则主要识别单词,而语法主要识别多个单词组成的句子。词法分析信孝和词法分析程序:词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用lex等工具自动生成。语法分析(Syntax *** ysis或Parsing)和语法分析程序(Parser) 语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分扒扮析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语义分析(Syntax *** ysis) 语义分析是编译过程的一个逻辑阶段. 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查.语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配.
问题六:编译原理中,(E)是什么意思? E→(E)? 10分 就是 字符本身 意思是F产生( E ) 或者 i 比如If语句的开头 就是 带括号的 必须是 if(表达式)这样的形式 丢了任何即括号就是其 终结符 “(” 和 “)”.
问题七:大家觉得对编译器及编译原理需要掌握到一个什么程度 我跟你说,编译原理太有用了。
我是做手机游戏的,现在做一个游戏引擎。既然是引擎,就需要提供抽象的东西给上层使用。这里,我引入了脚本系统。
这个脚本系统包括一堆我根据实际需求自行设计的指令集,包括基本的输入输出,四则运算,系统功能调用,函数声明,调用等等(其实你要是用过lua或者其他游戏脚本你就知道了。)整个结构包括指令集、编译器、虚拟机等部分。这样,引擎提供一些基础服务,比如绘图,计算位置等,脚本就可以非常简单控制游戏。甚至快速构建新游戏。你应该知道QUAKE引擎吧?
这里提供给你一个计算器的小程序,应用了EBNF理论,支持表达式,比如(2+3*6)*4+4,你自己体验一下它的简洁和强大。
/*
simple integer arithmetic calculator according to the EBNF
-> {}
->+|-
->{}
-> *
-> ( )| Number
Input a line of text from stdin
Outputs Error or the result.
*/
#include
#include
#include
char token;/*global token variable*/
/*function prototypes for recursive calls*/
int exp(void);
int term(void);
int factor(void);
void error(void)
{
fprintf(stderr,Error\n);
exit(1);
}
void match(char expectedToken)
{
if(token==expectedToken)token=getchar();
else error();
}
main()
{
int result;
token = getchar();/*load token with first character for lookahead*/
result = exp();
if(token=='\n')/*check for end of line */
printf(Result = %d\n,result);
else error();/*extraneous cahrs on line*/
return 0;
}
int exp(void)
{
int temp = term();
while((token=='+')||(token=='-'))
switch(token)
{
case '+':
match('+');
temp+=term......>>
问题八:编译原理中,自动机究竟是什么. 形式语言
形式语言 是一个字母表上的某些有限长字串的 *** 。一个形式语言可以包含无限多个字串。
语言的形式定义
字母表 ∑ 为任意有限 *** ,ε 表示空串, 记 ∑ 0 为{ε},全体长度为 n 的字串为 ∑ n , ∑ * 为 ∑ 0 ∪∑ 1 ∪…∪∑ n ∪…, 语言 L 定义为 ∑ * 的任意子集。
注记:∑ * 的空子集 Φ 与 {ε} 是两个不同的语言。
语言间的运算
语言间的运算就是 ∑ * 幂集上的运算。
字串 *** 的交并补等运算。
连接运算:L 1 L 2 = { xy | x 属于L 1 并且 y 属于L 2 }。
幂运算:L n = L … L (共 n 个 L 连接在一起),L 0 = {ε}。
闭包运算:L * = L 0 ∪L 1 ∪…∪L n ∪…。
(右)商运算:L 1 /L 2 = {x | 存在 y 属于L 2 使得 xy 属于L 1 }。
语言的表示方法
一个形式语言可以通过多种方法来限定自身,比如:
枚举出各个字串(只适用于有限字串 *** )。
通过 形式文法 来产生(参见 乔姆斯基谱系 )。
通过正则表达式来产生。
通过某种自动机来识别,比如 图灵机 、 有限状态自动机 。
自动机
automata
对信号序列进行逻辑处理的装置。在自动控制领域内,是指离散数字系统的动态数学模型,可定义为一种逻辑结构,一种算法或一种符号串变换。自动机这一术语也广泛出现在许多其他相关的学科中,分别有不同的内容和研究目标。在计算机科学中自动机用作计算机和计算过程的动态数学模型,用来研究计算机的体系结构、逻辑操作、程序设计乃至计算复杂性理论。在语言学中则把自动机作为语言识别器,用来研究各种形式语言。在神经生理学中把自动机定义为神经网络的动态模型,用来研究神经生理活动和思维规律,探索人脑的机制。在生物学中有人把自动机作为生命体的生长发育模型,研究新陈代谢和遗传变异。在数学中则用自动机定义可计算函数,研究各种算法。现代自动机的一个重要特点是能与外界交换信息,并根据交换得来的信息改变自己的动作,即改变自己的功能,甚至改变自己的结构,以适应外界的变化。也就是说在一定程度上具有类似于生命有机体那样的适应环境变化的能力。
自动机与一般机器的重要区别在于自动机具有固定的内在状态,即具有记忆能力和识别判断能力或决策能力,这正是现代信息处理系统的共同特点。因此,自动机适宜于作为信息处理系统乃至一切信息系统的数学模型。自动机可按其变量集和函数的特性分类,也可按其抽象结构和联结方式分类。主要有:有限自动机和无限自动机、线性自动机和非线性自动机、确定型自动机和不确定型自动机、同步自动机和异步自动机、级联自动机和细胞自动机等。
这可能有你想要的答案
./question/7218281?fr=qrl3
问题九:编译原理中"(E)"表示什么 字符( 表达式 字符)
5. 请问编译原理的词法分析用C语言编写的算法是怎样的
ε只能出现在NFA中,当然不是为了方便直观,而是连通NFA和DFA的桥梁。编译原理讲授的不是如何绘制NFA或者DFA,二是告诉读者怎样能够自动实现NFA或DFA的构造。在实际应用中ε可以帮助计算机转换NFA为DFA,而在属性文法和语法制导阶段,它也是沟通综合属性与继承属性、执行语义动作不可或缺的一部分。另外ε的使用可以大大简化文法产生式的构造难度。我记得最初使用ε是为了使得文法体系(字母表)更加完善,但是在实际应用中却变得应用广泛(此观点不一定正确)。 最后想说的是,在编译中,ε也带来了不小的麻烦,否则也就不会有诸如“去空产生式”这样的算法了:)
采纳哦