精华内容
下载资源
问答
  • 我的软考笔记-程序语言-汇编、编译、解释系统 中间代码:复杂性介于源程序语言和机器语言的一种表示形式。对于可执行语句,需要翻译成中间代码或目标代码。...编译程序锁使用的中间代码有多种形式,常有的...

    我的软考笔记-程序语言-汇编、编译、解释系统

    中间代码:复杂性介于源程序语言和机器语言的一种表示形式。对于可执行语句需要翻译成中间代码或目标代码
    特点
    1、一种简单且含义明确的记号系统,与具体的机器无关,可以有若干种形式。
    2、可将不同的高级程序语言翻译成同一种中间代码
    3、使用中间代码有利于进行与机器无关的优化处理,以及提高编译程序的可移植性
    编译程序锁使用的中间代码有多种形式,常有的有:树、后缀式、逆波兰式、三元式、四元式、树形表示四元式或称“三地址代码”是一种普遍采用的中间代码形式,很类似三地址指令,可看作是一种虚拟三地址机的通用汇编码,每条指令包含操作符和三个地址两个为运算对象,一个为结果。

    解释器不生成独立的目标程序
    编译器将原程序翻译成独立保存的目标程序目标代码生成阶段分配寄存器

    编译过程变量分配存储单元所用的地址是逻辑地址,程序运行时再映射为物理地址
    编译是将高级语言源程序翻译成机器语言程序(汇编形式或机器代码形式),反编译编译的逆过程。反编译不能把可执行文件还原成高级语言源代码,只能转换成功能上等价的汇编程序

    符号表记录源程序中各个符号的必要信息,以辅助语义的正确性检查代码生成,再编译过程中需要堆符号表进行快速有效的查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。对于声明语句,需要记录所遇到的符号的符号信息,进行符号表的填查工作。

    动态的语义错误发生在程序运行时例如:变量取0作除数、引用数组元素下表错误,运行时陷入死循环。
    静态的语义错误编译时发现的语义错误。运算符与运算对象类型不合法。

    汇编语言程序每条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(目标代码)。汇编语言源程序中的指令将被翻译成机器代码。汇编程序以汇编语言源程序为输入以机器语言表示的目标程序为输出。汇编语言的指令语句必须具有操作码字段可以没有操作数字段
    伪指令用于指示汇编程序如何汇编源程序

    展开全文
  • 许多Pascal编译系统生成的中间代码是一种称为P- code的抽象代码。 P- code的“P”即“Pseudo”。 既然是“抽象机”,就是表示它并不是实际的物理目标机器而通常是虚拟的一台“堆栈计算机”。该堆栈式计算机主要由...

    前言

    参考课上PPT内容。 该学习笔记目前仅打算个人使用。
    后续会进一步整理,包括添加笔记内容,标明参考资料。

    更新中。。。

    跳过目录


    一、可移植性和抽象机

    可移植和可适应

    如果花较小的代价就能将一个程序迁移到另一台机器上,则称该程序是可移植的(portable)

    • 即迁移程序的开销要显著小于从头开始编制程序的开销。

    如果一个程序能够容易地进行修改就能满足不同用户和系统的需求,那么称该程序是可适应的(adaptable)。

    假定要将一个给定的编译程序从X机移植到Y机,则需要产生Y机的代码,为此必须重写现有编译程序的代码生成部分。

    如果原来的编译程序已分成前端和后端两部分:

    • 前端处理源语言
    • 后端处理与目标机相关的部分
    • 在前后端之间有一个良好的接口

    那么移植的主要工作仅仅是改变与目标机相关的部分。

    信息流

    编译程序两部分之间的信息流:

    • 从前端到后端:为源语言上的基本操作
    • 从后端到前端:为目标机的信息。

    两者的接口能够通过抽象机来实现,也即能够将源语言的各种基本操作(fundamentaloperation)映射到该抽象机的伪操作上。

    基本模式

    • 可以是源语言中的类型(如Pascal中的整型和字符型),也可以是用来构造源语言中更复杂类型(如Pascal中构造类型)的模式。

    基本操作

    是指用于描述一个语言编写的程序的最简单、最直接的操作。

    抽象机

    可为特定的源语言设计抽象机,例如有为Pascal语言设计的抽象机。

    抽象机模型是根据源语言(如Pascal)中基本的操作和模式来建立的。

    编译程序的前端将源程序翻译成抽象机代码,只需要将源语言的各种结构分解为抽象机的基本模式下的基本操作序列。

    由基本模式和基本操作所组成的对偶构成了抽象机上的一条指令。

    抽象机的体系结构形成一个环境,在该环境中模式和操作相互作用来模拟源语言。

    抽象机的设计者一方面要使抽象机能很容易地模拟源语言的各种结构所规定的操作,同时,还必须考虑能在实际计算机上高效地实现该抽象机的操作。

    优点

    • 使编译程序的前端和后端清楚地分离。
      将一个编译程序移植到一台新的机器上,仅需要开发一个编译程序的新的后端,对前端也只需做少量的修改(必要时)。

    例:在 n 台不同的机器上实现 m 种不同语言的编译

    • 若不使用某种中间代码形式(如抽象机代码),那么必须要编写 m × n 个不同的编译程序。

    • 若使用抽象机代码,则仅需要m个前端和n个后端。使用这种方法,m × n 个不同的编译程序能够由 m + n 个部分组合而成。

    如今,对一种程序设计语言,为几种不同的目标机产生高效的目标代码已是一件十分容易的事了。

    一个较为困难的问题是要有一台抽象机,由该抽象机要能为几种程序设计语言产生高效的目标代码,同时,它又要能够高效地模拟所有的程序设计语言。

    因为各种程序设计语言(如FORTRAN、Lisp、Basic、Pascal和C)是有很大不同的,要找到这样的抽象机几乎不可能。

    在计算机中,伪机器码可被微程序设计为指令组由硬件执行。

    抽象机代码

    许多Pascal编译系统生成的中间代码是一种称为P-code的抽象代码。

    • P-code的“P”即“Pseudo”。

    目前广泛使用的Java语言,其编译器生成的代码实际上也是一种抽象机(即Java虚拟机)的代码,称为字节码(byte code)。

    二、Pascal 的 P-code 抽象机

    既然是“抽象机”,就是表示它并不是实际的物理目标机器而通常是虚拟的一台“堆栈计算机”。

    该堆栈式计算机主要由若干寄存器、一个保存程序指令的储存器(PC)和一个堆栈式数据及操作存储组成。

    栈:

    • 用于存放所有可按源程序中的数据声明进行直接寻址的数据

    堆:

    • 用于存放由程序员直接控制,即通过new语句所创建出来的数据

    寄存器:

    • PC:程序计数器,指向当前执行的指令。
    • NP:堆指针,指向当前空闲堆空间的起始位置。
    • SP:指针,指向当前栈顶位置。
    • BP:基地址指针,即指向当前活动记录的起始位置。
    • MP:标志指针,指向当前活动记录的基地址。
    • EP:顶指针,指向当前程序模块在栈中的最高位置。

    栈式计算机的存储情况如下:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    问题:全局变量放在哪里?

    运行P-code的抽象机没有专门的运算器或累加器,所有的运算(操作)都在运行栈的栈顶进行,如要进行运算

    d := ( a + b ) * c
    

    生成P– code序列为:

    在这里插入图片描述

    取a   LOD a
    取b   LOD b
    +     ADD
    取c   LOD c
    *     MUL
    送d   STO d
    

    P-code 指令

    P-code实际上是波兰表示形式的中间代码。

    编译程序生成P-code指令程序后,我们可以用一个解释执行程序( interpreter)来解释执行P-code ,当然也可以把P-code再变成某一机器的目标代码。

    显然,生成抽象机P-code的编译程序是很容易移植的。

    补充:中间代码生成实例——翻译成后缀式

    概念:拉链回填

    begin
    	k := 100;
    L:  if k > i + j then
    		begin
    			k := k – 1; 
    			goto L;
    		end
    	else k := i ^ 2 - j ^ 2;
    	i:= 0;
    end
    

    在这里插入图片描述

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    1. k := 100;

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
      k 100 :=
    2. k > i + j

      1 2 3 4
      L标号
      5 6 7 8 9 10 11 12 13 14 15 16
      k 100 := k i j + >
    3. if then

      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > ? jez
      • 无法确定的地址先填入0。
      • 一旦地址确定“回填”之!
      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > 0 jez
    4. k := k – 1;

      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > 0 jez k k 1 - :=
    5. goto L;

      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > 0 jez k k 1 - := 4
      17
      j
    6. else

      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > 0 jez k k 1 - := 4
      17 18
      label2
      19 20 21 22 23 24 25 26 27 28 29 30 31 32
      j ? j
    7. k := i ^ 2 - j ^ 2;

      1 2 3 4
      L标号
      5 6 7 8 9 10 11 12 13 14 15 16
      k 100 := k i j + > 20 jez k k 1 - := 4
      17 18
      label2
      19 20
      label1
      21 22 23 24 25 26 27 28 29 30 31 32
      j 0 j k i 2 ^ j 2 ^ - :=
    8. i := 0;

      1 2 3 4
      L标号
      5 6 7 8 9
      label1
      10 11 12 13 14 15 16
      k 100 := k i j + > 20 jez k k 1 - := 4
      17 18
      label2
      19 20
      label1
      21 22 23 24 25 26 27 28 29
      label2
      30 31 32
      j 29 j k i 2 ^ j 2 ^ - := i 0 :=

    注:

    • 该中间代码程序有死代码,即永远执行不到的代码(18、19)
    展开全文
  • 若要使用这个宏,就必须使用Qt提供moc.exe程序,来生成中间文件,下面举例介绍如何使用。 例子:在窗口中,两个控件,一个输入框(QTextEdit),一个显示文本(QLabel)控件,最终效果是在输入框中输入文本...

     

    在windows下VS中开发Qt程序,若要是使用Qt的信号与槽,就得在类中使用Q_OBJECT宏,使用这个宏实际就是让Qt额外生成一些代码。若要使用这个宏,就必须使用Qt提供的moc.exe程序,来生成中间文件,下面举例介绍如何使用。

    例子:在窗口中,有两个控件,一个输入框(QTextEdit),一个显示文本(QLabel)控件,最终效果是在输入框中输入的文本实时性的显示在显示控件上。

    代码如下:

    MyWidget.h

    #pragma once
    #include <QtWidgets/QWidget>
    #include <QtWidgets/QTextEdit>
    #include <QtWidgets/QLabel>
    class MyWidget : public QWidget
    {
        Q_OBJECT
    public:
        MyWidget();
    public slots:
        void On_TextChanged();
    private:
        QTextEdit* m_textEdit;
        QLabel* m_lblText;
    };
    
    

    MyWidget.cpp 

    #include "MyWidget.h"
    
    MyWidget::MyWidget()
    {
        setWindowTitle("MyWidget");
        resize(450, 300);
    
        m_lblText = new QLabel(this);
        m_lblText->setGeometry(100, 150, 200, 30);
        m_lblText->setStyleSheet("border:1px solid black;");
        m_textEdit = new QTextEdit(this);
        connect(m_textEdit, SIGNAL(textChanged()), this, SLOT(On_TextChanged()));
        m_textEdit->setGeometry(100, 50, 200, 30);
    }
    
    void MyWidget::On_TextChanged()
    {
        m_lblText->setText(m_textEdit->toPlainText());
    }
    

    main.cpp

    #include <QtWidgets/QApplication>
    #include "MyWidget.h"
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
        MyWidget myWidget; 
        myWidget.showNormal();
        return app.exec();
    }

    实现的原理很简单。将m_textEdit的textChanged信号连接到槽函数On_TextChanged中,当输入框中的文本发生改变时,此槽函数就会被响应,在槽函数中,读取m_textEdit的文本,并将此文本设置到m_lblText上进行显示。

    但仅仅这三个文件编译会不通过,因为若要Qt的信号与槽,就要在MyWidget类中使用了Q_OBJECT宏,否则,槽函数不会被响应。编译此工程会出现下面的链接错误。

    这是因为使用Q_OBJECT,就定义了一些函数,而这些函数没使用实现,比如qt_metacall。

    Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。

    vs2010集成Qt后,编译无法生成moc文件,此时可以采用手动方式生成:

    在命令行下输入moc yourfilename.h -o moc_youfilename.cpp生成不带Q_OBJENT的源文件。

     

    如何解决这个问题呢?

    这个时候就要使用qt提供的moc.exe程序,来生成代码。moc.exe程序是Qt安装包中提供的。路径在:Qt按照路径/bin下,使用moc的语法为:

    E:\Code\vcpkg\buildtrees\qt5-base\x86-windows-rel\bin\moc.exe MyWidget.h -o moc_MyWidget.cpp

    会在MyWidget.h同目录下生成moc_MyWidget.cpp文件,将此文件添加到工程中,重新编译就能成功。

    最终的效果:

     

     

     

     

    展开全文
  • test/seroenttest.c 这个文件里面缺少一个变量的定义和使用的函数入参变动了。 输入指令:perl util/mkdef.pl crypto update 执行成功后会提示你哪些老旧的东西,update了哪些东西。 执行过后,...
  • 本书系统介绍了经典的编译理论和技术,同时也包含了面向对象语言等当前较新语言的编译技术。 本书更可贵之处在于提供了较完整适用于教学实践样例语言,是一本理论和实践内容相结合、不可多得好书。 本书可...
  • 我虽然已经多年不写代码了,但看这本书时候,让我又重新感受到做程序员乐趣:用代码建设属于自己的系统,让电脑听从自己指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科解释是...
  • 我虽然已经多年不写代码了,但看这本书时候,让我又重新感受到做程序员乐趣:用代码建设属于自己的系统,让电脑听从自己指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科解释是...
  • 一个在公司内部使用的系统,为什么要挂到外网上,让任何人都可以下载?数据库权限控制,不同的系统划分不同的账号这是基本常识(我也经常不划分,就是为了偷懒),不同的账号控制不同的权限,甚至账号可以细化到读/...


    今天这篇文章不准备讲太多理论,讲我最近遇到的一个案例。从技术上讲,这个例子没什么高深的,还有一点狗屎运的成分,但是它又足够典型,典型到我可以讲出很多大道理用来装逼。So,我们开始吧。

     

    1.1 一个公司内部专用的CRM系统

    CRM系统是什么,如果你不知道的话,请自行Google。从数据的角度讲,它包含了一个公司所有往来客户的机密资料,如果泄露的话,后果很严重。下面是我无意中发现的一个网站,挂着一个CRM软件的下载链接。开始的时候我以为这个是一家卖CRM的公司,但是看着又不太像。

    从网站的其他信息看,这仿佛是一个公司内部的CRM系统,于是我下载下来。

    直接是一个登录界面,我先随便输入了一个用户名,没有输入密码。

    然后我又输入了一个“admin”.

    通过简单的尝试,我们可以确定这不是通用的CRM系统,是定制的,而且可以在外网使用,是否有绑定计算机不得而知,外网服务器IP不知道,是否直接连接外网的数据库服务器不知道。下面我们通过抓包来确认一下。

    1.2  抓包分析

     

    启动Wireshark,然后点击登录按钮,立即停止抓包,我发现了一连串的TDS包。

    下面的信息确认这个软件是直接连接的数据库服务器,并没有通过后端的服务接口来返回数据。

    查询语句很明显,但是也很奇怪,开发者在用用户名查询密码,然后要做的应该是用返回的密码和用户输入的密码进行比对。不过还好,它返回的密码是加密过的。

    根据对sqlserver 的了解,在登录认证阶段,默认是加密传输的,并不会暴露用户名和密码,但是我们可以通过从数据包中分析出数据库的版本和服务器的基本信息。

    访问的数据库名:

    服务器名称:

    当然从名字上看应该是win7系统,win7做服务器也比较奇葩。

    数据版本:

    SqlServer 10.0,应该是2008版本。

    ok,现在简单总结下。通过抓包分析,我们得到了目标服务器的IP,打开的端口至少有80和1433,操作系统是win7,数据库为SQLServer2008,连接的目标数据库名称。下面我们有三个方向可以去努力,一个是找服务器和web应用的漏洞去渗透,第二个是继续挖掘软件本身的漏洞,第三个是攻击数据库。我们不知道当前应用登录数据库所使用的账号的权限是怎么样的,但是已经能够大致判断软件编写者的编程水平了,从编程水平去推断90%的可能性是sa用户或者sa权限。下面邪恶的想法来了,拦截并修改查询语句,新建一个数据库管理账号,然后使用工具直接连接上去,那么不就控制了数据库了吗,控制数据库后是不是还有机会控制服务器呢?试试便知。

    1.3  测试中间人攻击

    在本机就没必要中间人攻击了吧?不过我还是非常想利用Ettercap的Filter和replace功能,可以省掉很多麻烦。

    首先在虚拟机里启动我的Kali Linux,然后在Kali里面启动Ettercap进行Arp欺骗测试(Ettercap的详细使用请google,这里简单说明)。

    第一步,开启路由转发功能。

    # 启用IP路由转发功能

    echo 1 > /proc/sys/net/ipv4/ip_forward

    第二步,在”/etc/ettercap/etter.conf”中配置转发。

    第三步,arp欺骗。

    第四步,测试。

    使用driftnet 测试,是否能拦截主机的图片请求,如果能,证明arp欺骗成功。

    1.4  FILTER和REPLACE数据构造

    上面的测试证明了中间人攻击可行,那么下面我们开始构造Filter脚本。先创建一个1433.filter文件,输入如下内容:

    search和replace的内容是需要我们按需构造的。search的内容我们可以在刚才的抓包工具中获取到,就是从数据库中查询密码的sql语句,replace的内容我这里想要它执行这样的语句:

    CREATE LOGIN hacker WITH PASSWORD=’YouGotHacked1#’;

    下面我们再回头看看要搜索的元素请求数据。

    select Employee_UserName,Employee_PassWord from E_Employee where Employee_State= 217 and Employee_UserName='admin'

    这份数据每个字符后面都填充了\x00的null byte,这是不可打印的,这意味着我们需要将内容全部转为16进制,然后填充\x00。

    还有另一个问题要注意,替换的数据必须与原数据长度相同,否则会引起TCP数据传输中断。手工去做这件事略微有点麻烦,我还是写段小程序来搞定吧。

    def stringToHex(string,padLength=0):

         s1=[hex(ord(s)).replace("0x",'\\x') for s in string];

         result='';

         for s in s1:

              result=result+s+'\\x00'

         for num in range(padLength):

              result=result+'\\x20\\x00'

         return result;

     

    def getHex(sourceSql,targetSql):

         if len(sourceSql) <len(targetSql):

              print('erro');

         else:

              padLength=len(sourceSql)-len(targetSql);

              print(stringToHex(sourceSql));

              print(stringToHex(targetSql,padLength));

             

    def main():

         source="select Employee_UserName,Employee_PassWord from E_Employee where Employee_State= 217 and Employee_UserName='admin'";

         target="CREATE LOGIN hacker WITH PASSWORD='YouGotHacked1#'";

         getHex(source,target);

    if __name__=='__main__':

         main();

    一小段python,不是什么高明的代码就不解释了,最终filter脚本的样子:

    下面我们将1433.filter文件生成为Ettercap能够使用的ef文件。

    再次运行 Ettercap:

    此时点击软件的登录按钮。

    我们看到filter脚本打印出来的“success replace”,是不是真的成功了呢?

    我使用vs2015的数据库连接工具,进行连接,奇迹就这么出现了:

    连接成功。不过权限有点问题,我们可以再次修改Sql语句,提升它的权限,比如下面这句话:

    ALTER SERVER ROLE sysadmin ADD MEMBER hacker;

    这一步就不详细演示了,流程和上面一样。下面我们再回到另一个分支上,来找找软件本身的弱点。

    1.5 反编译和解密

    看了下面的内容,你一定会觉得我上面的操作都是瞎费劲,几分钟就解决问题了。这个例子确实是这样,不过上面的方法更通用一些,而且难度不高,是需要优先掌握的。

    在软件的安装目录中,我首先看到了这样几个dll文件:

    作为一名资深的.NET程序员,看到名字我就知道这是.NET写的程序了。于是先找到config文件,看看程序员是不是把数据库连接串写到这里了。

    连接串确实在这里了,不过加密了。

    但是到这里,我对这个程序已经没什么欲望了,即使它防护做的再好,那也是个.NET程序,是.NET程序,我就能攻破它(专业破解.NET,从未失败过)。不过令人失望的是,这个程序连基本代码混淆都没做,当然更没有壳,也没有代码加密。使用反编译工具随便点了点,然后拷贝了几段代码:

    还是要忍不住吐槽这代码写的太渣了,不过成功的解密了连接串,成功登录了数据库,不是SA用户,但是却有sa权限,试了下xp_cmdshell,默认被数据库禁用了。执行下面的sql语句解封,

    sp_configure 'show advanced options',1

    reconfigure

    go

    sp_configure 'xp_cmdshell',1

    reconfigure

    go

    1.6 小结—架构、权限管理、加密/解密、源码保护

    好了,又到了装逼的环节了。这段总结是说给像我这样平时大道理一堆堆,写代码的时候一坨坨的程序员的。

    首先,权限管理必须要严格控制。一个在公司内部使用的系统,为什么要挂到外网上,让任何人都可以下载?数据库权限控制,不同的系统划分不同的账号这是基本常识(我也经常不划分,就是为了偷懒),不同的账号控制不同的权限,甚至账号可以细化到读/写,表,存储过程级别。既然用户有角色划分,那么我们的代码必须也要有访问权限划分。不是在代码内部要访问数据的时候加个if-else,应该在调用还没开始就挡在外面。

    第二,一个必须联网才能使用的程序,为什么不把数据访问,核心业务逻辑都放在远端的服务器上,公开接口给客户端调用呢?只有一个原因,程序员太懒。我就是搞winform的,你要老子搞什么服务端,不会!连基本的分层和服务划分都不注意,在基础架构这就留下了安全隐患,同时客户端的安全漏洞直接导致服务器被攻陷。

    第三,.NET/Java 这类应用没有办法绝对防止反编译,只是时间问题。但是这不代表我们就不应该做程序保护,加壳,源码混淆,程序集加密,结合服务端获取进行rsa加密解密的动态程序集构建技术,是可以把90%的初级用户挡在门外的。城门大开就不对了。

    这些话题就不展开了,网上一搜一大堆。

    好吧,没什么值得继续的了,到此结束吧。

     

    下面是广告时间:

    关注微信订阅号,持续推送优秀安全类文章。

    欢迎加入网络安全群:147098303。

    最新网络公开课预告

    时间:5月24日

    内容:python黑客编程之局域网嗅探和敏感信息探测

    报名地址:http://edu.csdn.net/huiyiCourse/detail/126

    展开全文
  • 编译原理全套

    2011-12-03 11:17:21
    第7章 中间代码生成 7.1 中间语言 7.1.1 后缀表示 7.1.2 图形表示 7.1.3 三地址代码 7.2 声明语句 7.2.1 过程中声明 7.2.2 作用域信息保存 7.2.3 记录域名 7.3 赋值语句 7.3.1 符号表中名字 7.3.2 ...
  • 逆向编译技术.7z

    2019-08-20 21:14:02
    “子过程之间数据流的反编译”[Cif94a]被提交给《程序语言杂志》(the Journal of Programming Languages),文中完整描述了数据流分析器的优化操作,把低级的中间代码转换成一个高级的表示法。“结构化反编译图”[Cif...
  • 文章目录编译原理计算机程序语言及编译编译器在语言处理系统中位置编译系统的结构词法分析语法分析 [概述]语义分析[概述]中间代码生成文法上下文无关文法分析树正则表达式穷自动机 计算机程序语言及编译 高级...
  • 编译原理及实现

    2014-06-27 00:09:35
    本书系统介绍了经典的编译理论和技术,同时也包含了面向对象语言等当前较新语言的编译技术。本书更可贵之处在于提供了较完整适用于教学实践样例语言,是一本理论和实践内容相结合、不可多得好书。 本书可...
  • <div><h2>问题 使用pip安装总是中途make失败,... 能否提供与二进制包和模型搭配使用的、免编译的python库? 盼复。感谢!</p><p>该提问来源于开源项目:HIT-SCIR/pyltp</p></div>
  • c编译器ucc 编译原理

    2011-03-30 20:33:54
    2. 使用三地址码作为中间码,构建了由基本块组成控制流图,适合很多优化算法 3. 编译速度快。词法分析,语法分析和目标代码生成器都是手写(其中的代码 生成器本想用burg这样工具自动生成,但这样可能会给...
  • 1.2一个典型的编译系统通常由哪些部分组成?各部分主要功能是什么? 1.3选择一种你所熟悉程序设计语言,试列出此语言中全部关键字,并通过上机使用该语言以判明这些关键字是否为保留字。 1.4选取一种你所...
  • 考虑到跨平台,所以无法使用AOT;...另一种是JIT,只及时的编译,但是大部分JIT引擎,针对是将IR(中间代码,如JavaByteCode) 在运行时, 针对性翻译成机器码。 对于JIT我们必须认识到,JIT不...
  • windows上可编译Linux内核

    热门讨论 2011-09-15 15:54:39
    在最后,要感谢《自己动手写操作系统作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的了在Windows下编译Linux 0.11...
  • 内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置一门重要专业课程。虽然只有少数人从事编译方面工作,但是这门课在理论...
  • 编译原理(第2版)课件

    热门讨论 2009-03-28 15:27:49
    12.1.1 代码生成程序在编译系统位置 12.1.2 设计代码生成程序基本问题 12.2 一个简单的代码生成程序 12.2.1 计算机模型 12.2.2 待用信息链表法 12.2.3 代码生成算法 12.3 几种常用的代码生成程序开发方法 ...
  • 再将.o文件编译成一个哭文件或者可执行文件,这时可能cpp和cuda编译器不一样,那么就不能够使用自动推导,当然,也可以将两个编译器组合成一个编译器,让系统根据代码自己去选择相应编译器,这里将是如果想分开话,...
  • 12.1.1 代码生成程序在编译系统位置 12.1.2 设计代码生成程序基本问题 12.2 一个简单的代码生成程序 12.2.1 计算机模型 12.2.2 待用信息链表法 12.2.3 代码生成算法 12.3 几种常用的代码生成程序开发...
  • 编译原理及实践

    2008-02-22 15:59:27
    代码 310 8.2 基本的代码生成技术 312 8.2.1 作为合成属性的中间代码或目标 代码 312 8.2.2 实际的代码生成 314 8.2.3 从中间代码生成目标代码 317 8.3 数据结构引用的代码生成 319 8.3.1 地址...
  • 本书介绍编译器构造一般原理和基本实现方法,主要内容包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。除了介绍命令式编程语言的编译技术外, 本书还介绍面向对象语言和函数式编程语言...
  •  8.6 中间代码形式  8.7 属性翻译文法应用  8.8 小结  习题八 第9章 运行时存储组织与管理  9.1 数据区和属性字  9.2 基本数据类型存储分配  9.3 数组存储分配  9.4 记录结构存储分配  ...
  • make的使用和Makefile编写

    千次阅读 2017-01-30 20:46:30
    make的使用和Makefile编写 Linux环境下大型项目开发中,通常把整个系统划分为...它可以根据程序模块修改情况重新编译链接生成中间代码或最终可执行程序。执行make命令,需要一个名为“Makefile”或“makefil
  • 83中间代码的形式159 831逆波兰记号159 832三元式和树形表示160 833四元式161 84简单赋值语句翻译162 85布尔表达式翻译163 851布尔表达式翻译方法164 852控制语句中布尔表达式 ...
  • 标题有点长啊,很彪,所以我们叫彪题(咋地,东北地,你瞅啥)  1.带增高垫ILc# c#语言作为一种高级语言,是不能直接在我们...IL是将.NET代码转化为机器语言一个中间语言,因此又把IL语言称之为伪汇编语言。
  • 在最后,要感谢《自己动手写操作系统作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的了在Windows下编译Linux 0.11...
  • 但是其中一个日历模块,我是独自写成一个linux32为系统底下的动态连接库的,所以无法直接使用的网友(应该是CustomCalendar找不到的错误),去LAN_IM\IMClient\external\CustomCalendar里,自行编译成库,然后将...
  • 成果就是实现了一个已经在使用的在线评测系统,并给出了完成这个系统所需要的所 关键技术和设计步骤。 本论文的创造性不仅在于讨论了在 Linux 系统上实现评判核心单元的关键技术和 具体方法,还在于使用了较大...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 308
精华内容 123
关键字:

编译系统使用的中间代码有