梅塔方特(1984)

2020-06-09 16:38:34

=0;NORM_RAND:=x;END;@*\[9]压缩数据。为了有效利用存储空间,\MF\将其主要数据结构基于|MEMORY_WORD|,该|MEMORY_WORD|包含一个可能缩放的(带符号)整数,或者包含少量字段,这些字段的大小是用于存储整数的一半或四分之一。如果|x|是|MEMORY_WORD|类型的变量,则它最多包含四个可称为follows:$$\vbox{\halign{\hfil#&;#\hfil&;#\hfil\cr|x|&;.|int|&;的字段。(an|整数|)\cr|x|&;.|sc|\qquad&;(a|缩放|整数)\cr|x.hh.lh|,|x.hh|&;.|rh|&;(两个半字段)\cr|x.h.b0|,|x.h.b1|,|x.hh|&;(两个四字段,一个。\qquad\qquad\qquad(四个四分字字段)\cr}}$$编写起来有些麻烦,可读性也不是很好,但将使用宏来使符号更短、更透明。下面的\Pascal\代码使用压缩变体记录给出了|MEMORY_WORD|及其附属类型的正式定义。\mf\不假设字中字段的相对位置。由于我们假设的是32位整数,半字必须至少包含16位,四分字必须至少包含8位。@^系统依赖项@>;但是有更多位并不会有什么坏处;例如,如果有足够的36位字,|mem_max|可能会像262142.nb一样大。注:除非\mf,否则会严重浪费宝贵的内存空间。一些\Pascal\编译器会将子范围为`|0..255|';的整数打包到一个八位字段中,而另一些\Pascal\编译器则坚持为额外的符号位分配空间;在这样的系统上,只有当子范围为`|-128..127|';时,您才能将256个值打包到一个四字中。目前的实现试图容纳尽可能多的变体,因此它做的假设很少。如果具有subrange`|min_quarterword..max_quarterword|';的整数可以被打包成四分字,并且如果具有子范围`|MIN_HalfWord..max_Halfword|';可以打包到半字中,则一切工作都应该令人满意。通常最有效的方法是|min_Quarterword=min_halfword=0|,所以除非出现严重问题,否则应该尝试这样做。建议大多数32位计算机使用此处定义的值。@d min_Quarterword=0{|Quarterword|}中的最小允许值|}@d max_Quarterword=255{|Quarterword|}中的最大允许值|}@d min_Halfword==0。t满足):@<;检查``常量.@>;=init if mem_max<;>;mem_top Then Bad:=10;@+tini@;@/If mem_max<;mem_top Then Bad:=10;If(min_quarterword>;0)or(max_quarterword<;127)Then Bad:=11;If(Min_Halfword&>0)或(max_Halfword<;32767)则BAD:=12。最小半字)或@|(最大四分之一字;>最大半字)则坏字:=13;如果(mem_min<;min_halfword)or(mem_max>;=max_halfword),则坏字:=14;如果最大字符串;>最大半字,则坏字:=15;如果buf_size&>;最大半字,则坏字:=16;如果(最大四分之一字-最小四分之一字<;255)或@|(最大半字-最小半字<;65535),则。@在\mf中减去|min_Halfword|的操作相当频繁,所以使用这里定义的宏|ho|可以方便地缩写该操作。在|min_Halfword=0|时,如果此宏以明显的方式简化,则相对于不优化表达式`|x-0|';的编译器,\mf\的运行速度会更快。类似地,|qi|和|qo|用于四分字的输入和输出。@^系统依赖项@>;@d ho(#)==#-min_Halfword{从半字中提取16位项目}@d qo(#)==#-min_Quarterword{从四分字中读取八位}@d qi(#)==#+min_Quarterword{在四分字中存储八位}@读者应该学习。=@!Quarterword=min_Quarterword..max_Quarterword;{1/4 of a word}@!Halfword=min_Halfword.max_Halfword;{1/2 of a word}@!Two_Choices=1..2;{在记录中有两种变体时使用}@!Three_Choices=1..3;{在记录中有三种变体时使用}@!Two_Halves=Pack Record@;@/@!rh:Halfword;case。2:(@!B0:四分字;@!B1:四分字);END;@!Four_Quarters=压缩记录@;@/@!B0:四分字;@!B1:四分字;@!B2:四分字;@!B3:四分字;End;@!Memory_Word=Record@;@/case Three_Chotions of 1:(@!int:整数);2:(@!hh:Two_Halves);3:(@!qqq。@调试时,我们可能希望打印|MEMORY_WORD|,而不知道它是什么类型;因此我们在所有模式下打印它