Парадигма | Императивный , процессуальный |
---|---|
Разработано | Нил Паппалардо , Курт Марбл, Роберт А. Гринс |
Впервые появился | 1966 ( 1966 ) |
Стабильный релиз | ANSI X11.1-1995 / 8 декабря 1995 г. ( 1995-12-08 ) |
Дисциплина печати | Безтиповый |
ОС | Кроссплатформенный |
Под влиянием | |
ДЖОСС | |
Под влиянием | |
PSL , Caché ObjectScript , GT.M |
MUMPS («Massachusetts General Hospital Utility Multi-Programming System»), или M , — это императивный язык программирования высокого уровня с интегрированной базой данных обработки транзакций «ключ-значение» . Первоначально он был разработан в Massachusetts General Hospital для управления медицинскими картами пациентов и информационными системами больничных лабораторий.
Технология MUMPS с тех пор расширилась как преобладающая база данных для систем медицинской информации и электронных медицинских карт в Соединенных Штатах. Информационные системы на основе MUMPS, такие как Epic Systems , предоставляют услуги медицинской информации для более чем 78% пациентов по всей территории США [1]
Уникальной особенностью технологии MUMPS является ее интегрированный язык базы данных , обеспечивающий прямой высокоскоростной доступ для чтения и записи к постоянному дисковому хранилищу. [2]
MUMPS был разработан Нилом Паппалардо , Робертом А. Гринесом и Куртом Марблом в лаборатории доктора Окто Барнетта в Массачусетской больнице общего профиля (MGH) в Бостоне в 1966 и 1967 годах. [3] Он вырос из разочарования во время проекта по поддержке больничных информационных систем Национальными институтами здравоохранения (NIH) в MGH, с разработкой на языке ассемблера на PDP-1 с разделением времени основным подрядчиком Bolt Beranek & Newman, Inc. (BBN). MUMPS появился из внутреннего проекта « skunkworks » в MGH Паппалардо, Гринеса и Марбла по созданию альтернативной среды разработки. В результате первоначальной демонстрации возможностей предложение доктора Барнетта NIH в 1967 году о возобновлении гранта на проект больничного компьютера сделало смелый шаг, предложив, чтобы система была построена на MUMPS в будущем, а не полагалась на подход BBN. Проект был профинансирован, и началось серьезное внедрение системы в MUMPS.
Первоначальная система MUMPS, как и Unix несколько лет спустя, была построена на DEC PDP-7 . Окто Барнетт и Нил Паппалардо получили обратно совместимую PDP-9 и начали использовать MUMPS в цикле приема и отчетах о лабораторных тестах. MUMPS тогда был интерпретируемым языком , но даже тогда включал иерархическую файловую систему базы данных для стандартизации взаимодействия с данными и абстрактными дисковыми операциями, поэтому они выполнялись только самим языком MUMPS. MUMPS также использовался в свои самые ранние дни в экспериментальной системе записи клинических заметок о ходе лечения [4] и системе записи отчетов по радиологии. [5]
Некоторые аспекты MUMPS можно проследить от JOSS корпорации RAND до TELCOMP и STRINGCOMP корпорации BBN . Команда MUMPS решила включить переносимость между машинами в качестве цели проектирования.
Расширенной функцией языка MUMPS, не поддерживаемой широко в операционных системах или в компьютерном оборудовании той эпохи, была многозадачность . Хотя разделение времени на мэйнфреймах становилось все более распространенным в таких системах, как Multics , большинство мини-компьютеров не запускали параллельные программы, а потоки вообще не были доступны. Даже на мэйнфреймах вариант пакетной обработки, когда программа выполнялась до конца, был наиболее распространенной реализацией для операционной системы многопрограммирования.
Прошло несколько лет, прежде чем был разработан Unix. Отсутствие аппаратного обеспечения для управления памятью также означало, что вся многопроцессорная обработка была сопряжена с возможностью изменения указателем памяти какого-либо другого процесса. Программы MUMPS вообще не имеют стандартного способа прямого обращения к памяти, в отличие от языка C , поэтому, поскольку многозадачность обеспечивалась языком, а не какой-либо программой, написанной на этом языке, было невозможно иметь риск, который существовал для других систем.
Система DEC MUMPS-15 Дэна Бревика была адаптирована к DEC PDP-15 , где она некоторое время просуществовала. Впервые она была установлена в Health Data Management Systems в Денвере в мае 1971 года. [6] Переносимость оказалась полезной, и MUMPS получила правительственный исследовательский грант, и поэтому MUMPS была передана в общественное достояние, что было требованием для получения грантов. Вскоре MUMPS была перенесена на ряд других систем, включая популярные DEC PDP-8 , Data General Nova и на DEC PDP-11 и мини-компьютер Artronix PC12 . Молва о MUMPS распространилась в основном через медицинское сообщество и широко использовалась, часто локально модифицируясь для собственных нужд.
Версии системы MUMPS были переписаны техническими лидерами Деннисом «Дэном» Бревиком и Полом Стайлосом [6] из DEC в 1970 и 1971 годах. К началу 1970-х годов существовало множество разнообразных реализаций MUMPS на различных аппаратных платформах. Другой примечательной платформой была DEC MUMPS-11 Пола Стайлоса [6] на PDP-11 и MIIS от MEDITECH . Осенью 1972 года многие пользователи MUMPS посетили конференцию в Бостоне, которая стандартизировала тогда еще раздробленный язык, и создали для этого Группу пользователей MUMPS и Комитет по разработке MUMPS (MDC). Эти усилия оказались успешными; стандарт был завершен к 1974 году и был утвержден 15 сентября 1977 года как стандарт ANSI , X11.1-1977. Примерно в то же время DEC выпустила DSM-11 (Digital Standard MUMPS) для PDP-11. Он быстро занял лидирующие позиции на рынке и стал эталонной реализацией того времени. Кроме того, InterSystems продавала ISM-11 для PDP-11 (который был идентичен DSM-11).
В начале 1980-х годов несколько поставщиков вывели на рынок платформы на базе MUMPS, которые соответствовали стандарту ANSI. Наиболее значимыми были:
В этот период также наблюдалась значительная активность MDC. Вторая редакция стандарта ANSI для MUMPS (X11.1-1984) была утверждена 15 ноября 1984 года.
This section needs additional citations for verification. (October 2018) |
Исполнительному директору InterSystems не нравилось название MUMPS, и он считал, что оно представляет собой серьезное маркетинговое препятствие. Таким образом, предпочтение M в некоторой степени стало идентифицироваться как соответствие InterSystems. Стандарт ANSI 1990 года был открыт как для M, так и для MUMPS, и после «всемирного» обсуждения в 1992 году группы пользователей Mumps официально изменили название на M. Спор также отражал соперничество между организациями (Ассоциация технологий M, Комитет по развитию MUMPS, Комитеты по стандартам ANSI и ISO) относительно того, кто определяет «официальное» название языка. [ необходима цитата ]
По состоянию на 2020 год ISO по-прежнему упоминает как M, так и MUMPS в качестве официально принятых названий. [15]
Массачусетская больница общего профиля зарегистрировала «MUMPS» в качестве товарного знака в USPTO 28 ноября 1971 года и продлила его 16 ноября 1992 года, но срок его действия истек 30 августа 2003 года. [16]
This section contains instructions, advice, or how-to content. (February 2022) |
MUMPS — это язык, предназначенный и разработанный для создания приложений баз данных. Вторичные языковые возможности были включены, чтобы помочь программистам создавать приложения, используя минимальные вычислительные ресурсы. Первоначальные реализации были интерпретированы , хотя современные реализации могут быть полностью или частично скомпилированы . Отдельные «программы» запускаются в «разделах» памяти. Ранние разделы памяти MUMPS были ограничены 2048 байтами, поэтому агрессивное сокращение значительно способствовало многопрограммированию на оборудовании с серьезными ограничениями по ресурсам , поскольку в очень маленькую память, имевшуюся в то время в оборудовании, могло поместиться более одного задания MUMPS. Возможность предоставления многопользовательских систем была еще одной особенностью дизайна языка. Слово « М ультипрограммирование » в аббревиатуре указывает на это. Даже самые ранние машины, работающие под управлением MUMPS, поддерживали несколько заданий, работающих одновременно. С переходом от мини-компьютеров к микрокомпьютерам несколько лет спустя даже «однопользовательский ПК» с одним 8-битным процессором и 16 КБ или 64 КБ памяти мог поддерживать нескольких пользователей, которые могли подключаться к нему с помощью ( неграфических ) видеотерминалов .
Поскольку изначально память была ограничена, языковой дизайн MUMPS ценил очень краткий код. Таким образом, каждая команда MUMPS или имя функции могли быть сокращены от одной до трех букв, например, Quit (выход из программы) как Q , $P = функция $Piece , R = команда Read , $TR = функция $Translate . Пробелы и маркеры конца строки важны в MUMPS, поскольку область видимости строки способствовала тому же краткому дизайну языка. Таким образом, одна строка программного кода могла выразить с помощью нескольких символов идею, для которой другим языкам программирования могло потребоваться в 5–10 раз больше символов. Сокращения были общей чертой языков, разработанных в этот период (например, FOCAL-69 , ранние BASIC, такие как Tiny BASIC и т. д.). Неприятным побочным эффектом этого, в сочетании с ранней потребностью писать минималистичный код, было то, что программисты MUMPS обычно не комментировали код и использовали обширные сокращения. Это означало, что даже опытный программист MUMPS не мог просто просмотреть страницу кода, чтобы увидеть ее функцию, а должен был проанализировать ее построчно.
Взаимодействие с базой данных прозрачно встроено в язык. Язык MUMPS предоставляет иерархическую базу данных , состоящую из постоянных разреженных массивов , которая неявно «открывается» для каждого приложения MUMPS. Все имена переменных, начинающиеся с символа вставки ( ^
), используют постоянное (вместо ОЗУ) хранилище, сохраняют свои значения после выхода из приложения и будут видны (и могут быть изменены) другими запущенными приложениями. Переменные, использующие это общее и постоянное хранилище, называются глобальными в MUMPS, поскольку область действия этих переменных «глобально доступна» всем заданиям в системе. Более позднее и более распространенное использование названия «глобальные переменные» в других языках представляет собой более ограниченную область действия имен, исходя из того факта, что не имеющие области действия переменные «глобально» доступны любым программам, работающим в том же процессе, но не разделяются между несколькими процессами. Режим хранения MUMPS (т. е. глобальные переменные, хранящиеся как постоянные разреженные массивы), придает базе данных MUMPS характеристики документоориентированной базы данных . [17]
Все имена переменных, которые не имеют префикса в виде символа вставки ( ^
), являются временными и частными. Как и глобальные переменные, они также имеют иерархическую модель хранения, но доступны только «локально» для одной задачи, поэтому они называются «локальными». Как «глобальные», так и «локальные» могут иметь дочерние узлы (называемые индексами в терминологии MUMPS). Индексы не ограничиваются цифрами — любой символ ASCII или группа символов могут быть идентификатором индекса. Хотя это не редкость для современных языков, таких как Perl или JavaScript, это была весьма необычная функция в конце 1970-х годов. Эта возможность не была повсеместно реализована в системах MUMPS до стандарта ANSI 1984 года, поскольку стандарт требовал, чтобы были разрешены только канонически числовые индексы. [18] Таким образом, переменная с именем «Car» может иметь индексы «Door», «Steering Wheel» и «Engine», каждый из которых может содержать значение и иметь собственные индексы. Переменная ^Car("Door")
может иметь вложенный переменный индекс "Цвет", например. Таким образом, вы можете сказать
SET ^Car("Дверь","Цвет")="СИНИЙ"
для изменения вложенного дочернего узла ^Car
. В терминах MUMPS «Цвет» — это 2-й нижний индекс переменной ^Car
(и имена дочерних узлов, и сами дочерние узлы также называются индексами). Иерархические переменные похожи на объекты со свойствами во многих объектно-ориентированных языках. Кроме того, конструкция языка MUMPS требует, чтобы все индексы переменных автоматически хранились в отсортированном порядке. Числовые индексы (включая числа с плавающей точкой) хранятся от наименьшего к наибольшему. Все нечисловые индексы хранятся в алфавитном порядке после чисел. В терминологии MUMPS это канонический порядок . Используя только неотрицательные целочисленные индексы, программист MUMPS может эмулировать тип данных массивов из других языков. Хотя MUMPS изначально не предлагает полный набор функций СУБД, таких как обязательные схемы, на его основе было построено несколько систем СУБД, которые предоставляют разработчикам приложений функции плоских файлов, реляционных и сетевых баз данных .
Кроме того, существуют встроенные операторы, которые обрабатывают разделенную строку (например, значения, разделенные запятыми ) как массив. Ранние программисты MUMPS часто хранили структуру связанной информации как разделенную строку, анализируя ее после считывания; это экономило время доступа к диску и давало значительные преимущества в скорости на некотором оборудовании.
MUMPS не имеет типов данных. Числа можно рассматривать как строки цифр, или строки можно рассматривать как числа с помощью числовых операторов ( coerced , в терминологии MUMPS). Однако приведение может иметь некоторые странные побочные эффекты. Например, когда строка приводится, синтаксический анализатор превращает как можно большую часть строки (начиная слева) в число, а затем отбрасывает остальное. Таким образом, оператор IF 20<"30 DUCKS"
оценивается так же, как TRUE
в MUMPS.
Другие возможности языка призваны помочь приложениям MUMPS взаимодействовать друг с другом в многопользовательской среде. Блокировки баз данных, идентификаторы процессов и атомарность транзакций обновления баз данных являются обязательными для стандартных реализаций MUMPS.
В отличие от языков в традициях C или Wirth , некоторые символы пробела между операторами MUMPS имеют значение. Один пробел отделяет команду от ее аргумента, а пробел или новая строка отделяет каждый аргумент от следующего токена MUMPS. Команды, не принимающие аргументов (например, ELSE
), требуют двух следующих пробелов. Концепция заключается в том, что один пробел отделяет команду от (несуществующего) аргумента, следующий отделяет «аргумент» от следующей команды. Символы новой строки также имеют значение; команда IF
, ELSE
или FOR
обрабатывает (или пропускает) все остальное до конца строки. Чтобы эти операторы управляли несколькими строками, вы должны использовать DO
команду для создания блока кода.
Простая программа «Hello, World!» в MUMPS может выглядеть так:
напишите "Привет, Мир!",!
и будет запущена с командой do ^hello
после ее сохранения на диск. Для прямого выполнения кода требуется своего рода «метка» (любая буквенно-цифровая строка) в первой позиции строки программы, чтобы указать интерпретатору mumps, где начать выполнение. Поскольку MUMPS позволяет объединять команды в одну строку, и поскольку команды можно сокращать до одной буквы, эту процедуру можно сделать более компактной:
w "Привет, мир!",!
' ,!
' после текста генерирует новую строку. Этот код вернет приглашение.
ANSI X11.1-1995 дает полное формальное описание языка; аннотированная версия этого стандарта доступна в Интернете. [19]
Возможности языка включают в себя:
a<b
возвращает 1, если a меньше b, и 0 в противном случае.SET:N<10 A="FOO"
устанавливает A в «FOO», если N меньше 10; DO:N>100 PRINTERR,
выполняет PRINTERR, если N больше 100. Эта конструкция предоставляет условный оператор, область действия которого меньше полной строки.GREPTHIS() НОВЫЙ НАБОР, НОВЫЙ, ТОГДА, ЕСЛИ, УБИТЬ, ВЫЙТИ НАБОР IF="УБИТЬ", SET="11", KILL="11", ВЫЙТИ="ВОЗВРАТ", ТОГДА="УБИТЬ" ЕСЛИ ЕСЛИ=ТО ДЕЛАЙТЕ ТОГДА ВЫЙТИ:$ВЫЙТИ ВЫЙТИ ВЫЙТИ ; (выйти)ТОГДА ЕСЛИ ЕСЛИ,SET&KILL SET SET=SET+KILL ВЫЙТИ
GREPTHIS() НС,Н,Т,И,К,QSI="К",С="11",К="11",Q="Р",Т="К" II=ТДТ В:$QQQТII,S&K SS=S+KQ
для i=10000:1:12345 установить sqtable(i)=i*iзадать адрес("Смит","Дэниел")="dpbsmith@world.std.com"
^abc, ^def
. Они хранятся на диске, доступны всем процессам и сохраняются при завершении процесса создания. Очень большие глобальные объекты (например, сотни гигабайт) практичны и эффективны в большинстве реализаций. Это основной механизм «базы данных» MUMPS. Он используется вместо вызова операционной системы для создания, записи и чтения файлов.@VBL
может использоваться и эффективно заменяет содержимое VBL в другой оператор MUMPS. SET XYZ="ABC" SET @XYZ=123
устанавливает переменную ABC в 123. SET SUBROU="REPORT" DO @SUBROU
выполняет подпрограмму с именем REPORT. Эта замена допускает ленивую оценку и позднее связывание, а также фактически является операционным эквивалентом «указателей» в других языках.$PIECE(STRINGVAR,"^",3)
означает «третья часть STRINGVAR , разделенная символом «каретка ». Функция piece также может появляться как цель присваивания (команда SET).$PIECE("world.std.com",".",2)
урожайностьстандарт.УСТАНОВИТЬ X="dpbsmith@world.std.com"
SET $P(X,"@",1)="office"
приводит к тому, что X становится «office@world.std.com» (обратите внимание, что $P эквивалентно $PIECE и может быть записано именно так).Установить 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="" Для Set i=$O(stuff(i)) Выход:i="" Запись !,i,10,stuff(i)
stuff(i)
ГТМ>С н=""GTM>S n=$order(^nodex(n))GTM>zwr nн="здание"GTM>S n=$order(^nodex(n))GTM>zwr nn=" имя:gd"GTM>S n=$order(^nodex(n))GTM>zwr nn="%kml:guid"
MUMPS поддерживает несколько одновременных пользователей и процессов, даже если базовая операционная система этого не делает (например, MS-DOS ). Кроме того, есть возможность указать среду для переменной, например, указав имя машины в переменной (как в SET ^|"DENVER"|A(1000)="Foo"
), что может позволить вам получить доступ к данным на удаленных машинах.
This article's "criticism" or "controversy" section may compromise the article's neutrality. (February 2022) |
Некоторые аспекты синтаксиса MUMPS сильно отличаются от синтаксиса более современных языков, что может вызывать путаницу, хотя эти аспекты различаются в разных версиях языка. В некоторых версиях пробелы не допускаются внутри выражений, так как они заканчивают оператор: 2 + 3
является ошибкой и должно быть написано 2+3
. Все операторы имеют одинаковый приоритет и являются левоассоциативными ( 2+3*10
оценивается как 50). Операторами для «меньше или равно» и «больше или равно» являются '>
and '<
(то есть логический оператор отрицания '
плюс строгий оператор сравнения в противоположном направлении), хотя некоторые версии позволяют использовать более стандартные <=
и >=
соответственно. .
Для отступа строк в блоке DO используются точки ( ), а не пробелы. Команде ELSE не нужен соответствующий IF, так как она работает, проверяя значение во встроенной системной переменной $test
.
Правила области действия MUMPS более разрешительны, чем в других современных языках. Объявленные локальные переменные определяются с помощью стека. Процедура обычно может видеть все объявленные локальные переменные процедур, расположенных ниже нее в стеке вызовов, и процедуры не могут помешать процедурам, которые они вызывают, изменять свои объявленные локальные переменные, если только вызывающий вручную не создает новый уровень стека ( do
) и не присваивает псевдонимы каждой из переменных, которые он хочет защитить ( . new x,y
) перед вызовом любых дочерних процедур. Напротив, необъявленные переменные (переменные, созданные с их использованием, а не объявлением) находятся в области действия для всех процедур, работающих в том же процессе, и остаются в области действия до тех пор, пока программа не завершит работу.
Поскольку ссылки на базу данных MUMPS отличаются от ссылок на внутренние переменные только префиксом в виде каретки, очень легко непреднамеренно отредактировать базу данных или даже удалить «таблицу» базы данных. [20]
Министерство по делам ветеранов США (ранее Управление по делам ветеранов) было одним из первых крупных последователей языка MUMPS. Их работа по развитию (и последующий вклад в свободную кодовую базу приложений MUMPS) оказала влияние на многих медицинских пользователей по всему миру. В 1995 году система приема/отслеживания/выписки пациентов Управления по делам ветеранов, децентрализованная больничная компьютерная программа (DHCP), была удостоена премии Computerworld Smithsonian Award за лучшее использование информационных технологий в медицине. В июле 2006 года Министерство по делам ветеранов (VA) / Управление по охране здоровья ветеранов (VHA) было удостоено премии Innovations in American Government Award, присуждённой Институтом Эша Школы государственного управления имени Джона Ф. Кеннеди в Гарвардском университете за расширение DHCP в Информационные системы и технологическую архитектуру здравоохранения ветеранов ( VistA ). Почти вся система больниц Управления по делам ветеранов в США, Индейская служба здравоохранения и основные части системы больниц Министерства обороны CHCS используют базы данных MUMPS для отслеживания клинических данных.
Другие ИТ-компании в сфере здравоохранения, использующие MUMPS:
Многие референтные лаборатории, такие как DASA, Quest Diagnostics [ 22] и Dynacare, используют программное обеспечение MUMPS, написанное или основанное на коде Antrim Corporation. Antrim был куплен Misys Healthcare (теперь Sunquest Information Systems ) в 2001 году. [23]
MUMPS также широко используется в финансовых приложениях. MUMPS быстро завоевал популярность в финансовом секторе и используется во многих банках и кредитных союзах. Он используется Банком Англии и Barclays Bank . [24] [25] [26]
С 2005 года наиболее популярными реализациями MUMPS были Greystone Technology MUMPS (GT.M) от Fidelity National Information Services и Caché от Intersystems Corporation. Европейское космическое агентство объявило 13 мая 2010 года, что оно будет использовать базу данных InterSystems Caché для поддержки миссии Gaia . Цель этой миссии — составить карту Млечного Пути с беспрецедентной точностью. [27] InterSystems находится в процессе отказа от Caché в пользу Iris. [28]
Другие текущие реализации включают в себя: