导航:首页 > 源码编译 > 两级编译技术

两级编译技术

发布时间:2025-03-02 11:06:25

‘壹’ 反汇编和反编译的区别

反编译和反汇编是软件逆向工程中常用的两种技术,它们在定义、目的、实现方式以及精度上有所不同。

反编译(Decompilation)是指将已编译的二进制文件转换成高级语言的源代码,这样便于理解程序的结构和逻辑,并进行相应的分析和修复。

反汇编(Disassembly)则是将二进制文件转换成汇编代码的过程,通过这种方式,可以更好地理解程序的执行过程和指令序列,并进行相应的分析和修复。

反编译通常需要使用特定的反编译工具,这些工具能够解析二进制文件的结构和逻辑,然后将其转换为高级语言源代码。而反汇编则通常通过反汇编工具进行操作,这些工具能够将二进制文件转换为汇编代码,并且可以进一步将其转换为C语言代码或者其他高级语言代码。

反编译的精度取决于反编译工具的算法和实现,以及原始程序的结构和逻辑。有些特定的结构和逻辑可能无法被正确地反编译出来。反汇编的精度则主要取决于反汇编工具的算法和实现,以及汇编代码的结构和逻辑。通常来说,反汇编的精度会比反编译高一些,因为汇编代码更加直观和可读。

总结起来,反编译和反汇编的主要区别在于它们生成的代码类型以及处理的对象。反编译生成的是高级编程语言的源代码,易于理解和阅读,但可能会丢失一些底层的细节。而反汇编生成的是汇编语言代码,分析难度较大,但能提供更加详细的信息。

‘贰’ 计算机等级如何分级的

设置的四个等级:

一级定位为满足人们在一般性工作中对计算机的应用,重点是操作能力的考核。

考核内容:一级MSOffice、一级WPSOffice、一级B。一级科目中操作系统版为Windows2000,MSOffice版为Office2000,WPSOffice版为2003.取消一级科目的纸笔考试,完全采取上机考试形式。

二级定位为计算机程序员,可谓“计算机蓝领”。考核内容:根据应用性质和科目特点,将现有科目分成语言程序设计(C、C++、java、VisualBasic)和数据库程序设计(VisualFoxpro、Access)两类。

二级所有科目的考试形式不变,仍包括笔试和上机考试两部分。二级各科目上机考试运行平台为:Access2000、JavaJDK1.4.0、VisualBasic6.0、VisualFoxpro6.0、TurboC2.0。

三级定位为“开发工程师”,重点在设计、管理、测试和技术。三级分为“PC技术”、“信息管理技术”、“数据库技术”、“网络技术”等四个类别,主要考核对应类别的应用系统的开发和维护的基本功能。

四级定位为“系统设计工程师和项目主管”。

报考等级:

一级:一级B、一级MSOffice、一级WPSOffice;

二级:二级C、二级C++、二级VB、二级VFP、二级JAVA、二级ACCESS;

三级:三级PC、三级信息管理技术、三级网络技术、三级数据库。

(2)两级编译技术扩展阅读:

一级证书表明持有人具有计算机的基础知识和初步应用能力,掌握文字、电子表格和演示文稿等办公自动化软件(MS Office、WPS Office)的使用及因特网(Internet)应用的基本技能,具备从事机关、企事业单位文秘和办公信息计算机化工作的能力。

二级证书表明持有人具有计算机基础知识和基本应用能力,能够使用计算机高级语言编写程序,可以从事计算机程序的编制、初级计算机教学培训以及企业中与信息化有关的业务和营销服务工作。

三级证书表明持有人初步掌握与信息技术有关岗位的基本技能,能够参与软硬件系统的开发、运维、管理和服务工作。

四级证书表明持有人掌握从事信息技术工作的专业技能,并有系统的计算机理论知识和综合应用能力。

注:NCRE 所有证书均无时效限制。

为适应新时期信息技术的发展,满足社会对人才培养的需求,自2018年3月起,执行2018版NCRE考试大纲。本次调整涉及NCRE一级到四级所有科目。

1、一级考试

新增“网络安全素质教育”科目(代码:17),考试时长90分钟,2018年9月首次开考。

2、二级考试

取消“Visual FoxPro数据库程序设计”科目(代码:27),2017年12月是其最后一次组考。

新增“Python语言程序设计”科目(代码:66),考试时长:120分钟,软件要求:Python 3.5.2 版本及以上 IDLE,2018年9月首次开考。

二级 C、C++两个科目应用软件由 Visual C++6.0改为 Visual C++2010 学习版(即 Visual C++ 2010 Express)。

3、三级考试

2018 年 3 月起暂停“软件测试技术”科目(代码:37)。

自 2018年3月考试起改变三级获证条件要求,考生只需通过三级考试即可获得该三级科目的合格证书,不再要求二级证书。

4、四级考试

暂停“软件测试工程师”科目(代码:43)。专业基础课程暂停软件工程(课程代码:405)。四级数据库工程师科目考试课程由“404、405”调整为“401、404”。

四级获证条件不变:通过四级科目的考试,并已经(或同时)获得三级相关证书。

‘叁’ V8编译生成的机器码究竟是什么

实际上V8的JIT编译器是直接在内存中生成机器码的,并不会先生成文本形式的汇编然后再使用汇编器去转换为机器码。“动态生成机器码”听起来可能有点玄乎,其实根本没啥,就是往内存里写字节,这些字节正好是某些机器码的意思,然后把这块内存当作函数去调用就是了。由于代码自身就是动态生成的,在生成的代码里直接嵌入resolve好的各种值其实就相当于传统编译流程里的“动态链接”的效果。顺手放俩我以前博客的传送门:V8实际上自带一个用C++实现的“汇编器库”用来动态生成机器码。它并不把文本形式的汇编转换为机器码,而是提供一组C++ API,调用这个API的函数就可以在内存里生成机器码来。有兴趣的同学可能会知道,V8的MacroAssembler库源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前辈。V8 Design Elements文档里所描述的是最初期的V8的状态。当时的V8只有一个JIT编译器,一个JavaScript函数通常只会被JIT编译一次。这个JIT编译器做的优化也不是很多。后来V8演化为拥有两个JIT编译器,一个初级编译器(baseline compiler,名字叫做Full Code Generator,简称FullCodeGen),和一个优化编译器(optimizing compiler,名字叫做Crankshaft),两个编译器结合在一次构成双层编译。JavaScript函数通常会先被FullCodeGen编译,然后如果还继续执行很多次的话则会再被Crankshaft重新编译一遍,生成更优化的代码。在这个架构中,FullCodeGen里生成的代码还是跟V8 Design Elements的相似,会通过inline cache来实现property access;而这些inline cache不但用于实现fast property access,更重要的是它们会被用于收集profile,然后等到Crankshaft编译的时候,它就可以看先前收集的profile来做profile-guided optimization。以这个 function foo(p) { return p.x } 为例,参数p没有任何特别的地方,所以JavaScript引擎也无法知道p到底可能有怎样的值。但通过FullCodeGen生成的代码所收集到的profile信息,Crankshaft再去编译 foo() 的时候就可以知道p之前通常指向一个Map(hidden class)为0x2c97ccb179d1的类型的对象。这个类型的constructor为Point、[[Prototype]] 为Point.prototype、对象里有足够空间容纳10个内嵌的字段(in-object property),并且其中2个slot被用于存储Smi类型,剩余的8个slot未被使用。

‘肆’ hotspot是较新的java虚拟机技术,用来代替jit技术,那么hots

“HotSpot”指的是一个具体的JVM实现,由Longview/Animorphic发展而来,被Sun/JavaSoft收购后成为Sun的Java SE主要JVM,后被Oracle接手。而“hot spot”则是一个更泛的概念,指执行频率高的代码,实现者可以根据选择将这个概念应用到方法或执行路径级别。

HotSpot VM以其混合模式执行引擎着称,包括解释器和自适应编译器。默认情况下,所有Java方法通过解释器执行。解释器会记录每个方法的调用次数和循环次数,以此判断方法的热度。一旦方法热度足够,HotSpot VM就会启动对该方法的编译。

自适应编译允许执行引擎在执行过的代码中选择一部分进行编译,通常通过多层结构实现:一层用于初始执行,另一层用于处理编译。这与JIT编译形成对比,JIT编译在代码首次执行时立即编译,确保所有执行过的代码都被编译过。

HotSpot VM的自适应编译与严格意义上的JIT编译相比,其编译时机更晚,编译代码数量也更少。两者都属于动态编译范畴,动态编译在程序运行时进行,而静态编译在程序开始运行之前完成。

尽管HotSpot VM不使用严格的JIT编译,而是通过解释器执行初始代码,但在现代实现中,JIT编译与自适应编译的概念仍在使用。例如,JRockit VM采用纯编译执行引擎,通过两次编译实现JIT编译与自适应编译的结合,而V8 JavaScript引擎通过两层编译架构实现相同的效果。这说明JIT编译与自适应编译可以共存,且在不同JVM实现中以不同形式呈现。

‘伍’ C语言文件的编译与执行的四个阶段并分别描述

采纳了加我不懂问我</b> 一 C编译过程概述 目前linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Mola-3和Ada等. Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。 使用GCC编译程序时,编译过程可以被细分为四个阶段:
◆ 预处理(Pre-Processing)
◆ 编译(Compiling)
◆ 汇编(Assembling)
◆ 链接(Linking) 二 编译过程中各种文件介绍 1.以扩展名区分文件类型.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。 2.LINUX目标文件描述 LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通用对象文件格式)、ELF(Executable and Linking Format 可执行和链接格式)。其中ELF是x86 Linux系统 下的一种常用目标文件(object file)格式,有三种主要类型: (1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。编译产生的.o文件就属于这类。
(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。这就是编译、链接之后形成的最终文件。
(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。这就是库文件,只指动态库文件。 详细了解请看本人收藏的《LINUX可执行文件分析》 三 编译过程详解 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下:
从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。 1. 编译过程 编译过程又可以分成两个阶段:编译和汇编。 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语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。 2. 链接过程 由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。

根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种: (1)静态链接 在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。 (2)动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。四 编译过程实例描述 linux中使用的gcc编译器把上述的几个过程集成,一个命令就能完成编译的整个过程。为了详细说明每个步骤,下面我们将分部执行。下图是gcc代理的编译过程
例程: 在linux下创建文件hello.c,内容如下,
#include <stdio.h>
int main(void)
{
printf ("Hello,everybody!\n");
return 0;
} ◆ 预处理(Pre-Processing)
使用-E参数可以让GCC在预处理结束后停止编译过程,对应的命令是cpp,
# gcc -E hello.c -o hello.i 用编辑器打开hello.i,可以看到stdio.h文件被展开到了hello.i中。 ◆ 编译(Compiling)
使用-S参数将hello.i编译为汇编程序,使用的命令是cc -S,
#gcc –S hello.i –o hello.s 用编辑器打开hello.s,显然已经变成了汇编代码。 ◆ 汇编(Assembling)
使用-c参数将hello.s编译为目标文件,对应的命令是as,
#gcc –c hello.s –o hello.o 可以利用工具readelf或者objmp读出hello.o的信息。 ◆ 链接(Linking) 产生可执行文件,利用命令ld
# gcc hello.o -o hello
利用readelf,可以看到hello.o和hello文件的区别。

‘陆’ RISC技术有什么特点

RISC的英文全称是Reced Instruction Set Computer,中文是精简指令集计算机,它的指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。其技术特点:

1、大多数指令在单周期内完成

2、采用LOAD/STORE结构。因为访问存储器指令所需要的时间比较长,在指令系统中要尽量减少这类指令,所以RISC指令中只保留不可再少的LOAD/STORE两种存储器访问指令

3、硬布线控制逻辑。使得大多数指令在单周期内执行完成,以减少为程序技术中的指令解释开销

4、减少指令和寻址方式的种类

5、固定的指令格式

6、译码优化

7、面向寄存器结构

8、注重提高流水线的执行效率,尽量让减少流水线断流,提高流水线效率

9、优化编译技术

(6)两级编译技术扩展阅读

RISC中的关键技术

1、延时转移技术

在RISC处理机中采用流水线工作方式,取指令和执行指令并行工作,那么当遇到条件转移指令时,流水线可能断流。为了尽量保证流水线的执行效率,在转移指令之后插入一条有效的指令,而转移指令好像被延时了,这样了技术即为延迟转移技术。通常指令序列的调整由编译器自动进行。需要注意的是:调整指令序列是不能改变原有程序的数据关系;被移动的指令不破坏机器的条件码。

2、指令取消技术

由于采用指令延迟技术中,遇到条件转移指令时,调整指令序列比较困难,采用了指令取消技术。所有转移指令和数据变换指令都可以决定待执行指令是否应该取消。为了提高执行效率,采用取消规则为:如果向后转移(转移的目标地址小雨当前程序计数器PC值),则转移不成功时取消下一条指令,否则执行下一条指令;如果向前转移,则相反,在转移不成功时执行下一条指令,否则取消。

3、重叠寄存器窗口技术

由于RISC的指令系统比较简单,通常采用一段子程序来实现。因此RISC中的CALL和RETURN非常多,而且都需要通过堆栈操作保存前一过程指针、数据等。为了尽量减少因为CALL和RETURN操作访问存储器的量,提出了重叠寄存器窗口技术。基本思想:在处理器中设置一个数量较大的寄存器堆,并划分成窗口。每个过程使用其中的三个窗口和一个公共窗口,而在这些窗口中有一个窗口式前一个过程公用的,还有一个窗口是与后一个过程共用。与前一过程公用的窗口可以用来存放前一过程传递被本过程的参数。

4、指令流水调整技术

为了保持指令流水线高效率,不断流,优化编译器必须分析程序的数据流和控制流。当发现指令有断流可能时,要调整指令顺序。有些可以通过变量重命名来消除的数据相关,要尽量消除。例如:
ADD R1,R2,R3; (R1)+(R2)->R3
ADD R3,R4,R5; (R3)+(R4)->R5
MUL R6,R7,R3; (R6)*(R7)->R3
MUL R3,R8,R9; (R3)*(R8)->R9
调整指令后
ADD R1,R2,R3;
MUL R6,R7,R0;
ADD R3,R4,R5;
MUL R0,R8,R9;
调整指令后,速度可以提高一倍。

5、硬件为主固件为辅

指令系统采用为程序实现的优点:便于实现复杂指令,便于修改指令系统,增加机器的灵活性,但是速度慢。所以RISC一般采用硬件为主固件为辅的方法实现指令。

阅读全文

与两级编译技术相关的资料

热点内容
ofo服务器波动是什么意思 浏览:524
app不见了怎么恢复华为 浏览:891
和家欢商城APP怎么样 浏览:49
嗷呜app怎么老师没有网络 浏览:51
域名如何划分阿里云服务器 浏览:971
程序员应会开发技术 浏览:853
pdf带链接 浏览:699
中兴手机加密失败怎么办 浏览:606
六大算法之三动态规划csdn 浏览:121
linux如何使用静态库 浏览:495
ubuntu安装驱动命令行 浏览:763
pdf修改字体大小 浏览:861
scrm源码下载 浏览:29
印尼孕妇溯源码燕窝的价钱 浏览:905
mel和python 浏览:758
vb背单词软件源码 浏览:801
epld和单片机 浏览:506
主力资金源码分析 浏览:574
怎么去掉pdf水印 浏览:767
北京边缘融合服务器云服务器 浏览:958