• MUMPS+Caché学习记录


    翻译自:http://www.cs.uni.edu/~okane/

    Mumps History

    Mumps(马萨诸塞州综合医院实用程序多程序设计系统)是一种通用编程语言环境,它通过程序级访问来提供 ACID(原子的、一致的、隔离的和持久的)数据库访问,以访问组织为树的磁盘驻留数据,这些数据也可以被视为 spa/s 下标数组和变量。 Mumps 数据库允许无模式、键值多维数组从 1966 年开始,Mumps(也称为 M)由麻省总医院 (MGH) 的 Octo Bamett 实验室的 Neil Pappalardo 等人在 PDP-7 上开发, 几乎在同一时间实现 Unix 的同一架构最初使用 Mumps 的体验非常积极,它很快被移植到许多其他架构,包括 PDP-11、VAX、Data General、Prime,以及最终基于 Intel x86 的系统,其中 其他。 它很快成为计算机在健康科学中许多早期应用的基础。

    当最初设计 Mumps 时,几乎没有通用的数据库系统。术语“数据库”本身的起源可以追溯到这一时期。现有的此类系统主要是特定于特定应用程序的实现,既不可移植也不可扩展。通用数据库设计的概念刚刚发展 通用数据库系统的首次尝试之一是 GE / Honeywell 最初的 DS - 集成数据存储 - 开发于 20 世纪 60 年代中期。使用该系统的经验导致随后创建了 CODASYLDBTG(数据系统语言委员会-数据库任务组),其网络模型数据库被提出(1969 年)网络模型非常复杂,并且在不同程度上仅由少数供应商实施.所有这些都是基于大型机的。其中最著名的是 GE / Honeywell 的 DS / 2、Cullinet 的集成数据库管理系统(IDMSUnivac 的 DMS-1100)和 Digital Equipment Corporations 基于 DEC-10 的 DBMS32。

    大约在同一时间,IBM 的 IMS(信息管理系统)正在与 NASA 阿波罗计划一起开发。 它于 1968 年首次投入使用,运行在 IBM 360 大型机上。 至今仍在使用的 MS 与 Mump 一样是一种分层结构数据库,基于表的关系数据库模型最初由 E.F. Codd 于 1970 年提出,但直到 1974 年 IBM 才开始开发 System R,这是第一个使用该模型的系统 ,作为一个研究项目。 1979 年 Oracle 发布了第一个商用关系数据库系统。

    在 20 世纪 60 年代后期,微型计算机虽然价格昂贵,但越来越广泛使用,但它们仍然主要局限于专用的,主要是实验室应用程序。这些系统上可用的操作系统是原始的,而且大部分是单用户的。在许多情况下,用户是操作系统,翻转开关以安装引导代码,并手动加载编译器、链接器和程序:从纸质或磁带DECS RSX-11,PDP-11 上的第一个商业多用户系统,于 1972 年推出. RSTS/E是一个主要用于BASIC语言程序设计的分时系统,于1970年实现。其他语言支持仅限于一小部分语言,例如 FORTRAN、BASIC 和汇编语言。虽然Unix此时已经存在。它在 AT&T 之外直到 1984 年才可用因此,在 1966 年,当 DEC PDP-7 到达马萨诸塞州总医院 (MGH) 时,几乎没有可用的软件、操作系统或数据库支持。因此,由于几乎没有其他选择, MGH 的人们从头开始,将 Mumps 设计为不仅是一个多用户操作系统,而且是一种语言和数据库,两者合而为一。

    对于他们的数据库设计,他们选择了分层模型,因为这与病历的树结构性质非常匹配。为了用语言表示数据库树,他们决定使用数组引用,其中每个连续的数组索引都是从数组的根到中间节点和终端节点的路径描述的一部分。他们称这些磁盘驻留结构为全局阵列。虽然在那些日子里,Mumps 出于必要,是它自己的独立操作系统,但今天 Mumps 程序在基于 Unix、Linux、OS/X 和 Windows 的环境中运行的情况并非如此。早期的 Mumps 操作系统将早期小型计算机中可用的非常有限的内存划分为小分区,每个分区分配给一个单独的用户系统通常以循环协议分配和管理内存分区并向每个用户分区授予时间片。 Mump 操作系统本身提供了 Mumps 语言解释器( Mumps 没有被编译) 、集中式 I/O 和通过集中式全局阵列文件管理器管理对分层数据库的访问,如下图所示。在这里插入图片描述
    早期微型计算机的内存有限,有时只有几千个字符。 Mumps 程序作为源代码而不是编译后的二进制文件加载到内存中。 这样做是因为确定编译的 Mumps 程序将远远大于相应的源代码版本,特别是如果源代码使用缩减缩写的大小虽然解释的程序运行速度较慢,但由于不需要分页而节省的时间弥补了损失的时间 进出大型二进制模块,最初是用磁带完成的。 此外,与大多数数据库应用程序的情况一样 / " 大部分程序时间都花在等待数据库访问上,因此解释开销因素实际上并不是很大作为一个额外的好处,小源代码模块使用较少的磁盘空间,当它变得可用时,这是非常大的 昂贵的

    直到今天,仍然可以看到小内存机器的遗留问题,因为 Mumps 程序员倾向于简化他们的代码,有时甚至过度,尽管这样做的最初原因早已过去。由于其简单、低成本和易用性,Mumps 迅速流行起来,并且 被用于许多医疗应用。 例如,COSTAR(计算机存储的门诊记录)是一种医疗记录、财务管理和报告系统,于 20 世纪 70 年代中期开发用于门诊护理设置,并在全球范围内广泛使用和改编

    如今,Mumps 程序广泛应用于金融和临床应用。如果您看过医生、在医院看过病或使用过 ATM 机,您的数据可能已由 Mumps 程序处理过。Mumps 程序是美国退伍军人管理局的基础计算机化医疗记录系统 Vista(退伍军人健康信息系统和技术架构),是世界上同类系统中最大的。 Vista 是 80 种不同的软件子系统的集合,支持美国最大的医疗记录系统。它支持超过 800 万退伍军人的医疗记录,被 163 家医院、800 多家诊所和 135 家疗养院的 180,000 名医务人员使用。包括麻省总医院)、MEDITECH、GE Healthcare(前身为 IDX Systems 和 Centricity)、Sunquest InformationSystems、DASA、Quest Diagnostics 和 Dynacare 等

    一些最大和最著名的医院使用基于腮腺炎的电子健康记录系统。 其中包括:Kaiser Permanente、Cleveland Clinic、Johns Hopkins Medicine Hospitals、UCLA Health、Texas Health Resources、Massachusetts GeneralHospital、纽约市的 Mount Sinai Health System 和 Duke University HealthSystem 在金融机构中,它被 Ameritrade、英格兰银行和巴克莱银行使用 银行,以及其他

    Mumps 通过提供保持活力 除了顺序和直接文件访问之外,Mumps 还作为语言的一个组成部分实现了分层和多维数据库范例。当被视为树时,数据节点可以作为路径描述来寻址,这种方式对于新手程序员来说很容易在相对较短的时间内掌握;或者,树可以被视为有效无限大小的稀疏 n 维矩阵 Mumps 支持内置的字符串操作运算符和为程序员提供访问有效方法以完成复杂字符串操作和模式匹配操作的功能 Mumps 在廉价的商品服务器上运行,并且可以随着需求的增长轻松扩展。性能和吞吐量 Mumps 无需数据库管理员即可轻松管理 Mumps 数据库符合 ACID(原子性、一致性、隔离性、持久性。

    Mumps Implementations

    目前可用的实现是:

    1. Intersystems (Caché)
      http://www.intersystems.com/ (called Caché®)
    2. FIS (GT.M)
      http://www.fisglobal.com/products-technologyplatforms-gtm
    3. MUMPS Database and Language by Ray Newman
      http://sourceforge.net/projects/mumps/
    4. Open Mumps
      http://www.cs.uni.edu/~okane/
      这些实现接受的方言和扩展各不相同,因此您应该查阅所用版本的文档以获取更多详细信息。 这里使用的示例来自 GPL Mumps。

    Variables

    Mumps 有两种类型的变量:局部变量和全局变量。全局变量存储在磁盘上并在创建它们的程序终止时继续存在。局部变量存储在内存中并在创建它们的程序终止时消失。
    Mumps 变量名称必须以字母或百分号开头 ( %) 并且可能后跟字母、百分号或数字变量名称区分大小写。 下划线 ( _) 和美元符号 ( $ ) 字符在变量名中是不合法的。全局变量名总是以音调符号 ( ^ ) 开头,局部变量不是所有 Mumps 变量的内容存储为可变长度的字符串。允许的最大字符串长度是由实现决定,但这个数字通常至少为 512,而且通常要大得多(在 Open Mumps 中通常为 4096)。

    在 Mumps 中没有数据声明语句。 第一次将值赋给变量名时,会根据需要创建变量。
    可以通过设置(set)、合并(merge)或读取命令将值分配给变量。如果变量作为新命令的参数出现,也可以创建变量。一旦创建,局部变量通常会持续存在,直到程序结束或它们被 kill 命令销毁。 全局变量一直存在,直到被 kill 命令销毁。
    在其最初的实现中,Mumps 无法将参数传递给调用的例程。 因此,直到今天,变量通常为所有例程所知。

    Mumps 变量没有类型。基本数据类型是字符串,尽管整数、浮点数和逻辑(真/假)运算可以在字符串变量上执行,如果它们的内容是合适的。
    字符串中的值至少是 32 到 127(十进制)之间的任何 ASCll 字符代码。 一些实现允许其他语言的额外字符编码。
    在 Open Mumps 中,可以使用 $char() 函数(在下面讨论)在写入命令中生成此范围之外的一些字符。
    变量通过设置、合并或读取命令接收值。数组引用是通过向变量名称添加带括号的索引列表形成的,例如:
    name(“abc”,2,3)
    索引可以评估为数字或字符串或两者。 字符串常量必须被引用,数字常量不需要被引用。
    字符串常量用双引号 (“) 括起来。
    通过在字符串中放置两个紧邻的双引号 (”"),可以将双引号本身插入到字符串中。
    单引号 (') 是非运算符,在带引号的字符串中没有特殊含义。
    在某些特殊字符前加反斜杠的 C/C++/ava 约定不适用于 Mumps。

    Arrays

    Mumps 中的数组有两种类型:本地和全局。
    全局数组名称总是以抑扬符 (^) 为前缀,并存储在磁盘上。它们在程序终止时保留其值,一旦设置,其他同时执行的程序就可以访问它们。它们只能被 kill 命令删除。
    当创建它们的程序终止或当它们是 kill 命令的主题时,本地数组将被销毁。其他程序无法访问本地数组,除非创建它们的程序调用其他程序。
    数组(全局和局部)未声明或预先确定尺寸。
    数组(全局和局部)元素在首次引用时由 set、merge 或 read 语句创建。
    数组(全局和局部)的索引由逗号分隔的数字或字符串或两者的列表给出,并用括号括起来。

    数组(本地和全局)是稀疏的。 也就是说,如果您创建了一个数组元素,假设元素 10,这并不意味着 Mumps 已经创建了任何其他元素。 换句话说,它并不意味着存在元素 1 到 9。您必须根据需要显式创建这些元素。数组索引可以是正数或负数、字符串或两者的组合。Mumps 中的数组可能具有多个维度 受最大行长度限制(至少 512 个字符,通常更长)。
    数组可以被视为矩阵或树。
    当被视为树时,每个连续的索引都是从根到内部或叶节点的路径描述的一部分。
    数据可以存储(或不存储)在树路径上的任何节点。
    全局数组名称以抑扬符 (^) 为前缀,而本地数组则没有。当程序结束时,本地数组会被销毁,而全局数组作为磁盘驻留,会保留下来。
    在这里插入图片描述

    Arrays as Trees

    Mumps 最初是为了管理医疗记录而编写的,这些医疗记录通常被视为按层次组织的。 出于这个原因,设计人员需要一种方便的方法来将数据存储在树结构中,并因此开发了全局数组的概念。
    在 Mumps 中,全局和局部数组都可以看作是树。 当被视为一棵树时,数组引用中的每个连续索引都被解释为从数组的根到节点的路径描述的一部分。 路径上的节点可以选择性地包含数据。 在下图中,数组名为 root。 为简单起见,使用了数字索引,但字符串索引也是合法的。
    在这里插入图片描述
    在这里插入图片描述

    String Indices

    Mumps 允许数字和字符串索引。
    在这里插入图片描述

    有时索引本身就是数据,节点上实际上没有存储任何内容(“”是空字符串)。在上面就是这种情况,最后的索引值是实际的测试结果。 使用函数 $data() 和 $order() 很容易浏览树的任何级别的节点并检索索引的值。在上面的代码中,患者 1234 的血细胞比容 (hct) 结果存储了几个日期。每次观察的实际 hct 结果是最后一个索引值。

    Access to Mumps Arrays

    如果您知道所有索引,则可以直接访问 Mumps 数组节点。
    或者,您可以通过 $data() 和 $order() 内置函数在数组树中导航。
    其中第一个是 $data(),它告诉您节点是否存在、是否有数据以及是否有后代。
    第二个 $order() 用于在树的给定级别从一个兄弟节点导航到具有字母顺序更高(或更低)索引值的下一个节点。
    在这里插入图片描述

    Mumps Commands

    Mumps 程序由一系列命令组成。大多数命令都有要执行的参数,尽管有些命令没有参数。在大多数情况下,一行上可能会出现多个命令。
    一些带有参数的常见命令示例是:
    set(赋值)
    for(循环控制)
    if(条件执行).
    read(输入)
    write(输出)
    另一方面,halt 命令没有参数(如果有,它就变成了 hang 命令)。
    每个 Mumps 命令都以一个关键字开头,在大多数情况下,该关键字可能会被缩写。大多数缩写都是一个字母。 过度缩写的 Mumps code 紧凑但难以阅读。
    完整列表如下。
    Mumps 命令可以选择性地跟在所谓的后置条件之后。后置条件是紧跟在命令之后的真值表达式。命令和后置条件之间没有空格但是,后置条件与命令词(或命令缩写)通过一个冒号分隔 。
    如果后置条件表达式为真,则执行命令及其参数如果表达式为假,则跳过命令及其所有参数并执行下一个命令。以下是应用于设置命令的后置条件示例 :set:a=b i=2
    仅当 a 等于 b 时,才会执行设置命令参数(将 2 分配给变量 i)。一些命令允许对单个参数进行后置条件化。
    为什 	么可以直接操纵

  • 相关阅读:
    GBase 8c V3.0.0数据类型——data_part
    Java继承——抽象类与接口的比较以及内部类、匿名类、异常类......
    考过HCIP依然转行失败,职业网工最看重的到底是什么
    Android 11.0 展讯平台关于ota升级开机logo的相关功能实现
    题目 1061: 二级C语言-计负均正
    filter: grayscale(1); | 网页变灰
    树与图的广度优先遍历
    jenkins 安装以及自动构建maven项目并且运行
    【第三部分 | 移动端开发】2:流式布局
    MySQL数据类型
  • 原文地址:https://blog.csdn.net/dao_0123/article/details/127830675