Caché为以下各项提供语言兼容模式:
通过将许多更常见的M编程语言命令和函数的语法容纳到CachéObjectScript中,这些模式使得将应用程序从上述安装移植到Caché成为可能。CachéObjectScript是ISO 11756-1999年标准M编程语言的超集。国际标准化组织11756-1999年标准与以前的美国国家标准协会的M编程语言相同。
Caché提供%SYSTEM.Process
类的LanguageMode()
方法,允许显示和设置语言模式。LanguageMode(N)
将语言设置为模式n并返回上一个值。不带参数的LanguageMode()
返回当前值。
如果在不同方言下创建的分区中已有例程,请不要使用LanguageMode()
修改当前方言。
注意:不能从GUI实用程序设置语言模式。必须使用LanguageMode()
方法。
如果按照本节中概述的步骤移植、管理和转换DSM模式例程,则不需要使用LanguageMode()
方法调用来设置语言模式。如果要使用LanguageMode()
查看当前语言模式,请发出以下命令:
WRITE ##class(%SYSTEM.Process).LanguageMode()
0
还可以通过任何影响例程加载的命令来设置语言模式。当前方言将设置为例程的方言。在DO
的情况下,在离开例程时恢复以前的方言。对于在命令间接(XECUTE
)内完成的ZLOAD
或GOTO
,也会发生这种情况。
Caché中表示的通用语言模式如下所示。
Caché语言模式
LanguageMode()值 | 语言模式 |
---|---|
0 | Caché |
1 | DSM-11 |
2 | DTM |
5 | DSM |
6 | DSM-J (Japanese version) |
7 | DTM-J (Japanese version) |
8 | MSM |
使用已移植的DSM-11例程时,Caché在DSM模式下运行。您无需进行大量更改即可运行已移植到Caché的DSM-11例程。本节讨论各种命令和功能如何在DSM-11模式下运行。
使用%SYSTEM.Process
类的LanguageMode(1)
方法设置DSM-11语言模式。
注意:要特别注意Lock
、ZAllocate
和ZDeallocation
。
常规联锁装置提供了标准M锁定命令的替代方案。开发了常规联锁装置,以便DSM-11应用程序不会用完DSM-11锁表中的空间。
此功能是专门为DSM-11兼容模式设计的,应用程序从DSM-11移植。不过,它也可以在Caché 语言模式下运行。
设备编号20到46和200到223用作常规联锁设备。它们是进程协同使用的伪设备,因此它们可以控制对相同数据的更新。例程联锁设备号存在于所有Open M和Caché系统上。
两个或多个进程必须同意将其中一个设备号用于特定目的。一个进程为该设备发出Open
命令,并对与该设备关联的数据执行任何必要的处理。如果第二个进程试图打开该设备,则必须等到第一个进程关闭该设备。因此,第二个进程在成功打开设备或超时之前不执行任何处理。任何数量的进程都可以尝试打开设备;每个进程都会一直等到下一个进程,然后才会使用Close
命令释放设备。
以这种方式,对例程联锁设备的打开命令保证了进程对与该设备相关联的数据的独占访问,只要所有应用程序:
Lock
命令一样)打开和关闭是您可以向常规联锁设备发出的唯一I/O命令。没有读写命令,因为使用例程联锁设备不涉及将数据传入或传出任何设备或存储区。
Open
命令打开一个例行的联锁设备,并防止其他进程成功地向同一设备号发出Open
命令。
Open device[::timeout]
参数 | 描述 |
---|---|
device | 设备编号,从20到46或从200到223。必须确保使用给定设备编号的所有例程都同意该编号的含义。其含义通常是哪些全局现在被认为是锁定的,因此对其他进程不可用。 |
timeout | 一个正整数,其值(以秒为单位)是Caché 等待打开完成的最长时间。如果指定0,则Open 会立即将控制权返回给进程。 |
CLOSE
命令关闭例程联锁设备,并将其释放给其他进程。
Close device
在Caché系统上使用DSM-11模式例程时,请牢记以下几点:
LanguageMode()
方法更改语言模式,使其与加载的例程的语言模式不匹配,然后尝试执行ZInsert
,则会收到
错误消息。可以随时编辑DSM-11例程以符合Caché,并将其语言模式更改为Caché。Caché Studio编辑器便于将DSM-11模式例程转换为Caché模式。
在Caché系统上具有DSM-11模式例程后,可以将实用程序%RO
和%RI
或Caché Studio与其配合使用。这些实用程序维护例程的DSM-11模式,允许使用Caché%RO
和%RI
实用程序将从DSM-11主机复制到Caché主机的例程复制到其他Caché命名空间和/或主机。
%RD
实用程序列出当前Caché命名空间中的例程,在其长格式显示中包括一列“lang
”,反映每个例程的已保存语言模式。对于Caché模式例程,“LANG
”列为空,而对于DSM-11模式例程,则包含“DSM11”。您还可以使用管理门户列出例程。
%RCOPY
和%RCOMPIL
例程实用程序可以识别并保留每个例程的语言模式。%RCOPY
复制例程并生成备份版本。%RCOMPIL
编译宏源代码和中间代码例程。使用%RCOPY
重命名DSM-11模式例程,而无需将其转换为Caché模式。也可以使用CachéStudio。
如果保存并编译,Caché Studio和例程行编辑器(X^%
)可以识别并保留每个例程的语言模式。Caché Studio中的例程属性对话框显示当前例程的语言模式。
要将ANSI整理的全局变量从DSM-11系统传输到Caché系统,请首先使用采用DSM-11文件格式的CachéStudio从DSM-11系统读取它们。
要将字符串整理的全局变量从DSM-11系统传输到Caché,请首先使用DSM-11%gto实用程序从DSM-11系统读取全局变量。然后,在InterSystems主机上使用%GCREATE
实用程序创建每个全局变量,并赋予其纯字符串排序特征。最后,使用%Gigen
实用程序加载全局变量。
以下各节讨论CachéDSM-11兼容模式的输入和输出编程特性。
在caché中,终端的open命令提供了五个参数:margin, protocol, terminators, portstate, baud.在caché中,终端的use命令只提供三个参数:margin, protocol, terminators。
相比之下,在DSM-11中,Open
和Use
命令可容纳11个参数。这些参数中的大多数都存在,因为DSM-11还充当它自己的操作系统。在DSM-11兼容模式下,Caché模拟DSM-11语法,接受但忽略与操作系统相关的参数。
以下两个表格描述了十一个DSM-11打开和使用命令参数的高速缓存DSM-11兼容模式解释。
DSM-11兼容模式打开/使用命令参数
参数 | DSM-11的含义 | DSM-11兼容模式解释 |
---|---|---|
p1: margin | 设置设备的右边距。 | 与DSM-11相同。在功能和参数位置上都与Caché 模式页边距参数相同。 |
p2: output ring buffer | 设置输出环形缓冲区的大小。 | 接受了,但被忽略了。 |
p3: input field length | 指定字段长度。此参数仅用于DSM-11向后兼容。读取命令现在是指定字段长度的首选技术。 | 接受了,但被忽略了。 |
p4: input ring buffer | 设置输入环形缓冲区的大小。 | 接受了,但被忽略了。 |
p5: set status | 修改设备特征 | 与系统间模式协议参数相关的位掩码。 |
p6: clear status | 修改设备特征 | 与Caché模式协议参数相关的位掩码。 |
p7: set $X and $Y | 更改端子的$X 和$Y 设置。 |
详情见下表。 |
p8: line parameter register | 根据控制器类型分配的值。 | 接受了,但被忽略了。 |
p9: terminators | 为设备建立一组线路终结器。 | 与DSM-11相同。在功能上等同于Caché模式终止符参数,尽管它占据不同的参数位置。 |
p10: set application interrupt key | 为设备建立一组应用程序中断键。 | 接受了,但被忽略了。 |
timeout | 指定在请求的设备不空闲时暂停执行的时间长度。 | 与DSM-11相同。在功能和参数位置上都与Caché模式超时参数相同。 |
Caché模式中的协议参数是包含以下内容某种组合的字符串:
同样,DSM-11具有设置状态和清除状态参数,这两个参数都是位掩码。
要启用协议,必须在SET STATUS
参数中包括其位。要关闭协议,必须将其位包括在清除状态参数中。在DSM-11兼容模式下,Caché接受但忽略特定于操作系统的位。下表列出了支持的位。
DSM-11兼容模式设置和清除状态位
Bit | Value | 描述 |
---|---|---|
0 (1) | 0-回声;1-无回声 | Caché“S”协议的标识。 |
2 (4) | 0-硬拷贝;1-CRT | Caché“C”协议的标识。 |
6 (64) | 0-转义处理已禁用;1-转义处理已启用 | 确定读取时如何处理转义序列。在Caché模式下,转义序列总是终止非图像模式读取,转义序列在$ZB 中显示为字符串。在DSM 11模式下,转义序列始终终止正常读取,但转义序列仅在转义处理启用时才会被处理。启用转义处理时,第二个字符的十进制ASCII码出现在$ZB 的高位字节中,转义字符本身的十进制ASCII码出现在低位字节中。禁用转义处理时,将转义字符视为任何终止符,并且不处理转义序列的其余字符。它们保留在输入缓冲器中,在那里它们可以被后续的读取命令访问。 |
7 (128) | 0-不发送光标控制序列;1-发送光标控制序列 | 确定参数7的处理方式:设置$X 和$Y 。当在DSM-11语言兼容模式下打开/使用时提供参数7值时,$X 和$Y 会相应更新,如果位7打开,则会将适当的光标控制序列(VT52或ANSI,取决于位16)传输到终端。 |
14 (16384) | 0-不转换;1-转换为大写 | 确定是否在输入时转换大小写。 |
16 (65536) | 0 - VT52; 1 - ANSI | 确定适当的光标控制序列。 |
19 (524288) | 0-忽略删除字符;1-确认删除字符 | 确定输入缓冲区中没有要删除的内容时按Delete键的效果。如果该位为ON,则删除字符将被忽略。如果该位为OFF,则读取终止,删除字符在$ZB 的低位字节中显示为127。 |
20 (1048576) | 0-接受未编程的ctrl键;1-忽略未编程的ctrl键。 | 确定按下非编程控制键的效果。当该位关闭时,所有未编程的控制键都被接受为正常字符。该位开启时,未编程的控制键将被忽略。它们不会回显或放置在输入缓冲区中。 |
23 (8388608) | 0-禁用全部传递;1-启用全部传递 | 与Caché 图像模式协议相同。该位打开时,所有控制字符直接传递到程序,无需过滤或解释。 |
25 (33554432) | 0-启用提前键入;1-禁用提前键入 | 确定对提前键入的处理。位25开启时,禁用提前打字。在每次读取之前刷新输入缓冲区。当位25关闭时,启用提前打字。在每次读取之前不会刷新输入缓冲区。 |
26 (68108864) | 0-默认为第25位,提前键入控制;1-不刷新提前键入缓冲区。 | 当位26关闭时,除了位25提供的控制外,不会授予任何额外的提前键入控制。位26开启时,除非位25明确指示,否则永远不能刷新预打缓冲区。例如,“带提示阅读”不会提前清除键入内容。 |
在Windows上,CachéObjectScript在数据库文件和使用Open打开的文件之间为每个进程分配打开的文件配额。当Open导致太多文件分配给Open
命令时,您会收到
错误消息。Caché不限制打开的文件数;每个进程的最大打开文件数是特定于平台的设置。
警告:仅当设备的最后一次打开/使用处于DSM-11模式时,才会在读/写时接受DSM-11兼容模式特有的打开/使用参数。DSM-11模式特有的参数是p5/p6(位6、7、19、20、25、26)和p7。
如果终止符完成读取,在Caché 模式下,特殊变量$ZB
将终止符字符作为字符串包含,而在DSM-11模式下,终止符的ASCII十进制值在$ZB的低位字节中返回。
如果转义序列终止读取,则Caché模式以$ZB
中的字符串形式返回ASCII转义序列,而DSM-11模式返回一个整数,转义字符(27)在$ZB
的低位字节,第二个字符加16,然后在高位字节取模64。
磁带的I/O命令在Caché和DSM-11中非常相似。两者都使用位置参数样式,并且每个参数中特定参数的位置和值非常相似。但是,格式代码存在一些差异,这说明了DSM-11兼容模式下磁带I/O的这些独特特征:
$Za
。虽然Caché实际上不能在OpenVMS、UNIX®或Windows操作系统上执行此操作,但它在DSM-11兼容模式下接受“C”格式,因此使用该格式编码的DSM-11应用程序不需要更改源代码即可运行。取而代之的是,Caché执行以下步骤:WRITE*10
时,用完成状态更新$Za
。DSM-11 模式 | Caché 模式 | 磁带密度 (BPI) |
---|---|---|
3 | 1 | 800 |
4 | 2 | 1600 |
5 | 3 | 6250 |
*-n
(负值)完成,而DSM-11兼容模式使用WRITE*n
(正值)完成。除了DSM-11提供更新$Za
的WRITE*10
之外,两种模式对控制功能的绝对值分配是相同的。如上所述,这对于检查异步I/O操作状态的DSM-11“C”格式选项很有用。Caché提供设备224至255,用于两种语言模式的作业间通信
VIEW
命令和$VIEW
函数在DSM-11兼容模式下,Caché不支持VIEW
命令或$VIEW
函数。
ZALLOCATE
和ZDEALLOCATE
ZALLOCATE
和ZDEALLOCATE
命令在Caché和DSM-11中的行为不同:
ZALLOCATE
只能通过ZDeALLOCATE
撤销,LOCK+
只能通过Lock
撤销。此外,某个位置的任意数量的ZAllocate
命令都可以使用单个ZDeAllocate
来撤消。ZAllocate
和ZDeAllocation
等同于Lock+
和Lock
。Config.Miscellous
类的ZaMode
属性允许选择ZAllocate
和ZDeallocation
在系统范围内执行的行为:Caché模式或DSM-11模式。
在DSM-11兼容模式下,默认情况下,ZAllocate
和ZDeallocation
的行为与在DSM-11中相同。由于这些模式之间的差异,请始终检查从DSM-11系统移植的代码,以确保Lock
和ZAllocate
嵌套特征的更改不会影响应用程序的完整性。
如果已将Za
和Zd
命令移植到Caché模式,但仍在DSM-11模式下编译,请在ZSTU启动例程中设置ZaMode
,以确保Za
和Zd
将在Caché模式下解释。
Caché在两种语言模式下都支持以下功能:
$ZNext
$ZOrder
$ZPrevious
$ZSort
这些是Caché中不推荐使用的遗留函数。
Caché不支持以下DSM-11功能:
$ZCall
$ZUCI
注意:由于$ZUCI
函数可以缩写为$zu
,因此必须确保从移植到Caché的DSM-11应用程序中删除对它的所有引用,以便Caché不会将它们视为对Caché$zu
(N)($ZUTIL
(N))函数的调用。
Caché在两种语言模式下都支持以下特殊变量:
$ZORDER
$ZREFERENCE
$ZVERSION
Caché仅在DSM-11模式下支持这些特殊变量:
$ZA
$ZB
$ZA
和$ZB
都返回DSM-11值。Caché在两种语言模式下都支持以下DSM-11命令:
ZTRAP
ZPrint
ZWrite
ZBreak
ZPrint
与Caché 模式打印命令相同。
ZWrite
与无参数的WRITE
命令相同。
在DSM-11 M中,ZBreak On
和ZBreak Off
命令控制无参数BREAK
命令的处理。%SYSTEM.Process
类的BreakMode()
方法模拟此DSM-11行为,并在两种语言模式下工作。
发出BreakMode(0)
将禁用无参数中断命令的处理(类似于ZBreak off
)。发出BreakMode(1)
可启用无参数中断命令的处理(类似于ZBreak ON
)。发出不带参数的BreakMode()
将返回交换机的当前状态,而不会更改它。
在DSM-11模式下,$ZERROR
特殊变量返回的错误消息使用与其对应的DSM-11相同的拼写。
在DSM-11模式下,Caché支持DSM-11版本2错误处理。DSM-11版本2风格的错误处理规定,无论何时发生M错误,都会清除整个帧堆栈,并执行转到错误处理例程的GOTO。
要保留这种错误处理方式,请使用Break 2
命令启用DSM-11版本2错误处理。要恢复正常的DSM-11错误处理,请发出Break-2
命令。您只能在DSM-11兼容模式下调用这些命令。
如果在DSM-11兼容模式下执行的例程调用正常语言模式例程(如系统实用程序),则Caché 标准错误处理将在该例程的整个执行过程中应用。
$TEXT
注释行Caché支持双分号功能,允许在编译结果中包含特定的注释行。当$TEXT
函数引用注释行,并且例程将在没有源代码的情况下分发时,此功能是必需的。由于DSM-11没有等效功能,因此DSM-11模式下的$TEXT
要求源代码始终可用。
使用已移植的DSM例程时,Caché在DSM模式下运行。无需进行大量更改即可运行已移植到Caché的DSM例程。本节讨论各种命令和函数如何在DSM模式下运行。使用%SYSTEM.Process
类的LanguageMode(5)
方法设置DSM语言模式。
使用已移植的DSM例程时,Caché在DSM模式下运行。要将例程从DSM移植到缓存,请使用DSM%RS
实用程序将本机DSM应用程序保存到磁带或磁盘。然后,使用CachéStudio编辑器或%RI
实用程序恢复缓存系统上的应用程序。
%RI
实用程序和DSM格式的还原实用程序可识别本机DSM%RS
文件,并将其加载(编译并保存)为DSM模式例程。
在Caché系统上使用DSM模式例程时,请记住以下几点:
$ZCALL
)。ZLoad
命令加载例程时,Caché设置语言模式以匹配例程的语言模式。LanguageMode()
方法更改语言模式,使其与加载的例程的语言模式不匹配,然后尝试执行ZInsert
,则会收到
错误消息。备注:目前,%RI
和^%RDE
报告DSM模式例程中某些DSM语言功能的<语法>
错误。这表示该语法不是有效的CachéObjectScript语法。但是,如果它是当前在DSM兼容模式下识别的DSM语言功能,则代码将正确解释。
在Caché中,Close
、Open
、Use
和Job
命令以冒号(:
)字符分隔的基于位置的参数值为特色。例如:
Use terminal:[([margin]:[protocols]:[terminators])]:"mnespace"
相比之下,在DSM中,Close
、Open
、Use
、Zuse
和Job
命令具有关键字语法,其中关键字和Not Position
赋予参数值含义。例如:
Use terminal:[keylist]:"mnespace"
其中keylist为下列值之一:
keyword [=value](keyword[=value][,...])
在每种情况下,目的都是将有关操作的信息传送到指定的设备。例如,程序员可能想要将读取命令输入字符转换为大写。在Caché本地语言模式中,此操作使用以下语法完成:
Use 0pen:(:"+U")
在DSM语言模式下,以下操作可实现相同的功能:
Use 0pen:CONVERT
目前,DSM语言模式支持终端类型设备的某些关键字。以下关键字是可识别的,但被视为Open命令的无操作:
BLOCKSIZE=n
通过Open命令将以下关键字应用于顺序文件(仅限Windows平台)时,可以识别以下关键字并使其发挥作用:
通过USE
命令将DISCONNECT关键字应用于顺序文件时,可以识别该关键字并使其起作用。
通过CLOSE
命令将以下关键字应用于顺序文件时,可以识别和使用以下关键字:
以下例外适用于DSM语言模式下的Caché :
CLOSE
命令不会删除文件。CLOSE
命令指定RENAME关键字并将要关闭的文件标记为删除时,DSM将删除该文件,然后生成%DSM-E-RENAMERR错误。但是,在Caché中,DSM语言模式中的Close
命令会重命名文件,但不会将其删除。CLOSE
命令指定RENAME和DELETE关键字时,DSM将删除文件,然后生成%DSM-E-RENAMERR错误。但是,在Caché中,DSM语言模式中的CLOSE
命令会删除文件。以下关键字可识别并可用于USE
命令:
Break 0
,以交互测试CENABLE和NOCENABL关键字。CLEARSCR、DOWNSCRO、ERASELIN、UPSCROLL、X=n和Y=n关键字导致将VT100转义序列写入指定设备,并且仅适用于识别序列的设备。当指定的设备是控制台窗口时,Caché会自动将转义序列转换为执行所需结果的窗口操作。
LINE和NOLINE关键字启用和禁用Caché读取行调用。默认情况下,最初可以禁用读取行调用。默认情况下,使用%SYSTEM.Process
类的LineRecall()
方法为的进程启用读取行调用。
在DSM中,除非/typehead
命令行限定符对DSM进程有效,否则type和notype关键字无效。
在DEC OSF/1 AXP的DSM中也是如此,但NOREADPFLU关键字可用于动态完成与/typehead
命令限定符相同的事情,而READPFLU则取消/typehead
行为。
因此,在DSM兼容模式下提供NOREADPFLU和READPFLU,以便可以在应用程序启动时为主器件指定NOREADPFLU,以实现与DSM/TYPEAHEAD限定符相同的行为。
DSM兼容模式可识别以下关键字,但会将它们视为无操作可供使用:
DSM语言模式还支持作业命令的几个关键字。以下关键字是可识别且功能强大的:
以下关键字是可识别的,但被视为作业的无操作:
DSM兼容模式当前处理除BREAK
和VIEW
命令之外的所有其他标准M命令,这两个命令(根据标准)接受特定于实现者的参数。