页面描述语言与格式第二章.ppt

上传人:牧羊曲112 文档编号:5888385 上传时间:2023-08-29 格式:PPT 页数:140 大小:1,013KB
返回 下载 相关 举报
页面描述语言与格式第二章.ppt_第1页
第1页 / 共140页
页面描述语言与格式第二章.ppt_第2页
第2页 / 共140页
页面描述语言与格式第二章.ppt_第3页
第3页 / 共140页
页面描述语言与格式第二章.ppt_第4页
第4页 / 共140页
页面描述语言与格式第二章.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

《页面描述语言与格式第二章.ppt》由会员分享,可在线阅读,更多相关《页面描述语言与格式第二章.ppt(140页珍藏版)》请在三一办公上搜索。

1、页面描述语言与格式,PostScript&PDF,甘朝华,第二章 PostScript语言的基本特点,ASCII编码与注释表示 数据类型与对象 PostScript程序的执行环境 PostScript对象的执行方式 早期名字联编的概念与具体实现 常用操作符 PostScript资源、函数和过滤器,语法、数据类型和执行语义是任何一个 PostScript程序的三个基本方面,加上以后章节中描述的PostScript语言的图形、图像和文字功能,使得PostScript语言能够胜任控制打印页面处理的任务。本章主要介绍PostScript语言作为通用程序设计语言的特点,PostScript语言吸收了其他

2、几种优秀程序设计语言的元素与思想。采用“前缀”表示法,即操作数在前,操作符在后。,尽管PostScript语言内置的操作符很多,但操作符的名字在语言中并不是固定的,在PostScript程序中可通过重定义的方法来改变操作符的含义。数据类型包括一些在许多现代程序设计语言中都有的元素,如数值、串和数组,同时还能够把程序作为数据进行处理,以及控制语言执行状态许多方面,这些方法来源于 LISP等其他程序设计语言。,PostScript语言语法比较简单,而功能非常强大。它的强大功能来自于它能够不受任何限制地以任意方式组合它的各项特征。利用 PostScript 语言的这些功能人们可以设计出复杂的图形应用

3、程序,否则这些程序很难甚至不可能用于创造复杂图形。,本章将系统地介绍 PostScript 语言作为通用程序设计语言的每个方面:语法 数据类型执行语义内存组织简要介绍文件输入和输出命名资源过滤器文件,2.1 ASCII编码与注释表示,PostScript语言有三种编码方式:ASCII、二进制标记和二进制对象序列。ASCII编码容易读且不依赖于通信应用中所保留的特殊字符,它适用于阐述目的、存储文件及各种通信设备间的信息传递。两种二进制编码则采用较少字符的二进制标记或压缩方法来表示 PostScript 对象,常应用在控制环境中用于改善程序表示或执行的效率。在任何一个 PostScript 程序中

4、,这三种编码方式可混合使用。,2.1 ASCII编码与注释表示,ASCII 编码:ASCII是American Standard Code for Information Interchange的简称。这是一种广泛采用的用于表示二进制数据的编码方式,它由一套标准的字符集组成。用于PostScript程序ASCII编码表示的标准字符集包括大写和小写的26个英文字母、10个数字和特殊符号等所有可打印字符,以及空格、制表符、回车和换行符等“空白”字符。,2.1 ASCII编码与注释表示,ASCII 编码:PostScript程序使用的ASCII字符。依据作用分成三类:空白字符特殊字符注释,2.1 A

5、SCII编码与注释表示,ASCII 编码:空白字符空白字符的作用是用于分隔其他语法实体,2.1 ASCII编码与注释表示,ASCII 编码:特殊字符 特殊字符是指“(”、“)”、“”、“”、“”、“”、“”、“”、“/”和“%”。它们用来分隔语法实体,如串、数组、过程、词典、具字面属性的名字、注释。任何一个特殊字符都表示位于它们之前的实体已经结束。,2.1 ASCII编码与注释表示,ASCII 编码:注释 在任何一个计算机语言程序中,为了增加程序的可读性,通常在程序中添加注释。PostScript程序中的注释由特殊字符“%”引导,并以新行符结束。注释不对程序的结果起任何作用,%example1

6、.ps/nx l def%定义 nx 的值为 1 nx 4 add%nx+4=5=%把刚才的计算结果输出到标准输出文件中,2.2 数据类型与对象,概述:当一个扫描程序扫描PostScript语言程序正文的时候能产生各种不同类型的PostScript对象,如数值、串和过程。,2.2 数据类型与对象,概述:对象的概念与特点 在PostScript程序中,所有可被PostScript解释器访问的数据均称为PostScript对象。对象的产生:通过扫描程序产生 PostScript 对象并由解释器执行;由PostScript操作符产生、管理和撤消。对象的构成三要素:一个类型、某些属性、一个值。对象的类

7、型是对象本身所固有的特性,与该对象的存放地点和如何描述无关。,2.2 数据类型与对象,概述:对象的概念与特点 PostScript所支持的所有对象类型包括名字、布尔型、整数和实数、串、数组、词典、过程、操作符、标记、空、Save对象,FontID 文件、图形状态(gstate)、压缩数组等。,2.2 数据类型与对象,概述:对象分类 PostScript 对象的类型多种多样,根据各对象三要素是否结合在一起的特点不同,把PostScript对象分成两大类:简单对象和复合对象。简单对象是指本身不能再分解成更多对象的 PostScript 对象。无子结构、三要素结合在一起,保存在“操作数栈”存储区域。

8、,第三周,2.2 数据类型与对象,概述:对象分类 复合对象是指一些内部结构还可再细分为一个或多个PostScript对象的对象。有可见的内部子结构、可有选择地对它们进行修改;其值与类型、属性分开存储在内存的不同地方,其中值存放在存储器的一个称为“虚存”的特殊区域中,而对象本身则存放在操作数栈中。,2.2 数据类型与对象,概述:对象分类,简单对象和复合对象最重要的区别就在于复制对象时所产生的结果不一样:(abc)(abc)1(d)put(abc)dup 1(d)put,(abc)(abc)两个不同的串(abc)dup 一个串的两个拷贝,2.2 数据类型与对象,概述:对象分类,2.2 数据类型与对

9、象,对象的属性:每一个PostScript对象都有一个或多个属性。在执行对象或对对象进行某个特定操作时 这些属性将影响操作所产生的结果。在把对象严格地作为数据处理时,对象的属性又不影响对其进行操作所产生的结果(如,变量的名字与值)。,2.2 数据类型与对象,对象的属性:字面属性和可执行属性 每一个对象至少有一个属性。字面属性或可执行属性。(1)整型、实型、字符串、数组、词典均只具有字面属性,均被当作数据压入操作数栈;(2)如果名字对象以“/”开始,则该名字具有字面属性,否则具有可执行属性;(3)过程和操作符都只具有可执行属性。,2.2 数据类型与对象,对象的属性:字面属性和可执行属性(1)执行

10、一个可执行的名字,将导致在当前词典(缺省为用户词典)的上下文中查找该名字,并执行其相应的值;(2)执行一个可执行的操作符就完成一次内部动作;(3)执行一个可执行的过程对象,就使得过程中的元素依次被执行。执行一个对象的含义依赖于对象的类型和属性,2.2 数据类型与对象,对象的属性:存取属性 对象的另外一个属性是存取属性,只有复合对象才具有存取属性。该属性用于限制对对象值的操作,共有以下四种:1、无限制属性2、只读属性3、只执行属性4、空-无直接用处,2.2 数据类型与对象,对象的属性:存取属性 属性是对象自身的特性而不是其值的特性:两个复合对象能够共享同一个值但可以具有不同的字面属性与可执行属性

11、或存取属性;词典对象的存取属性是其值的特性,所以共享一个值的多个词典对象有同样的存取属性。,2.2 数据类型与对象,PostScript对象详述:简单对象数值:整数和实数整数60、-80、0、+12、8998实数0.3、-90、1.0、0.0进制表示:base#number(其中,base为236,number是base进制中的基础数值,它必须是由值在0base-1之间的数字组成,大于9的数字用字母“AZ”(或“az”)来表示)。,八进制数 8#1675十六进制数 16#ADFF二进制数 2#1010,2.2 数据类型与对象,PostScript对象详述:简单对象名字:变量,用于表示名字对象的

12、标识符可由任何常规字符组成。如,9A4、B7、2-9B、4.A、$、a.b、$MyDict、pattern对于名字对象来说,它本身并没有值,但却可以与词典中的值相对应,构成一个关键字与值对。与名字对象相对应的值可以是任意的 PostScript 对象。,例如,/nx1 1 def 表示字面属性的名字nx1,它与用户词典中的数值 1 对应,2.2 数据类型与对象,PostScript对象详述:简单对象操作符:操作符对象代表着PostScript语言的内部操作,执行一个操作符对象便是激活一个内部操作,操作符对象相当于一个特殊的名字对象 它与系统词典中的某一个值相对应,其值对应于一种内部操作。比如,

13、add操作符:两个数值相加,2.2 数据类型与对象,PostScript对象详述:简单对象布尔型(boolean):与其他计算机语言一样 PostScript语言也提供了布尔对象,其值分别为 true和false系统词典中的名字对象true和false所对应的值便是这两个布尔对象。布尔对象通常也是关系操作符或逻辑操作符的运行结果,同时也可能是执行其他操作符后所返回的值。,布尔对象一般用于条件表达式和逻辑表达式中,主要用作控制操作符 if 或 ifelse 的操作数,2.2 数据类型与对象,PostScript对象详述:简单对象空对象(Null):PostScript 语言提供了一个称为空的对象

14、,该对象不含任何具体内容。空对象只有一个值为null名字对象,null与系统词典中的空对象相对应。应用在:复合对象中的空位置或未初始化的位置。大多数操作符不能以空对象作为其操作数。,2.2 数据类型与对象,PostScript对象详述:简单对象标记(mark):标记是一个特殊对象,用于标记操作数栈中的位置,它只有一个值,且总是通过调用mark、“”、“”这三个操作符来创建。,2.2 数据类型与对象,PostScript对象详述:复合对象串:PostScript语言中的串是一个复合对象,它具有三种表示形式:由(和)括起来的字符正文串,通常用于保存正文;由括起来的用十六进制编码的数据描述的串;由括

15、起来的 ASCII based85 编码数据构成的串。,2.2 数据类型与对象,PostScript对象详述:复合对象串:字符串 除了特殊字符“”、“(”、“)”以外的任何字符均可以作为串元素出现在串中,而这三个特殊字符将用作其他的特殊目的。(This is a string with special char%#|)()(It contains a string(hello)(This is a string n),2.2 数据类型与对象,PostScript对象详述:复合对象串:字符串“”用作“转义符”,以满足一些特殊目的。例如一些不可打印的字符,不配对的括号或“”字符本身,如果紧跟“”字

16、符后面的字符不是表 2-3 中所示情形中的某一种,那么就忽略。,2.2 数据类型与对象,PostScript对象详述:复合对象串:十六进制编码串 十六进制编码串是由括起来的用十六进制编码的数据描述的串,串中的内容是一组十六进制字符,即数字09和字母AF(或af),其中的每两个十六进制数表示串中的一个字符。字符的组合从左到右进行,如果最后只剩下一个字符,则右边补 0;另外,存在于串中的空格忽略不计。,90、1f、30 ASCII值:144、31、163,2.2 数据类型与对象,PostScript对象详述:复合对象串:ASCII based85 编码串 ASCII based85编码串由括起来的

17、一串可打印的ASCII字符组成,这一编码方式仅由Level 2和Level 3支持,且通常用在过滤器中。,2.2 数据类型与对象,PostScript对象详述:复合对象数组:PostScript语言中的数组是可以通过数值索引进行访问的对象的一维集合,由特殊字符“”和“”括起来表示。数组对象不同于其他计算机语言中的数组,其中的数组元素可以具有不同的数据类型。即数组对象中所包含的元素可以是任何的PostScript对象。,120 abc(xyz)150 4.0,索引值从0开始,如何表达多维数组?,2.2 数据类型与对象,PostScript对象详述:复合对象过程:PostScript语言中的过程相

18、当于其他计算机语言中的函数,它由特殊字符“”和“”括起来表示,所有包含在“”和“”中的内容构成一个过程对象,如sub 2 add。,过程 与 数组?,执行属性 与 字面属性,过程对象的 推迟执行?,/result sub 2 add def/x 5 4 result def/x 3 1 result def,2.2 数据类型与对象,PostScript对象详述:复合对象词典:由特殊字符“”和“”括起来表示的一种数据类型称为词典,包含在特殊字符中的内容是成对的PostScript对象,每一对PostScript对象又分为关键字与值,其第一个PostScript对象作为关键字,第二个PostScr

19、ipt对象作为对应的值。关键字通常是有字面属性的名字对象,但也可以是除 null 以外的所有 PostScript 对象;,2.2 数据类型与对象,PostScript对象详述:复合对象词典:值则可以是任意PostScript 对象。1)系统词典(Systemdict)2)全局词典(Globaldict)3)用户词典(Userdict),2.2 数据类型与对象,PostScript对象详述:复合对象词典:访问字典的三种方法:(1)使用访问指定词典的操作符,词典名作为其操作数(2)通过一些隐式地访问当前词典的操作符(3)解释器在执行程序过程中遇到可执行名字对象时自动地去查找词典,2.2 数据类型

20、与对象,PostScript对象详述:复合对象文件:文件是一个可读或可写的字符流,用于在PostScript解释器和它的环境之间进行数据的递与交换,文件中的字符内容可以作为磁盘文件永久地存贮起来,也可以在 PostScript 程执行过程中动态生成并经由通信通道进行传递。,2.2 数据类型与对象,PostScript对象详述:复合对象其他对象:压缩数组一个普通数组的压缩表示标记save内存状态的快照,由save和restore创建管理。FontID 用于构造字库的特殊对象gstate表示一个完整的图形状态,2.3 PostScript 程序的执行环境,执行环境指的是PostScript语言程序

21、在执行过程中,其数据或对象的存取环境。从PostScript语言的角度把内存划分为四大块:堆栈、虚存、标准输入输出文件及图形状态。1、堆栈用于存放各种 PostScript 对象,同时,根据栈中存放对象的不同,把堆栈又细分为操作数栈、词典栈、执行栈、图形状态栈与裁剪路径栈;2、虚存则是用于存放复合对象的值的一块存储区;,2.3 PostScript 程序的执行环境,3、标准输入输出文件是PostScript程序与用户终端或另一台计算机进行实时数据与信息交换时的通讯信道;4、图形状态则是用于存放图形状态参数的一块内存空间,而图形状态参数是一组在光栅输出设备上生成正文和图形时的控制参数(图形状态在

22、页面图形描述部分进行介绍)。,2.3 PostScript 程序的执行环境,PostScript程序在执行之前拥有一个缺省的初始执行环境,在程序执行期间,其执行环境会随着程序执行的进程而发生变化。当一个 PostScript程序执行结束后,PostScript的执行环境就恢复到默认状态,为下一个程序的执行作准备。,2.3 PostScript 程序的执行环境,堆栈:堆栈是PostScript语言程序执行时用于存放各类PostScript对象的一块内存区域。PostScript解释器管理着五种不同的表示PostScript程序执行状态的堆栈,即操作数栈、词典栈、执行栈、图形状态栈与裁剪路径栈,这

23、五种堆栈是相互独立的,而且对其中所存放的数据内容的使用方式也各不相同。“先进后出,后进先出”,2.3 PostScript 程序的执行环境,堆栈:操作数栈 操作数栈用来保存各种用作操作数的PostScript对象以及某些操作符的执行结果。操作数栈直接受当前所执行的PostScript程序的控制,栈中存放的各类PostScript对象可由多个操作符任意地压入和弹出。,2.3 PostScript 程序的执行环境,堆栈:操作数栈 执行程序过程:如果遇到的是具字面属性的PostScript对象,解释器就把该对象压入操作数栈;当操作符需要一个或多个操作数时,解释器就从操作数栈顶弹出一个或多个PostS

24、cript对象以获取这些操作数;当操作符返回一个或多个结果时 解释器就把它们依次压入到操作数栈顶。在一个PostScript程序执行的初始状态下 操作数栈中没有任何PostScript对象。,2.3 PostScript 程序的执行环境,堆栈:词典栈 词典栈只用于保存词典对象。词典栈中的当前词典为所有名字的定义与搜索提供了环境。在程序执行的初始环境中,词典栈中从下至上依次存放着三个标准词典,即系统词典、全局词典和用户词典,位于栈顶的用户词典是缺省的当前词典。,/a def,2.3 PostScript 程序的执行环境,堆栈:执行栈 执行栈用于保存可执行对象,主要是过程对象和文件对象。执行栈完全

25、在解释器的控制之下,其中的内容由解释器在执行程序的过程中压入或弹出,它能被 PostScript 程序所阅读,但不能被修改。,2.3 PostScript 程序的执行环境,堆栈:对一个PostScript对象的压入操作,简单对象和复合对象的具体作用结果不同:1、当一个简单对象被压入堆栈时,解释器便从获得该对象的地方复制得到一个新对象,并把复制的对象压入相应的堆栈;2、当一个复合对象被压入堆栈时,则解释器只复制该对象的类型和属性得到一个新对象,并将它压入到堆栈中,但新对象的值并不压入到堆栈中,而是与原对象共享相同在虚存中的值。,对于所有堆栈来说,它们各自所能容纳的对象数目是有限制的,2.3 Po

26、stScript 程序的执行环境,虚存:我们所谓的“虚存”一词,其含义不同于把硬盘空间当作内存使用而得到的“虚拟内存”,它是一块真正的内存,只是从PostScript语言对该块内存区域使用角度的不同而命名为虚存。,2.3 PostScript 程序的执行环境,虚存:虚存的概念 复合对象存放在堆栈中,其值则存放在称为“虚存”的另一块内存区域中,由此可见虚存就是存放复合对象的值的一块内存区,通常可简写为 VM(Virtual Memory)。,(here is a string)50 40 add 3 div,2.3 PostScript 程序的执行环境,虚存:VM 的申请方式 由于虚存是复合对象

27、值的存储区,所以创建一个复合对象就需要申请一块虚存空间用于存放它的值。通常,虚存空间的分配与管理是由PostScript语言程序控制的,每一复合对象的值所需的空间可通过以下两种方式进行申请:1、直接在创建复合对象时由扫描程序隐式申请;2、用操作符显式申请。,操作符:array、Packedarray、dict、string和gstate和、如,4 array 6 string 60 dict,2.3 PostScript 程序的执行环境,虚存:虚存分类 根据存放在虚存中的值的存在期限的不同 用于存放复合对象的虚存可分为局部VM和全局VM两种。1、局部VM:局部VM用来存放那些只在程序执行过程的

28、某一段时间内才使用的复合对象的值;,对局部VM的使用和修改操作可由操作符 save 和 restore 封装起来,2.3 PostScript 程序的执行环境,虚存:虚存分类2、全局VM:全局VM用于存放在程序的整个执行期间或一个结构化分区中(如一个页面)一直存在和使用的复合对象的值。,true setglobal/mydict 5 dict def/str1(text)def false setglobal/str2(text2)def,mydict/a str1 put mydict/b str2 put mydict/c 4 put,2.3 PostScript 程序的执行环境,虚存:s

29、ave 和 restore 操作符的作用与使用技巧 save操作符为局部VM中的内容拍一张快照,它返回一个代表这张快照的save对象;restore操作符使局部VM中的内容恢复到由它所对应的前一个save所保存的快照内容,这两个操作符必须成对使用。restore操作符的具体作用表现为以下四个方面:1、restore删除自对应的save以来在局部VM中所建立的所有对象,并回收它们所占用的所有内存空间;,2.3 PostScript 程序的执行环境,虚存:save 和 restore 操作符的作用与使用技巧 restore操作符的具体作用表现为以下四个方面:2、restore将局部VM中所有复合对

30、象的值恢复到对应save前状态,但字符串除外;3、restore隐含地执行grestoreall它将图形状态恢复到save前的状态;4、restore关闭对应save以来在局部VM分配模式下打开的文件。除了上述几方面的影响以外,restore不对其他任何对象或存储空间产生影响。,save save save restore restore restore,2.3 PostScript 程序的执行环境,虚存:save 和 restore 操作符的作用与使用技巧,什么时候使用save和restore操作符?,2.3 PostScript 程序的执行环境,虚存:save 和 restore 操作符的

31、作用与使用技巧 保持页与页之间的描述独立性;封装插入的外部图;显式地回收虚存空间。,2.3 PostScript 程序的执行环境,虚存:利用废料收集回收虚存 用save和restore可以显式地回收被占用的局部虚存空间。在Level 2中还有一种自动回收虚存的方法,这种自动回收虚存空间的机制称为“废料收集”。废料收集的主要功能就是隐式地回收那些不能再被PostScript语言程序所利用的复合对象所占用的内存空间。,/a(abc)def/a(edf)def(it is a test)show,2.3 PostScript 程序的执行环境,标准输入输出文件:PostScript解释器总是通过文件来

32、获得可执行的PostScript程序,同时也是通过文件与外部环境进行数据交换。这样的文件也是作为PostScript对象使用的,它是一个由结束符(EOF)作为终止内容的有限字符序列。文件中的字符可能永久地存放在一个磁盘文件中也可能在程序执行过程中动态地生成并经由通信通道实时地进行传输。,2.3 PostScript 程序的执行环境,标准输入输出文件:输入文件:PostScript程序能够从中读取字符序列的源文件。输出文件:PostScript程序可以往其中写字符的目标文件。标准输入输出文件是两个特殊的文件,它们作为PostScript程序的执行环境而始终存在,不需要在程序中人为地创建或关闭它们

33、。,2.3 PostScript 程序的执行环境,标准输入输出文件:标准输入文件:是一个由PostScript解释器所执行的程序正文,即当前需要解释执行的PostScript源程序文件。标准输出文件:是用于存放print操作符或=操作符的输出信息及错误信息和执行状态信息的一块内存区域。,2.3 PostScript 程序的执行环境,标准输入输出文件:例子%!ps EPSF-3.0/str 20 string def 123 456 add str cvs print(text)=,2.3 PostScript 程序的执行环境,标准输入输出文件:在PostScript语言程序中,每个所访问的文件

34、均需采用一定的标识符来表示,标准输入文件用%stdin表示,标准输出文件用%stdout表示,其他普通文件均采用%device%filename或%filename 来表示。,2.3 PostScript 程序的执行环境,PostScript程序的初始执行环境特点:PostScript解释器的传统模式是一个“打印服务器”它以单线程处理的方式接受并执行一系列“打印作业”,每个“打印作业”都是一个完整而独立的PostScript 程序。,2.3 PostScript 程序的执行环境,PostScript程序的初始执行环境特点:初始执行环境具有以下特点:(1)一个空的操作数栈;(2)一个包含了三个标

35、准词典的词典栈;(3)执行栈;(4)虚存申请模式缺省为局部虚存;(5)一个包含缺省图形状态参数的图形状态.通常,在每个PostScript程序的执行过程中,其执行环境将随着程序的执行而发生变化。但当一个作业完成后PostScript解释器执行环境恢复到初始状态,为下一个“打印作业”作准备。,2.3 PostScript 程序的执行环境,PostScript程序的初始执行环境特点:完成一个PostScript程序的执行,需要经过下述六个步骤:(1)创建标准输入/输出文件对象;(2)隐式地执行最外层的save,它不同于前面提到的普通save操作符,它可同时获取全局虚存和局部虚存中存放内容的快照;(

36、3)为解释器建立默认的初始执行环境;(4)执行标准输入文件,直到遇到该文件的文件结束符或出现错误为止,若程序中存在语法错误,则会报告错误信息并终止程序的运行;,2.3 PostScript 程序的执行环境,PostScript程序的初始执行环境特点:完成一个PostScript程序的执行,需要经过下述六个步骤:(5)隐式地执行 restore 操作符,使全局虚存和局部虚存中的内容恢复到步骤(2)中存放的状态;(6)关闭标准输入输出文件,传送文件结束标记。,2.4 PostScript对象的执行方式,对于不同的PostScript对象,其执行语义是不同的,而且执行方式和时间也各不相同。总的来说,

37、PostScript解释器对对象的解释执行分为两种:立即执行和推迟执行。,2.4 PostScript对象的执行方式,立即执行:立即执行的工作原理30 50 add 2 div,2.4 PostScript对象的执行方式,立即执行:关于操作数的次序 当一个操作符需要两个或两个以上的操作数时,其操作数的获取按从左到右出现的先后次序来进行,即考虑栈顶将要使用的两个或两个以上的对象时,先压入操作数栈的对象将成为该操作符的第一个操作数,最后压入的对象作为最末一个操作数,而操作符弹出各操作数的次序刚好相反。同样,如果操作符的执行结果不止一个对象,则第一个压入的对象就是第一个结果,依次类推。,2.4 Po

38、stScript对象的执行方式,推迟执行:对于 PostScript 程序来说,其中常常包含了名字与过程对象的定义。/average add 2 div def 30 50 average,执行过程?,2.4 PostScript对象的执行方式,各类对象的执行特点总结:具字面属性的对象 解释器遇到具有字面属性的对象时,不管其类型如何,总是把它当作数据来处理,即由解释器压入到操作数栈中。这些对象包括整数、实数、布尔值、词典、数组、具字面属性的名字对象、标记、save和fontID 等。,2.4 PostScript对象的执行方式,各类对象的执行特点总结:过程对象 解释器直接遇到具有可执行属性的过

39、程对象时,就把过程当作数据压入操作数栈,当过程对象作为执行名字等其他对象的作用结果而间接遇到时,该过程对象才会被调用而执行,调用过程对象时先把该过程对象压入执行栈,然后依次执行其中的元素。当过程中的所有元素被执行后,解释器就把该过程对象弹出执行栈 并把执行结果压入操作数栈。,2.4 PostScript对象的执行方式,各类对象的执行特点总结:可执行名字对象 解释器遇到可执行名字对象时,就在词典栈的当前词典中查找其对应的值,如果找不到 则紧接着在下面的词典中查找,如果在所有词典中均找不到该名字及其对应的值,则执行undefined错误,如果在某个词典中找到了作为关键字的名字,就执行其相应的值,在

40、执行操作之前,解释器将先检查其值的类型和属性,并按照指定类型的方式完成相应的操作。,2.4 PostScript对象的执行方式,各类对象的执行特点总结:操作符对象 解释器遇到可执行的操作符对象时,就在词典栈的系统词典中找到相应的名字与值对执行其值就完成一个内部操作。如对两数相加的操作,画一条直线的操作等。,2.4 PostScript对象的执行方式,各类对象的执行特点总结:文件对象 解释器遇到可执行的文件对象时,就把它压入到执行栈,然后从文件中读取字符并把它们解释为PostScript对象,当解释器遇到文件结束符时,就关闭该文件并把它从执行栈中弹出。,2.4 PostScript对象的执行方式

41、,各类对象的执行特点总结:空对象 解释器遇到可执行的空对象时,将不作任何操作,甚至不把该空对象压入操作数栈。,2.5 早期名字联编的概念与具体实现,PostScript程序的解释执行包括两个过程:首先是由扫描程序读取PostScript程序中的一个语法实体,并把它解释为一个PostScript对象,然后交给解释器。/average add 2 div def 每执行一次average对象,都需查阅可执行名字 add 和 div 的值。这是PostScript语言的一个重要特征,称为“推迟联编”。,推迟联编:在遇到某些对象的多次调用时就需做多次重复工作,使得工作效率降低,运行速度减慢。,提出“早

42、期名字联编技术”bind操作符 即演名字,2.5 早期名字联编的概念与具体实现,即演名字:即演名字就是在其名字前加了两个斜杠的名字对象,它是实现早期名字联编的一种技术手段,是针对那些值不是操作符的名字对象而言的。当解释器遇到即演名字时,就立即从词典栈中查阅该名字对应的值,并用相应的值替换该名字对象,但此时并不执行该名字的值。,2.5 早期名字联编的概念与具体实现,即演名字:即演名字具有两方面的使用特点:(1)对于那些值不是操作符的名字对象,使用该技术进行早期联编,可以提高程序的运行速度。(2)对于一些值固定不变的名字对象,使用该技术进行早期联编,可防止这些对象因误操作而修改。对于值为操作符或值

43、会在程序执行过程中会发生变化的名字对象,不能使用即演名字。,%!ps EPSF-3.0/PI 3.14159 def/result add/PI div def 5 result=,2.5 早期名字联编的概念与具体实现,bind 操作符:使用bind操作符是实现早期名字联编的另一种方式,该操作符的作用结果可能会改变原过程对象,其修改替代的方式具体有两种:操作符替代和 idiom 识辨。,2.5 早期名字联编的概念与具体实现,bind 操作符:操作符替代 bind 操作符是针对它所作用的过程对象中凡值为操作符的可执行名字而进行的。,/average add 2 div bind def,2.5

44、早期名字联编的概念与具体实现,bind 操作符:操作符替代优点:(1)使名字对应的值不变。(2)提高 PostScript 程序的运行速度。bind操作符只对值为操作符的可执行名字起作用,如果此类名字在执行bind操作符之前已经被重新定义过,则该操作符也不对这一名字对象起作用,也就是说凡是由用户定义的名字对象都不会受到 bind 操作符的影响。,2.5 早期名字联编的概念与具体实现,bind 操作符:idiom 识辨 在Level 3版本bind操作符除了把过程中的名字对象替换为相应的操作符外,紧接着它还将完成另一项工作,这一操作过程称之为idiom 识辨。idiom识辨的目的是用其他过程去替

45、换某些我们称之为 idiom 的过程,最典型的替代过程就是那些能产生更高执行效率但又具有相同功能的过程对象。,2.5 早期名字联编的概念与具体实现,bind 操作符:idiom 识辨 idiom 过程及其替代过程保存在IdiomSet 资源实例中,一个IdiomSet实例实际上就是一个过程替换词典,它包含了一个特殊应用程序的序言所需的 idiom。,%临时关闭 idiom 识辨功能currentuserparams/IdiomRecognition get%在堆栈中保存其当前值 setuserparams%定义一个 IdiomSet 资源实例名为 AdobeWinDriver 其中只包含一个替

46、代过程/AdobeWinDriver/IdiomSet defineresource pop setuserparams%恢复 idiom 识辨到原状态,2.6 常用操作符,堆栈操作符:操作数栈是一个用于存放操作数和操作符的作用结果的堆栈。所有的堆栈操作符只对操作数栈中的对象本身起作用 即使其中的对象是复合对象 它们也不会去复制该复合对象的值。,2.6 常用操作符,堆栈操作符:1、dup 该操作符需要一个操作数对象,其对应的内部操作是从操作数栈顶弹出一个对象,复制该对象,并把原对象和复制对象先后压入操作数栈,故其执行结果是操作数栈顶部将先后存入两个相同对象。,5 6 dup,结果:5 6 6,

47、2.6 常用操作符,堆栈操作符:2、exch 该操作符需要两个操作数对象,其对应的内部操作是从操作数栈顶弹出两个对象,交换这两个对象,并把它们压入回操作数栈,故其执行结果是操作数栈顶的两个对象交换了次序。,5 6 exch,结果:6 5,2.6 常用操作符,堆栈操作符:3、pop 该操作符需要一个操作数对象 其对应的内部操作是从操作数栈顶弹出一个对象 故其执行结果是操作数栈顶的元素将不再存在。,5 6 pop,结果:5,2.6 常用操作符,堆栈操作符:4、copy 该操作符对应的内部操作是从操作数栈顶弹出一个整数对象,设其值为N则根据该对象的值从栈顶再弹出N个对象并分别进行复制,最后把原对象序

48、列和复制对象序列先后压入操作数栈,故该操作符需要N+1个操作数对象,其执行结果是操作数栈中将有两组相同的对象。,4 1 5 6 2 copy,结果:4 1 5 6 5 6,2.6 常用操作符,堆栈操作符:5、roll 该操作符对应的内部操作是对操作数栈的多个对象弹出后进行循环移动操作,然后再依照新的次序压回操作数栈中,移动的方向和次数由操作数栈顶的整数对象决定,而参与其中的循环移动的对象个数则取决于操作数栈顶的第二个非负整数对象。,4 1(ab)3 2 roll,结果:1(ab)4,一般形式:anyn-1 anyn-2 any0 n j roll如果 j 为正数,那么表示向上移动,反之为向下移

49、动,2.6 常用操作符,堆栈操作符:6、index 该操作符将按照操作数栈顶的整数对象的值,复制操作数栈中索引号与该整数对象的值相同的栈中元素,并将复制的新对象压入到操作数栈顶。,4 1(ab)3 2 index,结果:4 1(ab)3 1,2.6 常用操作符,算术和数学操作符:1、add、sub、mul、div、idiv 和 mod 这些操作符均需两个操作数对象,分别完成加、减、乘、除和求模计算,其中idiv所需的操作数只能为两个整数对象。,4 1(a)7 2 mod,结果:4 1(a)1,2.6 常用操作符,算术和数学操作符:2、abs、neg、ceiling、floor、round和tr

50、uncate 这些操作符均只需一个操作数对象,分别对操作数栈顶的元素进行求绝对值、求相反数、求大于该元素的最小整数、求小于或等于该元素的最大整数、该元素按四舍五入方法处理后最接近的整数、以及取整数操作。,7.2 round,结果:7,2.6 常用操作符,算术和数学操作符:3、sqrt、exp、ln、log、sin、cos 和 atan 这些操作符对应的是一些数学函数和三角函数,它们需要一个或两个操作数对象。,2.6 常用操作符,数组、词典和串操作符:对数组、词典和串都有效的操作符1、get 该操作符的作用是从数组、词典或串对象中取出某个元素,并将其压入操作数栈。如果第一个是数组或串对象,get

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号