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

微信扫一扫,分享到朋友圈

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

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

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

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

Write /CUP(1,1)
复制代码

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

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
ZWrite

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

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

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

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

$ZA
$ZB
$ZCONTROLC
$ZIO

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

$ECODE
$ESTACK
$ETRAP
$QUIT
$STACK
$ZDEVTYPE
$ZERROR
$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)
复制代码
代码 描述
default JOB
进程的默认命名空间。
switch 整数位掩码值,指定Caché是否应将当前符号表传递给新进程,以及其他信息。
principal-input 过程的主要输入设备。
principal-output 该过程的主要输出设备。

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

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

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

可以使用的关键字有:

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

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

(keyword=value[:keyword=value]...)
复制代码

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

I/O命令

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

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

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

Open DEV(::::param5)
复制代码
CLOSE

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
$ZORDER
$ZREFERENCE
$ZVERSION

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

数据库转换

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

[译] 你理解数据库死锁发生的原因吗?

上一篇

阅文集团发“正版联盟”公告:承担作家所有维权成本

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友