精华内容
下载资源
问答
  • 句柄详解,什么是句柄?句柄有什么用?

    万次阅读 多人点赞 2018-10-25 19:44:23
    最近在做项目时遇到了句柄的概念,之前只知道在编译原理里有句柄的概念,在实际的编程时会经常用到句柄。 参考地址:https://www.cnblogs.com/zpcdbky/p/4652151.html 这里需要说明: 1.这里将句柄所能标识的所有...

    最近在做项目时遇到了句柄的概念,之前只知道在编译原理里有句柄的概念,在实际的编程时会经常用到句柄。

    参考地址:https://www.cnblogs.com/zpcdbky/p/4652151.html

    这里需要说明:

    1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

    2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

    3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

    让我们先看图,再解释。

          其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

    简单解释:

          Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

          系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

          所以,我们可以这样理解Windows句柄:

          数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

    下面,关于句柄,再交代一些关键性细节:

    1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

      其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

    2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

    3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

    4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

    写在后面:

    1.到此为止,有关Windows句柄就简单介绍到这里。需要说明的是,本文是面向初学者的,旨在让读者对句柄有一个完整而清晰的认知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源码的艰难晦涩。因此,本文并不能做到绝对的直达本质,同时也可能在个别细节上与真实情况稍有出入,但在下认为这并不贻害初学者对句柄的认识。因为对某一知识的认知,从几乎一无所知或是一知半解到“精通”,往往需要更多新知识的补充,短时间内很难达到,在不影响知识的使用的前提下,先把握整体,在逐步深入细节,不失为一个明智的选择。想进一步深入理解Windows句柄的读者,可以看在下的下一篇文章《源码剖析——深入Windows句柄本质》。

    2.在下知识有限,理解不深,如有错误纰漏之处,这里再三恳请大家一定要为在下指出。大家的批评指正是在下进步的源泉。

    展开全文
  • 编译原理试题

    2015-06-14 21:58:40
    2.什么是句柄?什么是素短语? 一个句型的最左直接短语称为该句型的句柄。(3分)素短语是这样的一个短语,它至少包含一个终结符并且不包含更小的素短语。(3分) 3.划分程序的基本块时,确定基本块的入口语句的...
  • 编译原理总结思维导图引论什么是编译程序?编译过程都包括哪些阶段?画出编译程序的结构框图.编译程序和解释程序的区别是什么?遍和阶段的概念,为什么要用遍?词法分析单词分类、词法分析的输入输出单词构词规则文法和...

    思维导图

    在这里插入图片描述

    引论

    什么是编译程序?

    把某一种高级语言程序等价的转换成另一种低级语言程序的程序

    编译过程都包括哪些阶段?

    词法分析、语法分析、语义分析与中间代码生成、中间代码优化、目标代码生成

    画出编译程序的结构框图.

    符号表管理程序——词法分析器 ————————错误处理程序
    语法分析器
    语义分析+中间代码生成器
    优化器
    目标代码生成器

    编译程序和解释程序的区别是什么?

    解释程序或者直接一边解释一边执行源程序,或者将源程序翻译成某种中间表示形式后再加以执行。控制权在解释器;
    编译程序则是将源程序翻译成目标语言程序,然后在计算机上运行目标程序,控制权在目标程序。

    遍和阶段的概念,为什么要用遍?

    遍:对源程序或中间表示从头到尾扫描一次,并作有关的加工处理,形程新的中间结果或目标程序
    一遍可有若干阶段,一个阶段可有若干遍
    分成若干遍为了让程序结构更清晰,使程序可读性更强。

    词法分析

    单词分类、词法分析的输入输出

    分类:基本字、标识符、常数、运算符、界符
    输入:源程序 输出:单词符号

    单词构词规则

    表示形式:单词种别+单词符号属性值
    单词种别常用整数编码表示:

    1、若一个种别只有一个单词符号:
    则种别编码就代表该单词符号,
    一般来说,基本字、运算符和界符都是一符一种。·若一个种别有多个单词符号,

    2、若一个种别多个单词符号:
    则对于每个单词符号,给出种别编码和属性信息。
    标识符单列一种:属性就是存放它的有关信息的指针。
    常数按类型分种:常数的值则表示成标准的二进制形式。

    文法和语言的概念及其相互推导

    语言:一个字母表的任意子集L称为该字母表的一个语言,语言中的一个值称为一个句子。
    文法:用来描述语言语法结构的形式规则。
    文法的语言:文法产生的所有终结符串构成的集合。

    最左和最右推导,求语法树

    最左推导:每次替换最左非终结符
    最右推导:每次替换最右非终结符

    语法树:每个节点是Vt、Vn,根节点是S、叶子节点是Vt

    二义性问题

    文法二义性:一个文法某个句子存在两棵语法树。
    语言二义性:存在一个文法有二义性问题。

    文法分类:

    如思维导图
    0、1、2、3型

    正规表达式、正规集:

    对字母表,若a是字母,a是一个正规集
    正规集的交、并、结合等都是正规集

    自动机

    简介:一个模型,逐个读取输入的符号,依据输入跳转到状态。

    DFA和NFA的构造

    1、正规式——DFA
    2、NFA确定化
    3、DFA最小化

    语法

    输入输出

    输入:单词符号
    输出:语法分析树

    自上而下的问题以及解决办法

    问题:左递归、回溯、虚假匹配、分析不成功,不知道出错的位置、效率低,代价高

    解决:左递归变右递归、提取左因子消除回溯、FIRST+FOLLOW、LL(1)、预测分析表

    自下而上的核心问题

    识别可规约串进行规约

    规范归约与最右推导

    规范规约:最右推导逆过程
    规范规约推导的句型:规范句型
    规范规约实质:出现句柄,就规约

    短语、直接短语、句型、句柄

    短语:语法树子树
    直接短语:语法树同一层的短语
    句型:含Vt或Vn的字符串
    句柄:最左直接短语

    前缀、活前缀、有效项目

    前缀:字符串前缀
    活前缀:句柄的一个前缀
    有效项目:活前缀A推导出的字符串B,B是A的有效项目
    项目集规范族:一堆项目,项目通过->构成一个DFA,DFA可以识别活前缀

    将语义分析放到语法分析中

    语法制导翻译

    将静态语义检查与中间代码生成结合到语法分析中进行。

    语法制导定义

    在上下文无关文法的基础上,为Vt、Vn配备了一组属性 ,为 Vn->Vt配备了一套语义规则。

    属性文法

    语义规则函数不具有副作用的语法制导定义。
    非副作用:只计算属性值

    S-L属性文法

    综合属性:在分析树节点N上的非终结符A,其综合属性只能通过N的子节点或N本身的属性定义。
    继承属性:在分析树节点N上的非终结符A,其继承属性只能通过N的兄弟、父节点或N本身的属性定义。
    S属性文法:一个语法制导定义只使用综合属性。
    L属性文法:一个语法制导定义只使用继承属性。

    翻译模式

    将属性(值)与文法符号(Vt、Vn)相关联,并将语义规则用“{}”亏起来,插入产生式右部的合适位置来描述语言结构。

    抽象语法树

    在语法树中去掉对翻译不必要的信息,从而获得更有效的源程序中间标识,这种经变换后的语法树成为抽象语法树。

    中间语言的表示与语法制导翻译实例

    为什么要用中间语言

    便于进行与机器无关的代码优化工作
    编译一致
    使程序的结构在逻辑上简单明确

    中间语言表示形式

    逆波兰表达式、三元式、间接三元式、四元式

    语句的翻译实例

    说明语句的翻译
    赋值语句的翻译
    控制语句的翻译

    符号表

    符号表构成

    名称栏
    信息栏:记录不同属性(类型、种属、大小、存储指针)

    符号表作用

    1、登记标识符属性信息
    2、查找符号属性,检查符号上下文语义合法性
    3、作为目标代码生成地址分配依据

    优化

    目的:

    产生更高效的代码

    原则:

    等价、有效、经济

    常用技术:

    如思维导图

    基本块概念

    程序中一个顺序执行的语句序列,其中只有一个入口和一个出口。入口是第一个语句,出口是最后一个语句

    目标代码生成

    表示形式

    机器语言,汇编语言,待装配机器语言模块

    各个形式的特点

    机器语言:所有地址已经定位。
    汇编语言:需经过汇编程序汇编,转换成机器语言。
    待装配机器语言模块:由链接程序把它们和某些运行程序链接,转换成机器语义。

    目标代码运行

    活动记录

    一段连续的存储区,用以存放过程的一次执行所需动态信息

    存储分配策略

    静态存储分配
    动态存储分配

    栈式存储分配

    1、静态链和活动记录
    2、嵌套层次显示表display

    堆式存储分配

    允许数据对象自由分配和释放

    展开全文
  • 编译原理复习

    2016-05-24 23:01:58
    短语、直接短语、句柄 最左素短语、语法树、直接推导 什么是0型文法,1型文法,2型文法,3型文法? LR(0),SLR


    产生式:产生式通常用于表示具有因果关系的知识,其基本形式为:P→Q 或者 IF P THEN Q


    短语、直接短语、句柄


    最左素短语、语法树、直接推导


    什么是0型文法,1型文法,2型文法,3型文法?


    LR(0),SLR


    二义性        二义性+左递归 2


    造成二义性的原因是:文法中没有体现出结合率和优先级


    自顶向下的语法分析技术不能处理左递归的情况,因此需要消除左递归;但是自底向上的技术可以处理左递归。



    Aα1 | Aα2 |…| Aαm | β1  | β2 |… |  βn可以替换为


    β1A’ | β2A’|… |  βn A’
    α1A’ | α2A’ |…| αmA’ | ε

    展开全文
  • 2.什么是过程活动记录AR? 3. 将语句翻译成四元式。 二、综合题 1. 文法 找出所有短语、简单短语、句柄 证明文法的二义性 2. 构造相应的NFA或者DFA 3. 预测分析 消除左递归; 构造相应的FIRST、FOLLOW和SELECT...
    展开全文
  • 编译原理学习笔记(七)~LR(0)分析

    千次阅读 2020-04-16 13:10:07
    项目描述了句柄识别的状态 产生式A→ε 只生成一个项目A→ · 增广文法 解释:如果G 一个以S为开始符号的文法,则G的增广文法 G’ 就 在G中加上新开始符号S’ 和产生式S’ → S而得到的文法 举例: 为什么要...
  • 编译技术预习笔记

    2020-03-01 15:08:46
    关于什么是句柄,参照如下:采用最左规约,句柄是句型的第一个规约 编译原理中:短语,直接短语,句柄 自底向上语法分析 2.29-3.1 LR(0) 拓广文法,画项集族,再构造语法分析表 SLR Simple ,规约时若当前符号不在 fo....
  • Java跨平台:一次编译到处运行原理因为安装了不同文件操作系统的JDK(JVM), 字节码(class)文件适配不同底层的操作系统(不同操作系统的文件操作/描述符不同,不同操作系统的句柄也不同),所以通过字节码.....
  • 1.1 什么是Windows Sockets 1.2 Windows Sockets的发展历史 1.3 Windows Sockets的优势 1.3.1 Windows Sockets是一个开放的标准 1.3.2 Windows Sockets提供源代码可移植性 1.3.3 Windows Sockets支持动态链接 1.3.4 ...
  • 编程新手真言......

    2009-04-02 20:25:15
    2.4 联系编译原理学语言 56 2.6 如何理解运行时 59 2.7 运行时环境 60 2.7 运行时 60 6.3 语言的类型系统 60 2.8 编译与解释 62 2.9 运行期与编译期 62 2.9 编译与运行期分开的本质与抽象 63 2.10 脚本语言 63 2.11 ...
  • 1.7.1 什么是句柄 1.7.2 窗口句柄 1.7.3 设备环境句柄 1.8 如何找到所需要的API 第2章Win32API函数调用 2.1 字符集 2.1.1 Win32API使用的字符集 2.1.2VisualBasic与字符集 2.2 字符串参数的传送 2.2.1 ...
  • 8.2 什么是优化 338 8.3 查询优化器如何研究查询计划 339 8.3.1 规则 339 8.3.2 属性 339 8.3.3 替代项的存储——“备注” 341 8.3.4 运算符 341 8.4 优化器架构 346 8.4.1 优化之前 347 8.4.2 ...
  • 8.2 什么是优化 338 8.3 查询优化器如何研究查询计划 339 8.3.1 规则 339 8.3.2 属性 339 8.3.3 替代项的存储——“备注” 341 8.3.4 运算符 341 8.4 优化器架构 346 8.4.1 优化之前 347 8.4.2 ...
  • Reversing:逆向工程揭密

    热门讨论 2010-06-21 17:00:47
    1.1 什么是逆向工程 3 1.2 软件逆向工程:逆向 4 1.3 逆向应用 4 1.3.1 与安全相关的逆向 5 1.3.2 软件开发中的逆向 8 1.4 底层软件 9 1.4.1 汇编语言 10 1.4.2 编译器 11 1.4.3 虚拟机和字节码 12 1.4.4 操作系统 ...
  • 1.2.3 什么是句柄 1.2.4 Windows 9x与Unicode 1.2.5 Windows NT/2000/XP与Unicode 1.2.6 Windows 消息机制 1.3 保护模式简介 1.3.1 虚拟内存 1.3.2 保护模式的权限级别 1.4 认识PE格式 第2篇 调试篇 第2章 动态...
  • 9.5.1 什么是窗口的子类化 316 9.5.2 窗口子类化的实现 317 9.6控件的超类化 323 9.6.1 什么是控件的超类化 323 9.6.2 控件超类化的实现 324 第4篇 系统篇 329 第10章 内存管理和文件操作 330 10.1 内存管理 330 ...
  • 9.5.1 什么是窗口的子类化 316 9.5.2 窗口子类化的实现 317 9.6控件的超类化 323 9.6.1 什么是控件的超类化 323 9.6.2 控件超类化的实现 324 第4篇 系统篇 329 第10章 内存管理和文件操作 330 10.1 内存管理 330 ...
  • 9.5.1 什么是窗口的子类化 316 9.5.2 窗口子类化的实现 317 9.6 控件的超类化 323 9.6.1 什么是控件的超类化 323 9.6.2 控件超类化的实现 324 第4篇 系统篇 第10章 内存管理和文件操作 330 10.1 内存管理 330 10.1.1...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行...
  • 1.3.6 编译、链接和运行 第二章 unicode简介 2.1 字符集简史 . 2.1.1 美国标准 2.1.2 国际方面 2.1.3 扩展ascll 2.1.4 双字书字符集 2.1.5 unicode解决方案 2.2 宽字符和c 2.2.1 char数据...
  • 1.3.6 编译、链接和运行 第二章 unicode简介 2.1 字符集简史 . 2.1.1 美国标准 2.1.2 国际方面 2.1.3 扩展ascll 2.1.4 双字书字符集 2.1.5 unicode解决方案 2.2 宽字符和c 2.2.1 char数据...
  • 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时...
  • 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时...
  • 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时...
  • 2.3.4 编译结果 7 2.4 AndroidManifest.xml文件 7 2.4.1 一开始根元素 8 2.4.2 权限、编排和应用程序 8 2.4.3 应用程序总要做点什么 9 2.4.4 确保最大兼容性 10 2.4.5 版本=控制 10 2.5 模拟器和...
  • 4.7.1 什么是IOAPIC 90 4.7.2 如何访问IOAPIC 91 4.7.3 编程修改IOAPIC重定位表 92 4.7.4 插入新的中断处理 93 4.7.5 驱动入口和卸载的实现 95 4.8 直接用端口操作键盘 96 4.8.1 读取键盘数据和命令端口 96 4.8.2 p2...
  • 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24 2.4.2 异常处理 25 2.5 数据抽象 ...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

编译原理什么是句柄