第十七章 疯狂Caché M语言兼容性(二)

设备控制助记符空间与设备控制助记符

Caché中的DSM兼容模式为大多数使用助记符空格和设备控制助记符的DSM应用程序提供了迁移路径。

对于可以迁移的应用程序,不需要更改应用程序代码本身。在许多情况下,只需要进行例程名称更改,而在其他情况下,只需要例程入口点网桥。

设备控制助记符是与写入/格式化字符和读取/格式化字符一起使用以执行设备控制的关键字。例如,在符合X3.64的助记符空间中,命令

Write /CUP(1,1)

执行光标定位。在DSM中,用户定义的助记空间表将助记空间中的关键字与运行时调用以执行操作的例程入口点相关联。DSM应用程序通过使用OpenUse命令指定助记空间名称,将助记空间表及其定义的关键字与设备相关联。

Caché不使用表格将助记符空间中的设备控件助记符映射到M个例程入口点。相反,它从控件助记符推断入口点标签名(控件助记符被转换为大写以形成标签名),并且它使用为设备指定的当前助记符空间名作为入口点例程名称。

例如,在以下序列中,作为write/命令的结果,Caché回调到M例程入口点CUP^%X364

Set DevZero=0
Use DevZero::"^%X364" Write /CUP(1,1)

如果用户定义的助记符空间表指定控件助记符的大小写转换,则可以更新应用程序以在Caché中的DSM兼容模式下运行。

此外,如果所有控件助记符都已经与其关联的CachéObjectScript例程入口点的所有标签名称匹配,那么所有需要做的就是在单个例程中显示所有标签。如果任何控件助记符与其关联的CachéObjectScript例程入口点的标签名不匹配,则可以添加标签名与控件助记符不匹配的入口点“bridge”。入口点桥只需要调用传递任何预期参数的原始目标CachéObjectScript例程入口点。

当然,可以通过更改原始入口点的标签名称来产生相同的效果。无论是桥接入口点标签还是原始入口点标签,所有这些都必须出现在单个CachéObjectScript例程中。

在DSM兼容模式下,Caché通过以下两种方式之一确定包含控制助记回调标签的CachéObjectScript例程的名称。当指定的助记空间名称以“^”字符开头时,Caché假定助记空间名称是CachéObjectScript例程名称;否则,它会在助记空间名称上添加一个“^%Z”前缀,以形成CachéObjectScript例程名称。除非更新DSM应用程序代码(通常不太理想),否则后一种情况将成为规则。

以下序列是后一种情况的示例:

Set DevZero=0
Use DevZero::"ZTERM" Write /CUP(1,1)

在此序列中,作为WRITE/命令的结果,Caché执行对CachéObjectScript例程入口点CUP^%ZZTERM的回调。

可以更改包含控件助记回调入口点的CachéObjectScript例程的名称,以遵守此约定。

在兼容模式下实现的其他DSM语言功能

下列DSM Z命令可识别并正常运行:

  • ZAllocate
  • ZDeallocate
  • ZInsert
  • ZLoad
  • ZPrint
  • ZRemove
  • ZSave
  • ZTrap (生成错误,但当前未实现DSM样式的错误处理和错误消息)
  • ZWrite (仅实现无参数形式)

DSM ZUSE命令被识别,但被视为无操作。请注意,Zuse关键字当前未实现。

下列DSM Z功能是可识别的且功能正常:

  • $ZDate
  • $ZNext
  • $ZOrder
  • $ZPrevious
  • $ZSearch (仅适用于Caché for Windows)
  • $ZSort (当前未实现无订阅全局$ZSORT参数)

以下与DSM I/O相关的Z特殊变量可识别并可用于终端设备:

  • $ZA
  • $ZB
  • $ZCONTROLC
  • $ZIO (仅适用于Caché for Windows)

下列其他DSM Z特殊变量是可识别的且起作用:

  • $ECODE
  • $ESTACK
  • $ETRAP
  • $QUIT
  • $STACK
  • $ZDEVTYPE
  • $ZERROR (包含错误信息,但当前未实现DSM样式的错误处理和错误消息)
  • $ZJOB
  • $ZNAME
  • $ZREFERENCE
  • $ZTRAP
  • $ZVERSION

下列DSM库外部函数($ZCALL)是可识别且正常运行的。

数学上:

  • %ARCCOS
  • %ARCSIN
  • %ARCCTAN
  • %BOOLEAN
  • %COS
  • %EXP
  • %LOG
  • %LOG10
  • %MAX
  • %MIN
  • %POWER
  • %SIN
  • %SQRT
  • %TAN

注意:这些函数返回的数字精度可能与DSM系统略有不同

文本操作:

  • %TRANSLATE
  • %UPCASE
  • %UPCASEQ

日期和时间:

  • %CDATASC
  • %CDATNUM
  • %CTIMASC
  • %CTIMNUM

其他:

  • %LPC

VIEW命令和$VIEW函数

由于VIEW命令和$VIEW函数需要了解磁盘或内存结构的内容,不同的实现会有所不同,因此在DSM兼容模式下,Caché不支持VIEW命令或$VIEW函数。

数据库转换

实用程序%dsmcvt将DSM数据库转换为Caché数据库。运行时,%dsmcvt会提示输入包含要转换的DSM数据库的目录。该数据库将转换为当前名称空间中的Caché 数据库。

DSM-J语言兼容性

使用%SYSTEM.Process类的LanguageMode(6)方法设置DSM-J语言模式。

使用DSM-J语言模式的Caché在通过USE命令应用于顺序文件时支持以下关键字:

  • KAN[JIDEVICE]
  • NOKAN[JIDEVICE]
  • KCODE=conversion_specification
  • KON[ESCAPE]=escape_sequence
  • KOFF[ESCAPE]=escape_sequence
  • KPITCH=pitch_value
  • KDIR[INPUT]
  • NOKDIR[INPUT]
  • KIN=switch (switch= “ON” or “OFF”)

DTM语言兼容性

使用已移植的DTM例程时,Caché在DTM模式下运行。本节讨论哪些命令和函数在DTM模式下运行,并记录它们的运行方式的任何变化。使用%SYSTEM.Process类的LanguageMode(2)方法设置DTM语言模式。

DTM兼容模式下的编程

通常,当在DTM兼容模式下编程时,ObjectScript的操作方式与其在本机Open M[DTM]系统上的操作方式相同。例程行结构遵循DTM规则,因此例程可以使用特定于DTM的语言元素。

但是,在使用DTM模式时,有几点应该特别记住。

操作符

可以在DTM兼容模式下使用特定于DTM的运算符。这些运算符是:

  • <> 记录形成操作符。记录形成操作符创建一个字符串,该字符串包含尖括号之间的片段。示例:如果$ZPIECA等于“^”,并且发出set x=<a,b>,则x等于“a_”^“_b”
  • .n 现场操作符。场运算符将一个字符串设置为等于另一个字符串的第n个部分。示例:如果s等于“s12^ab”,则s.2等于“ab

JOB命令

在Open M[DTM]兼容模式下,JOB命令的操作方式与本机Caché 系统上的作业命令相同。这意味着作业命令参数有很大不同:支持Caché进程参数;不支持DTM进程参数。“

在Caché中,JOB的参数可以是四个位置值。它们是:

(default:switch:principal-input:principal-output)
代码描述
defaultJOB进程的默认命名空间。
switch整数位掩码值,指定Caché是否应将当前符号表传递给新进程,以及其他信息。
principal-input过程的主要输入设备。
principal-output该过程的主要输出设备。

因为参数是位置参数,所以必须按显示的顺序指定它们。如果省略了要包括的参数之前的参数,则必须包括冒号作为其占位符。

在DTM中,参数最多可达10个值。每种格式都如下所示:

keyword=value
代码描述
keyword特定过程参数的名称。
value要为流程参数指定的值。

可以使用的关键字有:

代码描述
lvmem分配给作业进程符号表的内存量(以字节为单位)。
lvmin分配给符号表的最小内存量(以字节为单位)。
lvmax分配给符号表的最大内存量(以字节为单位)。
name要分配给JOB的名称。
node要在其上运行JOB的网络节点的名称。
nspace要在其中执行JOB的命名空间。
pdevJOB的主要设备。
priorityJOB的优先级(0到9)。
strstk字符串堆栈的大小(以字节为单位)。
sysstk系统堆栈的大小(以字节为单位)。

由于关键字的原因,参数不是位置参数。要指定多个过程参数,请使用以下格式的冒号分隔列表:

(keyword=value[:keyword=value]...)

不必为未指定的参数指定冒号。

I/O命令

在DTM兼容模式下,I/O命令(打开、使用和关闭)使用DTM参数语法。通常,当处于缓存兼容模式时,请使用以下准则:

  • 只能将打开、使用和关闭的设备指定为正整数值。这些值必须是在DTM.DEV文件中分配给它们的值。不能使用设备助记符。

  • 使用OpenUse时使用的参数是特定于设备的。以KEYWORD=VALUE的形式指定每个参数。要指定某些参数并接受其他参数的默认值,请使用冒号占据每个默认位置。可以省略最后一个指定参数后的冒号。前导冒号是必需的。缺少参数的尾随冒号是不必要的。在本例中,Open接受除第五个参数以外的所有设备的默认设备参数:

Open DEV(::::param5)
  • 可以对I/O命令使用超时。可以将超时指定为整数值、十进制值,或者指定为计算结果为整数值或小数值的表达式。
  • 不能对DTM设备使用控制助记符。
  • 不能将设备参数与CLOSE命令一起使用。DTM不识别关闭设备参数。

View$View

在DTM兼容模式下,View$View的操作方式与它们在DTM系统上的操作方式相同。

DSM-11兼容模式

当进程处于DTM兼容模式时,可以进一步将其设置为DTM的DSM-11兼容模式。然后,可以加载和运行DSM-11例程。使用ZZCOMPAT命令在DSM-11模式和Open M[DTM]兼容模式之间切换。使用$ZZCOMPAT特殊变量来确定设置进程的模式。

结构化系统变量

不能在Open M[DTM]兼容模式下使用结构化系统变量。

命令、函数和特殊变量

以下各节列出了在DTM兼容模式下可用的命令、函数和特殊变量。

命令

这些标准M命令在Caché模式和DTM兼容模式下操作相同:

  • Do
  • Else
  • For
  • Halt
  • If
  • Kill
  • Lock
  • Merge
  • New
  • Print
  • Quit
  • Write
  • Xecute

以下标准M命令在DTM兼容模式下不可用:

  • TCommit
  • TRollback
  • TStart

这些扩展的M命令在Caché 模式和DTM兼容模式下操作相同:

  • ZInsert
  • ZNSpace
  • ZRemove
  • ZSync
  • ZZDump

以下扩展M命令在Open M[DTM]兼容模式下不可用:

  • ZTrap

函数

以下标准M函数在DTM兼容性和缓存模式下运行相同:

  • $ASCII
  • $Char
  • $Data
  • $Find
  • $FNumber
  • $Get
  • $Justify
  • $Length
  • $Name
  • $Next
  • $Order
  • $Piece
  • $QLength
  • $QSubscript
  • $Query
  • $Random
  • $Reverse
  • $Select
  • $Translate

以下扩展M函数在DTM兼容性和Caché 模式下运行相同:

  • $ZBitAnd
  • $ZBitCount
  • $ZBitFind
  • $ZBitLen
  • $ZBitNot
  • $ZBitOr
  • $ZBitSet
  • $ZBitStr
  • $ZBitXOr

这些扩展功能在DTM兼容模式下不可用:

  • $ZBoolean
  • $ZF
  • $ZHex
  • $ZIncr
  • $ZNext
  • $ZSearch
  • $ZSort
  • $ZTime
  • $ZU

下列DTM模式数学函数在Caché 模式和DTM兼容模式下运行相同:

  • $ZAbs
  • $ZArcCos
  • $ZArcSin
  • $ZArcTan
  • $ZCos
  • $ZCot
  • $ZCSC
  • $ZExp
  • $ZLn
  • $ZLog
  • $ZPower
  • $ZSec
  • $ZSin
  • $ZSqr
  • $ZTan

它们设置一个通用错误处理程序并调用%MATH实用程序入口点。通用错误处理程序将任何报告的错误转换为<非法值>错误,并将其返回给调用例程。

特殊变量

以下标准M特殊变量在DTM兼容模式下不可用:

  • $ECODE
  • $ESTACK
  • $ETRAP
  • $QUIT
  • $STACK

以下扩展的M个特殊变量在Caché 模式和DTM兼容模式下运行相同

  • $ZHOROLOG
  • $ZNSPACE

数据库转换

实用程序%DTMCVT将DTM数据库转换为Caché数据库。运行时,%DTMCVT会提示输入包含要转换的DTM数据库的目录。该数据库将转换为当前名称空间中的Caché数据库。

MSM语言兼容性

使用已移植的MSM例程时,Caché在MSM模式下运行。本节讨论哪些命令和函数在MSM模式下操作,并记录它们的操作方式的任何变化。MSM语言模式是使用%SYSTEM.Process类的`LanguageMode(8)方法设置的。

可以为每个例程单独设置语言模式,并且以一种语言模式编译的例程可以调用以另一种模式编译的例程或被以另一种模式编译的例程调用。因此,例如,MSM模式例程可以调用DTM模式例程,该DTM模式例程又可以调用另一MSM模式例程。

MSM应用程序以正确的语言模式编译后,可以在任何Caché 系统上安装和运行,无论该系统上使用什么其他应用程序或语言模式。

几乎所有的语言模式处理都发生在编译时,而不是运行时。因此,使用诸如MSM之类的语言模式通常会提供与Caché本机语言模式相同的高性能。

命令、函数和特殊变量

以下各节列出了MSM兼容模式下可用的命令、函数和特殊变量。和特殊变量

命令

这些标准M命令在缓存模式和MSM兼容模式下操作相同:

  • Close
  • Job
  • Open
  • Use

这些扩展的M命令在Caché模式和MSM兼容模式下操作相同:

  • ZAllocate
  • ZBreak
  • ZDeallocate
  • ZPrint
  • ZTrap
  • ZWrite

函数

这些扩展的M函数在MSM兼容模式和Caché模式下运行相同:

  • $ZNext
  • $ZOrder
  • $ZPrevious
  • $ZSort

这些是Caché中不推荐使用的遗留函数。

特殊变量

以下扩展的M特殊变量在Caché模式和MSM兼容模式下运行相同:

  • $ZA
  • $ZB
  • $ZERROR (使用MSM错误消息)
  • $ZORDER
  • $ZREFERENCE
  • $ZVERSION

MSM中的$ZC特殊变量与Caché中的$ZC($ZCHILD的缩写)的含义完全不同。

数据库转换

实用程序%MSMCVT将MSM数据库转换为Caché数据库。运行时,%MSMCVT会提示输入包含要转换的MSM数据库的目录。该数据库将转换为当前名称空间中的Caché数据库。

https://juejin.im/post/5ed991bff265da76bc7603d5

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论