编译_编译器 - CSDN
  • 编译的基本概念

    2019-07-10 14:33:39
    CPU执行程序的原理这篇文章中提到,“程序要想被CPU执行,首先要被编译成CPU可以执行的指令操作”,那编译成CPU可以执行的指令操作是什么意思呢?这篇文章就用来说明编译的实际意义是什么。 2、知识背景——CPU架构...

    1、本文目的

    CPU执行程序的原理这篇文章中提到,“程序要想被CPU执行,首先要被编译成CPU可以执行的指令操作”,那编译成CPU可以执行的指令操作是什么意思呢?这篇文章就用来说明编译的实际意义是什么。

    2、知识背景——CPU架构

    要谈编译,首先要说说CPU架构的概念。CPU架构也就是CPU指令集(指令就是汇编指令或者机器指令,比如Add是汇编指令,而对应的机器指令在MIPS下就是000000)架构,现有CPU架构包括鼎鼎有名的Intel的X86架构、ARM的ARM架构、MIPS的MIPS架构、DEC的Alpha架构。通俗来说,指令集就是指挥CPU如何运算的硬程序,没有这套指令的话,就没有办法指挥CPU运转,而计算机的所有运算都需要CPU参与。

    那编译呢,也就是将一段程序转换为指令集的过程。不同架构的指令集自然是不同的,带来的影响就是同一段代码,编译过后只能运行在对应的指令集上,比如一段C++代码,在X86下编译完了,只能在X86下运行,而不能运行在ARM架构下运行。

    而事实上,编译得到的结果,更是操作系统相关的。假设,一段程序被编译成了X86下的硬程序,但是无法同时运行在Windows上和Linux上(Windows和Linux操作系统都可以装在X86架构的CPU上),如果程序一开始是在Windows操作系统下编译的,那这段程序就无法运行在其他比如Linux操作系统中。

    也就是说,编译与操作系统和CPU这二者都是相关的。

    3、编译过程

    事实上,仅仅将程序通过编译改写成汇编指令或机器指令,在操作系统上还不能直接运行。实际上广义的编译,其实包括预处理、编译、汇编、链接这整个过程。

    1. 预处理,就是把代码里引入的其他代码,插入到这段代码中,形成一个代码文件。
    2. 编译,就是把代码转化为汇编指令的过程,汇编指令只是CPU相关的,也就是说C代码和python代码,代码逻辑如果相同,编译完的结果其实是一样的。
    3. 汇编,就是把汇编指令转为机器码的过程,机器码可以被CPU直接执行。
    4. 链接,就是将一段我们需要的已经编译好的其他库,与我们的汇编结果连起来,这样才是最终程序完整的形式,操作系统才可以运行。不同操作系统编译好的其他库形式不同,而且链接的方式也不同,得到最终程序的形式也不同,所以编译好的程序只能在特定的操作系统下运行。
    展开全文
  • 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 预处理, 展开头文件/宏...

    楔子

    我们在各自的电脑上写下代码,得明白我们代码究竟是如何产生的,不想了解1,0什么的,但这几个环节必须掌握吧。

    我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。

     

    预处理, 展开头文件/宏替换/去掉注释/条件编译                      (test.i main .i)
    编译,    检查语法,生成汇编                                                      ( test.s  main .s)
    汇编,   汇编代码转换机器码                                                         (test.o main.o)
    链接     链接到一起生成可执行程序                                              a.out
     

    预处理

    预处理如锲子中所言,是一种展开,下表是常用的一些预处理命令

    还有下列几种预处理宏(是双下划线)

    __LINE__ 表示正在编译的文件的行号
    __FILE__表示正在编译的文件的名字__DATE__表示编译时刻的日期字符串,例如: "25 Dec 2007"
    __TIME__ 表示编译时刻的时间字符串,例如: "12:30:55"
    __STDC__ 判断该文件是不是定义成标准 C 程序
    我的vs2013不是定义的标准c语言

     

    宏函数很好用,是直接展开,在这我顺便说一下宏的好处和坏处。

    宏优点1代码复用性2提高性能

    宏缺点1 不可调试(预编译阶段进行了替换),2无类型安全检查3可读性差,容易出错。

    这里附上《c和指针》中的一张表格,总结宏和函数十分到位,我就不多说了

     

    宏函数很皮,#define定义一个比如判断大小,替换常量,很是方便。

    不过我现在也就用下,#define ERROR_POWEROFF -1,#define _CRT_SECURE_NO_WARNINGS 1这样的和编译器有关的东西,不会去写宏函数,宏函数这东西,可读性特别差,在c++中,一般用const/枚举/内联去替代宏。

    但是,define宏在某些方面真的是非常好用,我很推荐。

    1.替代路径

    #define ENG_PATH_1 C:\Program Files (x86)

    2.针对编译器版本不兼容报错

    #define _CRT_SECURE_NO_WARNINGS 1

    3.条件编译

    #ifdef 标识符
    程序段 1
    #else
    程序段 2
    #endif

    4.使用库中的宏

    vc++中有许多有意思的宏,都是大牛们写出来的,真的是充满智慧,十分刁钻,怎么学也学不完,我个人担心出错就很少写宏,用函数代替了。在以后的博客中我会记录一些常用的,充作笔记。

    emmm,当然,还有其他许多重要的预处理。

    比如

    include

    #include <filename>

    尖括号是预处理到系统规定的路径中去获得这个文件(即 C 编译系统所提供的并存放在指定的子目录下的头文件)。找到文件后,用文件内容替换该语句。如stdio.h

    #include“filename”

    “”则是预处理我们自己第三方的文件,如程序员小刘写的Date.h,我们就可以include“Date.h”

    #error 预处理,#line 预处理,#pragma 预处理

    #error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提示消息,并停止编译。

    这个我没写过,但碰到过很多次,在编写mfc代码中,拉入控件时我加入密码框控件,OS编译时会自动弹出#error 提示我该编辑框为密码,注意明文问题

    #line 的作用是改变当前行数和文件名称,如#line 28  liu 

    目前我没使其派上用场,但了解为好。

    #pragma 是比较重要且困难的预处理指令。

    #pragma once 

    这个的做用就是防止头文件多次包含

    当然,还有另外一种风格,防止被包含,我同时给出来

    是巧妙地利用了define宏

    #ifndef _SOME_H
    #define _SOME_H
    
    
    ...//(some.h头文件内容)
    
    
    #endif

    变量的防止重复定义则利用extern,在头文件中不初始化只声明。引用该头文件即可,在链接过程中。就可以使用到这个变量。

    (附:extern在c++中经常用于  extern "C"  告诉编译器下面是c语言风格)

    #pragma warning

    #pragma warning( disable : 4507 34; once : 4385; error : 164 )
    等价于:
    #pragma warning(disable:4507 34) // 不显示 4507 和 34 号警告信息
    #pragma warning(once:4385) // 4385 号警告信息仅报告一次
    #pragma warning(error:164) // 把 164 号警告信息作为一个错误。

    另外还有

    #pragma pack

    使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
    使用指令#pragma pack (),编译器将取消自定义字节对齐方式。
    在#pragma pack (n)和#pragma pack ()之间的代码按 n 个字节对齐。

    字节对齐,我将另起炉灶,在另外一篇博客中归纳总结。

     

    #pragma pack(push) //保存当前对其方式到 packing stack
    #pragma pack(push,n) 等效于
    #pragma pack(push)
    #pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按 n 字节对齐
    #pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐

    #运算符和##预算符

    #define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));

    这段代码中#就是帮助x作为一个变量,表现出来,而不是一个简单的字母

    如果有#,SQR(3)运算出来就是

    The square of 3  is 9

    如果没有# SQL(3)运算出来就是

    The square of x  is 9

    ##预算符

    ##把两个语言符号组合成单个语言符号

    编译

    编译阶段是检查语法,生成汇编,这个属于程序员的必备知识,我们学习一门语言第一步就是知晓语法,其中比较生涩的有左值右值,指针的使用,内存的管理,数据结构的使用,这将会是一场持久战 ,贯穿在整个学习生涯。

    在这里我截取优先级问题,这个可能会通过编译但是不一定达到程序员想要的结果。

    在这里,我引用《c语言深度解剖》中的一张表格

    汇编

      汇编代码转换机器码   这个阶段,非底层的程序员不需要考虑, 编译器不会搞错的。也与c/c++开发者无关,但是我们可以利用反汇编来调试代码,学习汇编语言依然是必备的。

    链接

    开头我引用一下百度百科的介绍

    静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

    动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

    将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。该可执行文件会变大很多,一般是调用自己电脑上的。

    静态库和应用程序编译在一起,在任何情况下都能运行,而动态库是动态链接,文件生效时才会调用。

    很多代码编译通过,链接失败就极有可能在静态库和动态库这出现了纰漏,要视情况解决。缺少相关所需文件,就会链接报错。这个时候就要检查下本地的链接库是不是缺损。

    展开全文
  • 编译实战视频教程

    2019-11-21 10:46:18
    本课程讲授一个真实编译器、链接器的完整开发...编写编译器用到的知识之广是编写一般程序所无法比拟的,将综合运用编译原理,数据结构与算法,Intel x86汇编语言、机器语言,目标文件格式,可执行文件格式等知识内容。
  • 编译原理

    2017-12-04 21:42:55
    一、 编译程序 1、 编译器是一种翻译程序,它用于将源语言(即用某种程序设计语言写成的)程序翻译为目标语言(即用二进制数表示的伪机器代码写成的)程序。后者在windows操作系统平台下,其文件的扩展名通常为....

    http://blog.csdn.net/shawjan/article/details/44652807

    一、 编译程序

    1、 编译器是一种翻译程序,它用于将源语言(即用某种程序设计语言写成的)程序翻译为目标语言(即用二进制数表示的伪机器代码写成的)程序。后者在windows操作系统平台下,其文件的扩展名通常为.obj。该文件通常还要经过进一步的连接,生成可执行文件(机器代码写成的程序,文件扩展名为.exe)。通常有两种方式进行这种翻译,一种是编译,另一种是解释。后者并不生成可执行文件,只是翻译一条语句、执行一条语句。这两种方式相编译比解释运行的速度要快得多。

    2、 编译过程的5个阶段:词法分析;语法分析;语义分析与中间代码产生;优化;目标代码生成。

    3、 在这五个阶段中,词法分析的任务是识别源程序中的单词是否有误,编译程序中实现这种功能的部分一般称为词法分析器。在编译器中,词法分析器通常仅作为语法分析程序的一个子程序以便在它需要单词符号时调用。在这一编译阶段中发现的源程序错误,称为词法错误。

    4、 语法分析阶段的目的是识别出源程序的语法结构(即语句或句子)是否错误,所以有时又常为句子分析。编译程序中负责这一功能的程序称为语法分析器或语法分析程序。在这一阶段中发现的错误称为语法错误。

    5、 C语言的(源)程序必须经过编译才能生成目标代码,再经过链接才能运行。PASCAL语言、FORTRAN语言的源程序也要经过这样的过程。通常将C、PASCAL、FORTRAN这样的语言统称为高级语言。而将最终的可执行程序称为机器语言程序。

    6、 在编译C语言程序的过程中,发现源程序中的一个标识符过长,超过了编译程序允许的范围,这个错误应在词法分析阶段发现,这种错误通常被称作词法错误。

     词法分析器的任务是以词法规则为依据对输入的源程序进行单词及其属性的识别,识别出一个个单词符号。

     词法分析的输入是源程序,输出是一个个单词的特殊符号,称为Token(标记或符号)。

     语法分析器的类型有:自下而上、自上而下。常用的语法分析器有:递归下降分析方法是一种自上而下分析方法, 算符优先分析法属于自下而上分析方法,LR分析法属于自下而上分析方法等等。

     通常用正规文法或正规式来描述程序设计语言的词法规则,而使用上下文无关文法来描述程序设计语言的语法规则。

     语法分析阶段中,处理的输入数据是来自词法分析阶段的单词符号。它们是词法分析阶段的终结符。

    7、 编译程序总框

    编译原理框架

    8、 在计算机发展的早期阶段,内存较小的不能一次完成程序的编译。这时通常将编译过程分成若干遍来完成。每一遍完成一部分功能,称为多遍编译。 
    与采用高级程序设计语言写的词法分析器相比,用汇编语言写的词法分析通常分析速度要快些。

    二. 词法与语法

    1、 程序语言主要由语法和语义两个方面来定义。

    2、 任何语言的程序都可看成是某字符集上的一个长字符串。

    3、 语言的语法:是指这样的一组规则(即产生式),用它可以生成和产生一个良定的程序。这些规则的一部分称为词法规则,另一部分称为语法规则。

    4、 词法规则:单词符号的形成规则;语法规则:语法单位(句子)的形成规则。语义规则:定义程序句子的意义。

    5、 一个程序语言的基本功能是描述数据和对数据的运算。

    6、 高级语言的分类:强制式语言;应用式语言;基于规则的语言;面向对象的语言。

    7、 一个语言的字母表为{a,b},则字符串ab的前缀有a、ε,其中ε不是真前缀。

    8、 字符串的连接运算一般不满足交换率。

    9、 文法G是一个四元组,或者说由四个元素构成,即非终结符集合VN、非终结符号集合VT 、开始符号S、产生式集合P,它可以形式化地表示成G =(VN,VT,S,P)。 
    按照文法的定义,这4个元素中终结符号集合是这个文法所规定的语言的字母表,产生式集合代表文法所规定的语言语法实体的集合。对上下文无关文法,通常我们只需要写出这个文法的产生式集合就可以确定这个文法的其他所有元素。其中,第一条产生式的左部符号为开始符号,而所有产生式的左部符号构成的集合就是该文法的非终结符集合。

     文法的例子: 
    设文法G=(VN,VT, S,P),其中P为产生式集合,它的每个元素的形式为产生式。

    10、如果文法G的一个句子存在两棵不同的最左语法分析树,则这个文法是无二义的。

    11、如果文法G的一个句子存在两棵不同的最右语法分析树,则这个文法是无二义的。

    12、如果文法G的一个句子存在两棵不同的语法分析树,则这个文法是无法判断是否是二义的。

    13、A为非终结符,如果文法存在产生式 ,则称 可以推导出 ;反之,称 可归约为 。

    14、乔姆斯基(Chomsky)将文法分为四类,即0型文法、1文法、2文法、3文法。 
    按照乔姆斯基对方法的分类,上下文无关文法是2型文法,2型文法的描述能力最强,3型文法又称为正规文法。

    15、产生式S→Sa | a产生的语言为L(G) = {an | n ≥ 1}。

    16、确定有限自动机DFA是非确定有限自动机NFA的特例;对任一非确定有限自动机能找到一个与之等价的确定有限自动机。

    17、DFA和NFA的主要区别有三点:一、DFA初态唯一,NFA初态不唯一;二、DFA弧标记为Σ上的元素,NFA弧标记为Σ*上的元素;三、DFA的函数为单射,NFA函数不是单射。

    18、有限自动机中两个状态S1和S2是等价的是指,无论是从S1还是S2出发,停于终态时,所识别的输入字的集合相同。

    19、自下而上的分析方法,是一个不断归约的过程。

    20、递归下降分析器:当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序。这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。 
    这个产生式中含有的左递归是直接左递归。递归下降分析法中,必须要消除所有的左递归。递归下降分析法中的试探分析法之所以要不断用一个产生式的多个候选式进行逐个试探,最根本的原因是这些候选式有公共左因子。

    21、算符优先分析法是一种自下而上的分析方法,它适合分析各种程序设计语中的表达式,并宜于手工实现。目前最广泛的无回溯的“移进—归约”方法是自下而上分析方法。

    22、在表驱动预测分析器中,

    1)读入一个终结符a,若该终结符与栈项的终结符相同,并且不是结束标志$,则此时栈顶符号出栈;

    2)若此时栈项符号是终结符并且是,说明源程序有语法错误;

    3)若此时栈顶符号为,则分析成功。

    23、算符优先分析方法不存在使用形如 这样的产生式进行的归约,即只要求终结符的位置与产生式结构一致,从而使得分析速度比LR分析法更快。

    24、LR(0)的例子:

    产生式E→ E+T对应的LR(0)项目中,待归约的项目是E→ E+∙T,移进项目是E→ E∙+T,还有两个项目为E→ ∙E+T和E→ E+T∙。 
    当一个LR(0)项目集中含有两个归约项目时,称这个项目集中含有归约-归约冲突。

    25、LL(1)文法的产生式中一定没有公共左因子,即LL(1)文法中一定没有左递归。为了避免回溯,在LL(1)文法的预测分析表中,一个表项中至多只有一个产生式。 
    预测分析方法(即LL(1)方法),由一个栈,一个总控程序和一个预测分析表组成。其中构造出预测分析表是该分析方法的关键。

    26、LR(0)与SLR(1)两种分析方法相比,SLR(1)的能力更强。

    27、静态语义检查一般包括以下四个部分,即类型检查、控制流检查、名字匹配检查、一致性检查。 
    C语言编译过程中下述常见的错误都属于检查的范围:

    a) 将字符型指针的值赋给结构体类型的指针变量:类型检查。 
    b)switch语句中,有两个case语句中出现了相同的常量:一致性检查。 
    c)break语句在既不是循环体内、又不是break语句出现的地方出现:控制流检查。 
    d)goto语句中的标号在程序的函数中没有找到:一致性检查。 
    e)同一个枚举常量出现在两个枚举类型的定义当中:相关名字检查。

    28、循环优化中代码外提是指对循环中的有些代码,如果它产生的结果在循环过程中是不变的,就把它提到循环体外来;而强度削弱是指把程序中执行时间较长的运算替换为执行时间较短的运算。 (完)

    展开全文
  • 本文以C程序为例。 构建C程序需要4个步骤,分别使用4个工具完成: preprocessor, ...第二步,编译. 将第一步产生的文件连同其他源文件一起编译成汇编代码。 第三步,汇编。将第二步产生的汇编源码转换为 object fi...

    本文以C程序为例。

    构建C程序需要4个步骤,分别使用4个工具完成: preprocessor, compiler, assembler, and linker.四步完成后生成一个可执行文件。

    1. 第一步,预处理. 这一步处理 头文件、条件编译指令和宏定义。

    2. 第二步,编译. 将第一步产生的文件连同其他源文件一起编译成汇编代码。

    3. 第三步,汇编。将第二步产生的汇编源码转换为 object file.

    4. 第四步,链接. 将第三步产生的一些object file 链接成一个可执行的文件。

    文件后缀 对于编译来说
    file_name.c 需要预处理的C原文件
    file_name.i 预处理C文件后产生的文件
    file_name.ii 预处理C++文件后产生的文件
    file_name.cc file_name.cpp 需要预处理的C++原文件
    file_name.s 产生的汇编代码
    file_name.o 产生的 object file

    这里写图片描述

    可执行文件

    源码经过汇编产生对象文件(Object files),然后经过链接生成可执行文件(executable files)。对象文件和可执行文件的格式可以是ELF(Executable and Linking Format) 或者 COFF(Common Object-File Format)。ELF格式用于Linux系统,COFF用于windows系统。
    ELF格式来源于System V Release 4 unix。ELF文件由几个区组成,每个区前面都包含一个头部。区总数有限制。区内可以包含可执行文件,数据,动态链接信息,调试数据,符号表,重定位信息,注释,字符串表和备注等信息。其中,一些区等内容直接加载到进程镜像中,一些区为构建进程镜像过程中提供辅助信息,还有一些区只在链接对象文件过程中使用到。
    下面几个区是所有可执行文件通用部分。

    section 描述
    .text 这部分内容为可执行指令码,被执行该文件所产生到进程之间所共享
    .bss BSS 代表 ‘Block Started by Symbol’. 这里记录未初始化的全局和静态变量。由于 BSS 只会记录还未赋值到变量,所以它不会实际保存变量镜像。
    .data 包含始化的全局和静态变量。这里是可执行文件的最大一部分。
    .rdata 只读数据区,这里包含常量和字符串。
    Symbol table symbol就是一些名字地址Symbol table存储着程序的symbolic definitionssymbolic references定位信息。
    Relocation records 比如,当程序调用一个函数,对应的调用指令必须出让控制到目的地址去执行。简单来说,relocation records就是一些用来给linker用来调整区块内容的参考信息。

    Because the various object files will include references to each others code and/or data, so various locations, these shall need to be combined during the link time.
    For example in Figure w.2, the object file that has main() includes calls to functions funct() and printf().

    重定位信息(RELOCATION RECORDS)

    由于不同的对象文件之间保存了彼此之间的引用,所以在链接期间需要整合这些定位。下图是RELOCATION RECORDS信息的使用过程。
    这里写图片描述

    符号表(SYMBOL TABLE)

    由于从汇编到机器码过程中需要移除labels,所以,对象文件必须另找地方保存对labels的跟踪信息。符号表里保存着名字以及和名字对应的datatext区的偏移量。符号表就是用来记录这些信息的。

    链接

    这里写图片描述

    共享对象文件(shared object)

    printf(), malloc(), strcpy()这样的标准库函数,一般在系统中以共享对象文件存在,一遍程序链接时候取用。共享对象文件根据链接方式不同,以两种形态出现,一种是.a后缀文件,以便静态链接使用,如libc.a;一种是.so后缀文件,以便动态链接使用。比如libc.so

    静态链接

    静态链接将共享对象文件.a一同链接至可执行文件内,比如:

    gcc –static filename.c –o filename
    这么干的缺点是可执行文件大,程序运行耗费内存。

    动态链接

    动态链接不会将共享对象文件链接至可执行文件内,而是将.so文件的依赖信息写入可执行文件中,当程序加载时,让运行时链接器去找.so文件。动态链接的好处是,1)可执行文件小,2)程序运行耗内存少,因为不同进程会共用同一份虚拟内存中的.so载入,而不是每个进程单独载入一份.so至内存。3)库升级不用重新链接程序。

    程序如何利用共享对象

    ELF区块
    .init           - Startup
    
    .text          - String
    
    .fini           - Shutdown
    
    .rodata     - Read Only
    
    .data         - Initialized Data
    
    .tdata        - Initialized Thread Data
    
    .tbss          - Uninitialized Thread Data
    
    .ctors         - Constructors
    
    .dtors         - Destructors
    
    .got            - Global Offset Table
    
    .bss           - Uninitialized Data

    在Linux系统上,可以使用readelf或者objdump工具产看ELF文件。
    这里写图片描述

    进程加载

    Linux进程加载自文件系统里的ELF文件(使用execve()或者spawn()系统调用),如果文件系统是块设备比如硬盘,则将其读取到内存中,如果设备已经内存映射比如flash盘,那么无需加载至RAM,直接本地运行。
    将可执行文件加载至内存需要用到加载器(loader),加载器是操作系统通用必备的。加载器的作用:
    1. Memory and access validation内存与访问校验。OS内核读取可执行文件头部信息确定可读性以及内存评估,确定对其指令的执行能力。
    2. 建立进程:1)为程序分配主存,2)copy可执行文件的必要数据至主存,3)初始化寄存器比如esp等,4)跳进主程main()

    程序加载后,在内存中的布局:
    这里写图片描述

    进程(镜像)

    这里写图片描述

    这里写图片描述
    reference:http://www.tenouk.com/ModuleW.html
    reference:http://www.tenouk.com/Bufferoverflowc/Bufferoverflow1c.html

    展开全文
  • From:http://blog.chinaunix.net/uid-22327815-id-3540305.html 从Hello World说程序运行机制:http://www.sohu.com/a/132798003_505868 C/C++中如何在main()函数之前执行一条语句?...(深入理解计算机系统...
  • 编译和链接的过程

    2018-07-22 23:08:24
    程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。接下来通过几个简单的例子来详细讲解一下这些过程。 对于上边用到的几个选项需要说明一下。 使用 gcc 命令不跟任何的选项的话,会默认执行...
  • 【龙书】编译原理(第二版)学习与理解:1.也许我们这辈子都不会去实现一个编译器,但是我们至少要知道编译器是什么?为什么会需要编译器? ①编译器首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始...
  • 简单的编译流程

    2018-10-30 23:35:44
    简易编译器流程图: 一个典型的编译器,可以包含为一个前端,一个后端。前端接收源程序产生一个中间表示,后端接收中间表示继续生成一个目标程序。所以,前端处理的是跟源语言有关的属性,后端处理跟目标机器有关...
  • 编译执行和解释执行

    2019-07-09 17:15:44
    一、编译和解释 编译:将源代码一次性转换成目标代码的过程 类似英语中的全文翻译。 执行编译过程的程序叫做编译器。 解释:将源代码逐条转换成目标代码同时逐条运行的过程。 类似英语中的同声传译。 ...
  • 编译原理:总结

    2019-01-08 11:33:57
    编译器概述 编译器的核心功能 编译器的核心功能是把源代码翻译成目标代码: 翻译!!!目标代码!!! 理解源代码:词法分析、语法...转化为等价的目标代码:中间代码生成、目标代码生成 ...语法分析器:单词流-&am
  • 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的...
  • 你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。下面是我参考...
  • 我们都知道,Android程序打完包之后得到的是一个APK文件,这个文件是可以直接安装到任何Android手机上的,我们反编译其实也就是对这个APK文件进行反编译。Android的反编译主要又分为两个部分,一个是对代码的反编译...
  • luyten是一款操作简单、功能实用的java反编译工具,软件支持*.JAR、*.zip、*.class等类型文件的反编译操作,还原度非常高,支持更多功能设置,如显式导入、类型、合成组件等等,用户可根据不同的需求选择合适的显示...
  • Java反编译工具使用对比,最好用的Java反编译工具 --- JD-GUI 大家都知道,将源代码转换成二进制执行代码的过程叫“编译”,比如将C源代码编译成.exe可执行文件;那么把二进制执行代码转换成源代码的过程就叫“反...
  • 今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程。尤其是像.NET、Java这样的运行在虚拟机上的...
  • apktool功能:反编译出apk资源文件。 使用方式: 把apktool 解压到任意位置 执行 在dos 改目录下 执行 apktool d xxx.apk test ,便会把编译后的资源存入test文件夹下。
  • 2.dex2jar:该工具作用是将classes.dex文件,反编译出源码(如果apk未加固),反编译出文件,使用jd-gui工具进行查看; 3.Auto-Sign:自动签名工具,将重新打包的apk进行签名,如果不签名,无法安装使用...
  • APK反编译

    2018-05-17 14:55:52
    学习和开发Android应用有一段时间了,今天写一篇博客总结一下Android的apk文件反编译。我们知道,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件,然后让用户通过手机或者平板电脑下载下来进行安装...
1 2 3 4 5 ... 20
收藏数 3,128,508
精华内容 1,251,403
关键字:

编译