❶ 反编译原理是什么
反编译的流程,就是虚拟一个执行环境,看程序执行了那些指令,翻译成相应的语句一般的流程是先把程序调入到数据段,虚拟运行环境,一般这分配文件头部,从纪录指令程序数据段,载入到虚拟环境中,纪录指令,遇到跳转指令,压入栈,形成树结构(看数据结构),遍历每个节点的指令。形成完整程序。
❷ C语言编译原理是什么
编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。
1、预处理阶段:
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)
2、汇编阶段:
插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。
3、编译阶段:
将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。
4、链接阶段:
在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。
❸ 编译原理简单吗
编译原理主要是讲了编译器的实现。
那什么是编译器呢?
编译器就是将 源程序→编译器 →目标机器代码的程序
本文将用一段最简单的代码进行说明
1 + 2 + 3
第一步. 词法分析
当代码从文件中被读入到编辑器时,将会进行词法分析
示例中的代码最终会转换为(下面为伪代码)
1 ADD 2 ADD 3
第二步. 语法分析
这一步编译器将会把词法分析的结果转换成AST(abstract syntax tree, 抽象语法树)
所有的操作数将会作为子节点,所有的操作符将会作为父节点。(不知道的同学可以看一下树的生成)
1 + 2 + 3 对应的树
3. 生成目标代码
对上面的树进行后序遍历,将会得到下面的伪代码
((1 2 +) 3 +)
生成的汇编伪代码为
START:
MOV VALUE, 0//初始化结果为0
ADD VALUE, 1
ADD VALUE, 2//(1 2 +)的汇编伪代码
ADD VALUE, 3
RET VALUE
END
最终汇编代码会被编译成机器代码,在计算机上执行。
下面为一般情况下的编译流程
1. 词法分析(生成代码对应的token序列,使用正则表达式)
2. 语法分析(生成AST)
3. 语义分析(对代码的语法进行检查)
4. 代码生成(生成可执行的代码)
❹ 谁有编译原理的课设啊需要有if while dowhile指令 翻译成汇编程序 谢谢啦!!!
楼主下一个VC++吧,你给你要翻译的地方 按F9 下断点,然后F7 F5运行到那里就会停下来,你右键代码,有个 go to dis什么的,点一下就是汇编代码啦。当然前提是 你已经写好了你要翻译的代码
❺ 汇编(编译原理)中的mov指令和一般程序代码中的意思是反...
汇编(编译原理)中的mov指令和一般程序代码中的意思是反...
听错了。
6.送你一朵玫瑰花,传情达意全靠它,送你一朵大桃花,时来运转有赖它,送你一碗豆腐花,要你一天到晚笑哈哈!
❻ 编译原理学了有什么用
对大多数人来说,学过编译原理,应该可以知道对于很多代码的优化,编译器其实可以做好,不需要自己写代码的时候杞人忧天。在通用、局部的优化上,甚至编译器往往做得比程序员好。
大概率会意识到编译原理背后的故事,也许会沉迷在某个方向,也许还会乐于看一些奇妙的parser构建方式。
大概还可能会去学习类型系统,发现形式化的故事似乎在很多方面都有对应的版本,而后,他们也许会尝试走向研究,去挑战目前都没有好好解决的代码优化问题,也许会走向应用,用起LLVM,在上面加个target,支持一些新硬件,做个新语言的前端等。
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。
编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。
编译可以分为五个基本步骤:词法分析、语法分析、语义分析及中间代码的生成、优化、目标代码的生成。这是每个编译器都必须的基本步骤和流程, 从源头输入高级语言源程序输出目标语言代码。
1、词法分析
词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描, 逐个字符地读, 识别出每个单词符号, 识别出的符号一般以二元式形式输出, 即包含符号种类的编码和该符号的值。
词法分析器一般以函数的形式存在, 供语法分析器调用。当然也可以一个独立的词法分析器程序存在。完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
2、语法分析
语法分析是编译过程的第二个阶段。这阶段的任务是在词法分析的基础上将识别出的单词符号序列组合成各类语法短语, 如“语句”, “表达式”等.语法分析程序的主要步骤是判断源程序语句是否符合定义的语法规则, 在语法结构上是否正确。
而一个语法规则又称为文法, 乔姆斯基将文法根据施加不同的限制分为0型、1型、2型、3型文法, 0型文法又称短语文法, 1型称为上下文有关文法, 2型称为上下文无关文法, 3型文法称为正规文法, 限制条件依次递增。
3、语义分析
词法分析注重的是每个单词是否合法, 以及这个单词属于语言中的哪些部分。语法分析的上下文无关文法注重的是输入语句是否可以依据文法匹配产生式。
那么, 语义分析就是要了解各个语法单位之间的关系是否合法。实际应用中就是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查等。
4、中间代码生成与优化
在进行了语法分析和语义分析阶段的工作之后, 有的编译程序将源程序变成一种内部表示形式, 这种内部表示形式叫做中间语言或中间表示或中间代码。
所谓“中间代码”是一种结构简单、含义明确的记号系统, 这种记号系统复杂性介于源程序语言和机器语言之间, 容易将它翻译成目标代码。另外, 还可以在中间代码一级进行与机器无关的优化。
5、目标代码的生成
根据优化后的中间代码, 可生成有效的目标代码。而通常编译器将其翻译为汇编代码, 此时还需要将汇编代码经汇编器汇编为目标机器的机器语言。
6、出错处理
编译的各个阶段都有可能发现源码中的错误, 尤其是语法分析阶段可能会发现大量的错误, 因此编译器需要做出错处理, 报告错误类型及错误位置等信息。
❼ 关于编译原理的问题
1.当然是机器语言了,如果是汇编指令,那还得编译一次!能运行的程序都是机器语言,只有机器语言才能控制CPU,NET或Java这些中间语言,程序在运行时会被CLR或JVM快速编译成机器语言,因此这些程序速度上有损失。
高级语言源代码(文本)-通过编译器(compiler)-程序(二进制机器语言)
汇编代码(文本)-通过汇编器(assembler)-程序(二进制语言)
看到这里,你可能会想那汇编语言到底有什么用呢,编译器完全能代替汇编啊?
(1).编译器是通过高级语言(c,c++)转到机器语言的。转换过的机器语言受限与高级语言,效率和功能上都有限制。比如c不等过分操作内存。但通过汇编器转化过来的机器语言,效率高,且用汇编语言,直接和CPU对话!
(2).汇编可以反汇编(逆向编译),而这里高级语言没有发言权,就是:
程序(二进制机器语言)-通过反汇编器(compiler)-可转化为汇编代码(文本)
但永远不能转化为高级语言的源代码,。
以上两点汇编存在的重要性。
2。当然是说移植源代码。windows用x86机器语言,苹果用powerPC机器语言,windows程序当然不能运行在苹果机上,因为程序其实就是一串机器语言!但windows上有c的编译器(vc++),苹果机上也有c编译器(gcc),因此同一个c的源代码,当然就可以通过不同平台的同一种编译器实现平台移植。
3.当然是NASM,我看的所有书都首先说NASM,他是开源的,就像Linux一样,很受欢迎,还有MASN是微软的,borland的也有汇编器,不过都不常见了。
4.这跟CPU有关,一般32位x86兼容的cpu有许多寄存器,多数是32位的,也有16位的。比如CS,ES,DS这些segment寄存器一直是16位的。
5.优势太多了,这和32位和16位存在的优势一样,16位电脑最大内存1MB,寄存器都是16位的。32位,最大内存可以有4GB,整整是16位的4096倍啊!16位多渺小啊,同理64位基本上也可以蔑视32位,64内存最大内存用TB来衡量,寄存器多数是64位!地址总线也是64位。64对32位没有什么优势劣势可言,64位完全就是32位的下一代。
❽ 编译原理的相关程序
解释程序(interpreter):解释程序是如同编译器的一种语言翻译程序。它与编译器的不同之处在于:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。从原理上讲,任何程序设计语言都可被解释或被编译,但是根据所使用的语言和翻译情况,很可能会选用解释程序而不用编译器。例如, 我们经常解释BASIC语言而不是去编译它。类似地,诸如LISP 的函数语言也常常是被解释的。
解释程序也经常用于教育和软件的开发,此处的程序很有可能被翻译若干次。而另一方面,当执行的速度是最为重要的因素时就使用编译器,这是因为被编译的目标代码比被解释的源代码要快得多,有时要快10倍或更多。但是,解释程序具有许多与编译器共享的操作,而两者之间也有一些混合之处。 代码生成(code generator):代码生成器得到中间代码(IR),并生成目标机器的代码。正是在编译的这个阶段中,目标机器的特性成为了主要因素。当它存在于目标机器时,使用指令不仅是必须的而且数据的形式表示也起着重要的作用。例如,整型数据类型的变量和浮点数据类型的变量在存储器中所占的字节数或字数也很重要。在上面的示例中,现在必须决定怎样存储整型数来为数组索引生成代码。例如,下面是所给表达式的一个可能的样本代码序列(在假设的汇编语言中):
M O V R0,index ;;
value of index -> R0 M U L R0,2 ;;
double value in R0 M O V R1,&a ;;
address of a -> R1 A D D R1,R0 ;;
add R0 to R1 M O V *R1,6 ;;
constant 6 -> address in R1
在以上代码中,为编址模式使用了一个类似C的协定,因此& a是a的地址(也就是数组的基地址),* R1则意味着间接寄存器地址(因此最后一条指令将值6存放在R1包含的地址中)。这个代码还假设机器执行字节编址,并且整型数占据存储器的两个字节(所以在第2条指令中用2作为乘数)。 目标代码(target code optimizer ):在这个阶段中,编译器尝试着改进由代码生成器生成的目标代码。这种改进包括选择编址模式以提高性能、将速度慢的指令更换成速度快的,以及删除多余的操作。在上面给出的样本目标代码中,还可以做许多更改:在第2条指令中,利用移位指令替代乘法(通常地,乘法很费时间),还可以使用更有效的编址模式(例如用索引地址来执行数组 存储)。使用了这两种优化后,目标代码就变成:
MOV R0,index ;;
value of index -> R0 SHL R0 ;;
double value in R0 MOV &a[R0],6 ;;
constant 6 -> address a + R0
到这里就是编译原理的简要描述,但还应特别强调编译器在其结构细节上差别很大。
❾ 编译和汇编的区别是什么
1.定义区别
①编译原理旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
②汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
2.处理方式区别
①编译过程与解释挺像,区别就在于编译是将所有的源代码指令一次性成翻目标代码并执行。
②汇编过程就是把汇编指令一对一地翻译成01机器码的过程。而采用这种处理方式的语言只有一类:汇编语言。
3.特点区别
①编译语言的特点就是不需要解释器的参与,所以运行比较快,但是编译好的程序只能在当前平台运行,是个局限性。
②汇编语言是当今世界上历史最早,应用最广,功能最强大,运行速度最快的编程语言。但是汇编语言开发工期长,可读性差,并且不能跨平台编程。
❿ 编译原理的基本概念
编译器 是将汇编或高级计算机语言翻译为二进制机器语言代码的计算机程序。编译器将源程序(source language) 编写的程序作为输入,翻译产生目标语言(target language )机器代码的等价程序。通常地,源程序为高级语言(high-level language ),像C或C + +、汉语语言程序等,而目标则是机器语言的目标代码 (object code,有时也称作机器代码(machine code )),也就是可以在计算机硬件中运行的机器代码软件程序。这一过程可以表示为:
源程序→编译器 →目标机器代码程序