Парадигма | Императивная, процедурная |
---|---|
Разработано | Нил Паппалардо |
Впервые появился | 1966 ; 55 лет назад ( 1966) |
Стабильный выпуск | ANSI X11.1-1995 / 8 декабря 1995 г. ( 1995-12-08) |
Печатная дисциплина | Бестиповый |
Операционные системы | Кроссплатформенность |
Под влиянием | |
JOSS | |
Под влиянием | |
PSL, Caché ObjectScript |
MUMPS («Многопрограммная система для больниц общего профиля Массачусетса»), или M, представляет собой высокопроизводительную базу данных типа "ключ-значение" для обработки транзакций со встроенным языком программирования. Первоначально он был разработан в Массачусетской больнице общего профиля для управления информационными системами больничных лабораторий.
С тех пор технология MUMPS стала доминирующей базой данных для информационных систем здравоохранения и электронных медицинских карт в Соединенных Штатах. Информационные системы на основе MUMPS используются более чем в 40% больниц в США, во всех федеральных больницах и клиниках США и предоставляют медицинские информационные услуги более чем 54% пациентов в США.
Уникальной особенностью технологии MUMPS является интегрированный язык базы данных, обеспечивающий прямой высокоскоростной доступ для чтения и записи к постоянному хранилищу на диске. Это обеспечивает тесную интеграцию неограниченного количества приложений в единой базе данных и обеспечивает чрезвычайно высокую производительность и надежность в качестве системы обработки транзакций в режиме онлайн.
MUMPS - это язык, предназначенный для создания приложений баз данных. Дополнительные языковые функции были включены, чтобы помочь программистам создавать приложения с минимальными вычислительными ресурсами. Исходные реализации были интерпретированы, хотя современные реализации могут быть полностью или частично скомпилированы. Отдельные «программы» запускаются в «разделах» памяти. Ранние разделы памяти MUMPS были ограничены 2048 байтами, поэтому агрессивная аббревиатура очень помогала мультипрограммированию на оборудовании с сильно ограниченными ресурсами, потому что более одного задания MUMPS могло уместиться в очень небольшой объем памяти, существующий на оборудовании в то время. Еще одной особенностью языкового дизайна была возможность предоставлять многопользовательские системы. Слово « M конечного P rogramming» в аббревиатуре указует на это. Даже самые ранние машины с MUMPS поддерживали одновременное выполнение нескольких заданий. С переходом от мини-компьютеров к микрокомпьютерам несколько лет спустя даже «однопользовательский ПК» с одним 8-битным процессором и 16 или 64 КБ памяти мог поддерживать нескольких пользователей, которые могли подключаться к нему из (не графические ) видеотерминалы.
Поскольку изначально памяти было мало, при разработке языка MUMPS ценился очень краткий код. Таким образом, каждая команда или имя функции MUMPS может быть сокращено от одной до трех букв, например, Quit (выход из программы) как Q, $ P = функция $ Piece, R = команда чтения, $ TR = функция $ Translate. Пробелы и маркеры конца строки важны в MUMPS, потому что область видимости строки способствовала тому же лаконичному дизайну языка. Таким образом, одна строка программного кода может выражать с помощью нескольких символов идею, для которой другим языкам программирования может потребоваться в 5-10 раз больше символов. Аббревиатура была общей чертой языков, разработанных в этот период (например, FOCAL-69, ранние BASIC, такие как Tiny BASIC и т. Д.). Прискорбным побочным эффектом этого, в сочетании с ранней необходимостью писать минималистичный код, было то, что программисты MUMPS обычно не комментировали код и использовали обширные сокращения. Это означало, что даже опытный программист MUMPS не мог просто пролистать страницу кода, чтобы увидеть его функцию, но должен был проанализировать его построчно.
Взаимодействие с базой данных прозрачно встроено в язык. Язык MUMPS предоставляет иерархическую базу данных, состоящую из постоянных разреженных массивов, которые неявно «открываются» для каждого приложения MUMPS. Все имена переменных с префиксом символа вставки («^») используют постоянное (вместо ОЗУ) хранилище, сохранят свои значения после выхода из приложения и будут видны (и могут быть изменены) другими запущенными приложениями. Переменные, использующие это общее и постоянное хранилище, называются глобальными переменными в MUMPS, потому что область видимости этих переменных «глобально доступна» для всех заданий в системе. Более недавнее и более распространенное использование имени «глобальные переменные» в других языках - это более ограниченная область видимости имен, исходя из того факта, что переменные с незаданной областью «глобально» доступны для любых программ, работающих в одном процессе, но не используются совместно несколько процессов. Режим MUMPS Storage (то есть глобальные объекты, хранящиеся в виде постоянных разреженных массивов) придает базе данных MUMPS характеристики документно-ориентированной базы данных.
Все имена переменных, не начинающиеся с символа вставки («^»), являются временными и частными. Как и глобальные переменные, у них также есть иерархическая модель хранения, но они «доступны локально» только для одного задания, поэтому их называют «локальными». И «глобальные», и «локальные» могут иметь дочерние узлы (называемые индексами в терминологии MUMPS). Подстрочные индексы не ограничиваются цифрами - любой символ ASCII или группа символов может быть идентификатором подстрочного индекса. Хотя это не редкость для современных языков, таких как Perl или JavaScript, в конце 1970-х это было очень необычной функцией. Эта возможность не была повсеместно реализована в системах MUMPS до стандарта ANSI 1984 года, поскольку стандартом требовались только канонически числовые индексы. Таким образом, переменная с именем «Автомобиль» может иметь индексы «Дверь», «Рулевое колесо» и «Двигатель», каждый из которых может содержать значение и иметь собственные индексы. Переменная ^ Car («Дверь») может иметь, например, индекс вложенной переменной «Цвет». Таким образом, вы могли бы сказать
SET ^Car("Door","Color")="BLUE"
для изменения вложенного дочернего узла ^ Car. В терминах MUMPS «Цвет» - это второй индекс переменной ^ Car (имена дочерних узлов и сами дочерние узлы также называются нижними индексами). Иерархические переменные похожи на объекты со свойствами во многих объектно-ориентированных языках. Кроме того, дизайн языка MUMPS требует, чтобы все индексы переменных автоматически сохранялись в отсортированном порядке. Числовые индексы (включая числа с плавающей запятой) сохраняются от наименьшего к наибольшему. Все нечисловые индексы хранятся в алфавитном порядке после чисел. В терминологии MUMPS это канонический порядок. Используя только неотрицательные целые индексы, программист MUMPS может эмулировать типы данных массивов из других языков. Хотя MUMPS изначально не предлагает полный набор функций СУБД, таких как обязательные схемы, несколько систем СУБД были построены на его основе, которые предоставляют разработчикам приложений функции плоских файлов, реляционных и сетевых баз данных.
Кроме того, существуют встроенные операторы, которые обрабатывают строку с разделителями (например, значения, разделенные запятыми ) как массив. Ранние программисты MUMPS часто сохраняли структуру связанной информации в виде строки с разделителями, анализируя ее после того, как она была прочитана; это сэкономило время доступа к диску и дало значительное преимущество в скорости на некотором оборудовании.
MUMPS не имеет типов данных. Числа можно рассматривать как строки цифр, или строки можно рассматривать как числа с помощью числовых операторов (с принуждением, в терминологии MUMPS). Однако принуждение может иметь некоторые странные побочные эффекты. Например, при принуждении строки синтаксический анализатор превращает как можно большую часть строки (начиная слева) в число, а затем отбрасывает оставшуюся часть. Таким образом, утверждение IF 20lt;"30 DUCKS"
оценивается как TRUE
в MUMPS.
Другие функции языка призваны помочь приложениям MUMPS взаимодействовать друг с другом в многопользовательской среде. Блокировки базы данных, идентификаторы процессов и атомарность транзакций обновления базы данных - все это требуется для стандартных реализаций MUMPS.
В отличие от языков в традициях Си или Вирта, некоторые пробелы между операторами MUMPS имеют большое значение. Один пробел отделяет команду от ее аргумента, а пробел или новая строка отделяет каждый аргумент от следующего токена MUMPS. Команды, которые не принимают аргументов (например, ELSE
), требуют двух следующих пробелов. Идея состоит в том, что один пробел отделяет команду от (несуществующего) аргумента, следующий отделяет «аргумент» от следующей команды. Новые строки также важны; an IF
, ELSE
или FOR
команда обрабатывает (или пропускает) все остальное до конца строки. Чтобы эти операторы управляли несколькими строками, вы должны использовать DO
команду для создания блока кода.
Простое "Hello, World!" программа в MUMPS может быть:
hello() write "Hello, World!",! quit
и будет запущен из командной строки MUMPS с командой do ^hello
. Поскольку MUMPS позволяет объединять команды в одну строку, и поскольку команды могут быть сокращены до одной буквы, эту процедуру можно было бы сделать более компактной:
hello() w "Hello, World!",! q
Знак " ,!
" после текста создает новую строку.
MUMPS был разработан Нилом Паппалардо, Робертом Гринсом и Куртом Марблом в лаборатории доктора Окто Барнетта в Массачусетской больнице общего профиля (MGH) в Бостоне в течение 1966 и 1967 годов. Позднее он был переписан техническими руководителями Деннисом «Дэном» Бревиком и Полом Стайлосом из DEC в 1970 и 1971 годах.
Первоначальная система MUMPS, как и Unix несколько лет спустя, была построена на DEC PDP-7. Окто Барнетт и Нил Паппалардо также участвовали в планировании MGH для больничной информационной системы, получили обратно совместимый PDP-9 и начали использовать MUMPS при приеме в больницу и при составлении отчетов о лабораторных испытаниях. MUMPS был тогда интерпретируемым языком, но даже тогда он включал иерархическую файловую систему базы данных для стандартизации взаимодействия с данными и абстрактных дисковых операций, поэтому они выполнялись только самим языком MUMPS.
Некоторые аспекты свинки можно проследить из RAND Corporation «s JOSS через BBN » s TELCOMP и STRINGCOMP. Команда MUMPS решила включить переносимость между машинами в качестве цели проектирования.
Многозадачность была расширенной функцией языка MUMPS, которая не поддерживалась широко в операционных системах или компьютерном оборудовании того времени. Хотя разделение времени на мэйнфреймах становилось все более распространенным явлением в таких системах, как Multics, на большинстве мини-компьютеров не выполнялись параллельные программы, а многопоточность была вообще недоступна. Даже на мэйнфреймах вариант пакетной обработки, при котором программа выполнялась до конца, был наиболее распространенной реализацией для операционной системы с несколькими программами.
Прошло несколько лет, прежде чем была разработана Unix. Отсутствие оборудования для управления памятью также означало, что всякая многопроцессорная обработка чревата возможностью того, что указатель памяти может изменить какой-либо другой процесс. Программы MUMPS вообще не имеют стандартного способа обращения к памяти напрямую, в отличие от языка C, поэтому, поскольку многозадачность обеспечивалась языком, а не какой-либо программой, написанной на этом языке, было невозможно иметь риск, существовавший для другие системы.
Система Дэна Бревика DEC MUMPS-15 была адаптирована к DEC PDP-15, где она жила некоторое время. Впервые он был установлен в системе управления данными здравоохранения в Денвере в мае 1971 года. Переносимость оказалась полезной, и MUMPS получил правительственный исследовательский грант, поэтому MUMPS был передан в общественное достояние, что было требованием для получения грантов. MUMPS вскоре был перенесен на ряд других систем, включая популярные DEC PDP-8, Data General Nova, а также на DEC PDP-11 и миникомпьютер Artronix PC12. Слухи о MUMPS распространились в основном через медицинское сообщество и получили широкое распространение, часто модифицируясь на местном уровне для их собственных нужд.
К началу 1970-х было множество разнообразных реализаций MUMPS на различных аппаратных платформах. Еще одним примечательной платформой была Пол Стилоса декабря MUMPS-11 на PDP-11, и МЕДИТЕК «s MIIS. Осенью 1972 года многие пользователи MUMPS посетили конференцию в Бостоне, которая стандартизировала тогда расколотый язык и для этого создали Группу пользователей MUMPS и Комитет по развитию MUMPS (MDC). Эти усилия оказались успешными; стандарт был завершен к 1974 г. и утвержден 15 сентября 1977 г. как стандарт ANSI, X11.1-1977. Примерно в то же время DEC выпустила DSM-11 (цифровой стандарт MUMPS) для PDP-11. Это быстро доминировало на рынке и стало эталонной реализацией того времени. Кроме того, InterSystems продавала ISM-11 для PDP-11 (который был идентичен DSM-11).
В начале 1980-х годов несколько поставщиков выпустили на рынок платформы на основе MUMPS, соответствующие стандарту ANSI. Наиболее значимыми были:
Другие компании разработали важные реализации MUMPS:
В этот период также была отмечена значительная активность MDC. Вторая редакция стандарта ANSI для MUMPS (X11.1-1984) была утверждена 15 ноября 1984 г.
Департамент по делам ветеранов США (ранее - Управление по делам ветеранов) был одним из первых, кто принял язык MUMPS. Их разработка (и последующий вклад в кодовую базу бесплатного приложения MUMPS) оказали влияние на многих медицинских пользователей по всему миру. В 1995 году система приема / отслеживания / выписки пациентов Департамента по делам ветеранов, децентрализованная больничная компьютерная программа (DHCP), была удостоена Смитсоновской премии Computerworld за лучшее использование информационных технологий в медицине. В июле 2006 года Департамент по делам ветеранов (VA) / Управление здравоохранения ветеранов (VHA) был удостоен награды за инновации в американском правительстве, представленной Институтом пепла Школы государственного управления им. Джона Ф. Кеннеди при Гарвардском университете за расширение DHCP в архитектуре информационных систем и технологий здравоохранения для ветеранов ( VistA ). Почти вся больничная система VA в Соединенных Штатах, Индийская служба здравоохранения и основные части больничной системы CHCS Министерства обороны используют базы данных MUMPS для отслеживания клинических данных.
Другие медицинские ИТ-компании, использующие MUMPS, включают:
Многие справочные лаборатории, такие как DASA, Quest Diagnostics и Dynacare, используют программное обеспечение MUMPS, написанное или основанное на коде Antrim Corporation. Antrim была куплена компанией Misys Healthcare (ныне Sunquest Information Systems ) в 2001 году.
MUMPS также широко используется в финансовых приложениях. MUMPS быстро завоевал популярность в финансовом секторе и используется во многих банках и кредитных союзах. Он используется TD Ameritrade, а также Банком Англии и Barclays Bank.
С 2005 года наиболее популярными реализациями MUMPS были Greystone Technology MUMPS (GT.M) от Fidelity National Information Services и Caché от Intersystems Corporation. Европейское космическое агентство 13 мая 2010 г. объявило, что будет использовать базу данных InterSystems Caché для поддержки миссии Gaia. Цель этой миссии - нанести на карту Млечный Путь с беспрецедентной точностью. InterSystems постепенно отказывается от Caché в пользу Iris.
Другие текущие реализации включают:
ANSI X11.1-1995 дает полное формальное описание языка; аннотированная версия этого стандарта доступна в Интернете.
Типы данных: Существует один универсальный тип данных, который неявно принуждать к строке, целое число, или типов данных с плавающей точкой в качестве контекста.
Булевы (называемые истинностные значения в эпидемическом паротите): В IF команда и другой синтаксис, который имеет выражение оцениваемое как условия, любое значение строки вычисляются как числовое значение, и, если это ненулевое значение, то это интерпретируется как значение True. alt;b
дает 1, если a меньше b, в противном случае - 0.
Заявления: Нет. Все переменные динамически создаются при первом присвоении значения.
Строки: важные синтаксические объекты, в отличие от их статуса в языках программирования на C или Pascal. Несколько операторов в строке разрешены и являются обычным явлением. Область действия любой команды IF, ELSE и FOR - «остаток текущей строки».
Чувствительность к регистру: в командах и встроенных функциях регистр не учитывается. Напротив, имена и метки переменных чувствительны к регистру. Нет особого значения для прописных и строчных букв и нескольких широко используемых соглашений. Знак процента (%) разрешен в качестве первого символа переменных и меток.
Постусловия: выполнение почти любой команды можно контролировать, поставив после нее двоеточие и выражение истинности. SET:Nlt;10 A="FOO"
устанавливает A в "FOO", если N меньше 10; DO:Ngt;100 PRINTERR,
выполняет PRINTERR, если N больше 100. Эта конструкция предоставляет условное выражение, область действия которого меньше полной строки.
Сокращение: почти все команды и собственные функции можно сокращать до одного, двух или трех символов.
Зарезервированные слова: Нет. Поскольку MUMPS интерпретирует исходный код по контексту, нет необходимости в зарезервированных словах. Вы можете использовать имена языковых команд в качестве переменных, поэтому следующий код MUMPS является совершенно допустимым:
GREPTHIS() NEW SET,NEW,THEN,IF,KILL,QUIT SET IF="KILL",SET="11",KILL="l1",QUIT="RETURN",THEN="KILL" IF IF=THEN DO THEN QUIT:$QUIT QUIT QUIT ; (quit) THEN IF IF,SETamp;KILL SET SET=SET+KILL QUIT
MUMPS можно сделать более запутанным с помощью синтаксиса сокращенного оператора, как показано в этом кратком примере, полученном из приведенного выше примера:
GREPTHIS() N S,N,T,I,K,Q S I="K",S="11",K="l1",Q="R",T="K" I I=T D T Q:$Q Q Q T I I,Samp;K S S=S+K Q
Массивы: создаются динамически, хранятся в виде B-деревьев, являются разреженными (т. Е. Почти не используют места для отсутствующих узлов), могут использовать любое количество индексов, а индексы могут быть строковыми или числовыми (включая числа с плавающей запятой). Массивы всегда автоматически сохраняются в отсортированном порядке, поэтому никогда не возникает необходимости сортировать, упаковывать, переупорядочивать или иным образом реорганизовывать базу данных. Встроенные функции, такие как $ DATA, $ ORDER, $ NEXT (не рекомендуется) и $ QUERY, обеспечивают эффективное изучение и обход основной структуры массива на диске или в памяти.
for i=10000:1:12345 set sqtable(i)=i*i set address("Smith","Daniel")="dpbsmith@world.std.com"
Локальные массивы: имена переменных, не начинающиеся с символа символа "^", сохраняются в памяти по процессу, являются частными для процесса создания и истекают после завершения процесса создания. Доступное хранилище зависит от реализации. Для тех реализаций, в которых используются разделы, он ограничен размером раздела (небольшой раздел может быть 32 КБ). Для других реализаций это может быть несколько мегабайт.
Глобальные массивы: ^abc, ^def
. Они хранятся на диске, доступны для всех процессов и остаются постоянными после завершения процесса создания. Очень большие глобальные объекты (например, сотни гигабайт) практичны и эффективны в большинстве реализаций. Это основной механизм "базы данных" MUMPS. Он используется вместо вызова операционной системы для создания, записи и чтения файлов.
Косвенность: @VBL
может использоваться во многих контекстах и эффективно заменяет содержимое VBL другим оператором MUMPS. SET XYZ="ABC" SET @XYZ=123
устанавливает для переменной ABC значение 123. SET SUBROU="REPORT" DO @SUBROU
выполняет подпрограмму REPORT. Эта подстановка допускает ленивую оценку и позднее связывание, а также является эффективным эквивалентом «указателей» в других языках.
Функция Piece: разбивает переменные на сегментированные части, руководствуясь заданной пользователем разделительной строкой (иногда называемой «разделителем»). Те, кто знает awk, найдут это знакомым. $PIECE(STRINGVAR,"^",3)
означает «третью часть строки STRINGVAR, разделенную кареткой». Функция Piece также может выступать в качестве цели назначения (команда SET).
$PIECE("world.std.com",".",2)
дает "std".
После
SET X="dpbsmith@world.std.com"
SET $P(X,"@",1)="office"
превращает X в "office@world.std.com" (обратите внимание, что $ P эквивалентно $ PIECE и может быть записано как таковое).
Функция заказа: эта функция обрабатывает свой ввод как структуру и находит следующий существующий индекс, который имеет ту же структуру, за исключением последнего индекса. Он возвращает отсортированное значение, упорядоченное после введенного в качестве входных данных. (При этом ссылка на массив рассматривается как данные с адресацией по содержимому, а не как адрес значения.)
Set stuff(6)="xyz",stuff(10)=26,stuff(15)=""
$Order(stuff(""))
дает 6, $Order(stuff(6))
дает 10, $Order(stuff(8))
дает 10, $Order(stuff(10))
дает 15, $Order(stuff(15))
дает "".
Set i="" For Set i=$O(stuff(i)) Quit:i="" Write !,i,10,stuff(i)
Здесь For без аргументов повторяется до тех пор, пока не будет остановлен завершающим Quit. В этой строке печатается таблица, состоящая из i и прочее (i), где i последовательно равняется 6, 10 и 15.
Для итерации базы данных функция Order возвращает следующий ключ для использования.
GTMgt;S n="" GTMgt;S n=$order(^nodex(n)) GTMgt;zwr n n=" building" GTMgt;S n=$order(^nodex(n)) GTMgt;zwr n n=" name:gd" GTMgt;S n=$order(^nodex(n)) GTMgt;zwr n n="%kml:guid"
Многопользовательская / многозадачность / многопроцессорность: MUMPS поддерживает одновременную работу нескольких пользователей и процессов, даже если базовая операционная система этого не делает (например, MS-DOS). Кроме того, существует возможность указать среду для переменной, например, указав имя компьютера в переменной (как в SET ^|"DENVER"|A(1000)="Foo"
), что может позволить вам получить доступ к данным на удаленных машинах.
Некоторые аспекты синтаксиса MUMPS сильно отличаются от синтаксиса более современных языков, что может вызвать путаницу, хотя эти аспекты различаются между разными версиями языка. В некоторых версиях не допускается использование пробелов в выражениях, так как они завершают оператор: 2 + 3
это ошибка, и его необходимо записать 2+3
. Все операторы имеют одинаковый приоритет и левоассоциативны ( 2+3*10
до 50). Операторами «меньше или равно» и «больше или равно» являются 'gt;
и 'lt;
(то есть, оператор логического отрицания '
плюс оператор строгого сравнения), хотя в некоторых версиях допускается использование более стандартного lt;=
и gt;=
соответственно. Точки ( .
) используются для отступа строк в блоке DO, а не для пробелов. Команде ELSE не нужен соответствующий IF, так как она проверяет значение встроенной системной переменной $test
.
Правила области видимости MUMPS более либеральны, чем другие современные языки. Объявленные локальные переменные ограничиваются стеком. Подпрограмма обычно может видеть все объявленные локальные do
переменные подпрограмм под ней в стеке вызовов, и подпрограммы не могут помешать вызываемым ими подпрограммам изменять свои объявленные локальные переменные, если вызывающий объект вручную не создает новый уровень стека () и не применяет псевдонимы каждой из переменных, которые они хотят. to protect ( . new x,y
) перед вызовом дочерних подпрограмм. Напротив, необъявленные переменные (переменные, созданные с их использованием, а не объявлением) входят в область видимости всех подпрограмм, выполняемых в одном процессе, и остаются в области видимости до выхода из программы.
Поскольку ссылки на базу данных MUMPS отличаются от ссылок на внутренние переменные только префиксом каретки, очень легко непреднамеренно изменить базу данных или даже удалить «таблицу» базы данных.
Все следующие позиции могут поддерживаться и поддерживаются знающими людьми в разное время:
Часть разногласий возникла в ответ на решительную защиту M со стороны одного коммерческого заинтересованного лица, InterSystems, исполнительному директору которой не нравилось название MUMPS, и он считал, что оно представляет собой серьезное маркетинговое препятствие. Таким образом, предпочтение M в некоторой степени было идентифицировано как согласование с InterSystems. Спор также отражал соперничество между организациями (Ассоциация M Technology, Комитет по развитию MUMPS, Комитеты по стандартам ANSI и ISO) относительно того, кто определяет «официальное» название языка. Некоторые авторы пытались решить эту проблему, ссылаясь на язык как M [UMPS], квадратные скобки - это обычное обозначение необязательных элементов синтаксиса. Ведущий специалист и автор реализации MUMPS с открытым исходным кодом, профессор Кевин О'Кейн, использует только «MUMPS».
Самый последний стандарт (ISO / IEC 11756: 1999, подтвержденный 25 июня 2010 г.) по-прежнему упоминает M и MUMPS в качестве официально принятых названий.
Массачусетская больница общего профиля зарегистрировала "MUMPS" в качестве товарного знака в ВПТЗ США 28 ноября 1971 года и продлила его 16 ноября 1992 года, но срок его действия истек 30 августа 2003 года.
MUMPS предлагает сравнение с операционной системой Pick. Сходства включают: