Синтаксис MUMPS
Эта статья написана как личное размышление, личное эссе или аргументативное эссе , в котором излагаются личные чувства редактора Википедии или представлен оригинальный аргумент по определенной теме. ( Март 2022 г. ) |
MUMPS — это высокопроизводительная база данных «ключ-значение» для обработки транзакций со встроенным языком программирования.
MUMPS позволяет отображать в строке несколько команд, сгруппированных в процедуры (подпрограммы) аналогично большинству систем структурированного программирования . Хранение переменных в базе данных (и на других машинах в сети) спроектировано так, чтобы быть простым, не требующим библиотек и использующим те же команды и операторы, которые используются для работы с переменными в оперативной памяти, как и с данными в постоянном хранилище.
История
[ редактировать ]В период с 1975 по 1999 год в языковой стандарт MUMPS вносилось несколько изменений. Комитет ANSI выпускал стандарты в 1977, 1980, 1984, 1990 и 1995 годах. Базовая структура языка осталась неизменной. MUMPS раньше использовался для многопользовательской и многозадачной работы. Сегодня ПК с MUMPS может вести себя так же, как большой миникомпьютер прошлых лет. Ранние версии MUMPS не требовали больших объемов памяти или дисков и поэтому были практичны на машинах меньшего размера, чем требовались некоторые другие системы.
Пробелы
[ редактировать ]В синтаксисе MUMPS некоторые пробелы имеют значение; это не просто пробелы . Пробелы используются в качестве явных разделителей между различными элементами синтаксиса. Например, пробел (называемый «ls» в формальном стандарте MUMPS) отделяет тег в строке от команд, составляющих эту строку. Другим примером является один пробел, отделяющий команду от аргументов этой команды (называемый «cs» в формальном стандарте MUMPS). Если аргумент пуст, команда считается «без аргументов», поскольку за пробелом, отделяющим команду от ее аргумента, сразу следует пробел(ы), отделяющий эту команду от следующей команды. Это означает, что это контекст, в котором пара пробелов имеет другое синтаксическое значение, чем один пробел. Один пробел отделяет команду от ее аргумента, а второй пробел отделяет эту команду от следующей команды.
Однако для ясности между командами всегда можно добавлять дополнительные пробелы, поскольку в этом контексте второй и более пробелов не являются синтаксически значимыми, вплоть до ограничения длины строки в реализации. Символы конца строки имеют синтаксическое значение, поскольку они обозначают конец области действия строки для команд IF, ELSE и FOR.
В отличие от других языков, возврат каретки и перевод строки — это не то же самое, что пробелы; они являются терминаторами линии. Там, где в некоторых языках требуется ставить точки с запятой в конце команд, MUMPS использует пробел или признак конца строки для завершения команды. В то время как в других языках есть более широкие способы группировки команд, такие как операторы и блоки , в MUMPS их нет, есть только строковая область видимости. В отличие от Фортрана и некоторых других языков, в которых были строки фиксированной длины, строки имеют переменную длину до предела реализации (не менее 200 символов, иногда несколько мегабайт). Не существует явного способа продлить или продолжить строку, хотя в некоторых стилях кодирования можно использовать DO без аргументов и еще одну точку в следующей строке.
рутины
[ редактировать ]Типичная процедура M («программа» в терминологии MUMPS) аналогична исходному файлу в C (например, в том, что подпрограммы и функции, относящиеся к конкретной задаче или категории, сгруппированы вместе) и состоит из строк кода MUMPS. Начало строки с метки вместо пробелов создает тег, который можно использовать в качестве цели перехода, вызова процедуры или вызова функции (функции возвращают значения, процедуры — нет). Метку можно использовать вне области действия родительской подпрограммы, добавив имя подпрограммы, разделенное символом каретки <метка>^<подпрограмма> (например, SUBRTN^ABC
).
Файл процедуры может выглядеть следующим образом (для процедуры под названием «sampleproc»):
sampleproc(z) ; a sample routine
write "This is a sample procedure",!
new a,b,c
dosets set a=10,b=20,c=30
do subproc(b)
if z set c=a+c+z
quit c
subproc(y) set a=(a+y)*2 quit
В этом случае метки были прикреплены к первой, четвертой и восьмой строкам, создавая подпрограммы внутри родительской процедуры. Пятая строка выполняет вызов подпрограммы внутри той же самой подпрограммы, называемой «subproc». Любая другая программа также может вызвать эту подпрограмму, полностью указав ее, как do subproc^sampleproc(argument)
. Несмотря на то, что четвертая строка кажется продолжением подпрограммы sampleproc(), ее все равно можно вызвать из других подпрограмм с помощью do dosets^sampleproc
, и выполнение продолжится с игнорированием первой части sampleproc().
Несмотря на то, что sampleproc определен как нуждающийся в аргументе, dosets не нуждается в аргументах, поэтому вы не будете передавать никакие аргументы вDosets. MUMPS также позволяет программисту перейти на произвольную строку внутри подпрограммы. do sampleproc+3^sampleproc
эквивалентно do dosets^sampleproc
. Конечно, z должен быть определен перед вызовом доз, и аналогичным образом любой, вызывающий подпроцесс, должен был бы уже создать «a», поскольку на него есть ссылка, но он не объявлен в качестве аргумента.
Переменные и типы данных
[ редактировать ]MUMPS не требует объявления переменных и не имеет типа: все переменные, включая числа, фактически являются строками. Использование переменных в числовом контексте (например, сложение, вычитание) вызывает четко определенное преобразование в случае, если строка не является каноническим числом, например «123 Main Street».
MUMPS имеет большой набор операторов манипуляции со строками, а его иерархическая система управления переменными распространяется как на переменные в оперативной памяти, так и на дисковые переменные. Резидентные переменные диска (т. е. базы данных) автоматически сохраняются в иерархических структурах. Большинство реализаций используют кэширование, индексы узлов и сжатие имен, чтобы уменьшить затраты времени и пространства на обращения к диску.
Все переменные считаются разреженными массивами . В контексте MUMPS это означает, что существование последовательных узлов не требуется. A(1), A(99)
и A(100)
может использоваться без определения, выделения места или использования какого-либо пространства для узлов со 2 по 98. Действительно, можно даже использовать числа и строки с плавающей запятой ( A(1.2)
, A(3.3)
, A("foo")
и т. д.), где имена индексов имеют какое-то значение, внешнее по отношению к программе. Функция доступа $ORDER ( A(1.2) )
возвращает следующее определенное значение ключа или индекса, в этом примере 3,3, поэтому программа может легко управлять данными. Индексы всегда возвращаются (и обычно сохраняются) в отсортированном порядке.
Учитывая их функции сортировки и именования, индексы и имена переменных нередко используются в качестве хранилищ данных, независимо от каких-либо данных, хранящихся в их местоположениях. Эта функция часто используется для индексов базы данных. Например, SET ^INDEX(lastname,firstname,SSNumber)=RecordNum
.
Глобальная база данных
[ редактировать ]Термин «глобальные переменные » MUMPS не относится строго к переменным без области видимости, как в традиции C. Глобальные переменные MUMPS — это переменные, которые автоматически и прозрачно сохраняются на диске и сохраняются после завершения программы, процедуры или процесса. Глобальные переменные используются точно так же, как обычные переменные, но с префиксом перед именем переменной символа вставки. Модифицируем предыдущий пример следующим образом:
SET ^A("first_name")="Bob"
SET ^A("last_name")="Dobbs"
приводит к созданию новой записи на диске, которая немедленно вставляется в файловую структуру диска. Он является постоянным, так же, как файл сохраняется в большинстве операционных систем. Глобальные переменные хранятся в файлах структурированных данных MUMPS, и доступ к ним осуществляется только как глобальные переменные MUMPS. MUMPS имеет долгую историю кэширования, журналирования и сбалансированного дискового хранилища ключей/значений в виде B-дерева, включая управление транзакциями для «фиксации» и «отката» нескольких файловых транзакций на уровне языка/операционной системы. Реальные базы данных часто могут расти непредсказуемо (например, если у вас есть 20 пациентов с фамилией «Андерсон», прежде чем вы получите кого-то с фамилиями, начинающимися с «B»), но современные реализации MUMPS предназначены для эффективного структурирования базы данных по мере ее роста.
По всем этим причинам одним из наиболее распространенных приложений MUMPS является управление базами данных. MUMPS предоставляет классические свойства ACID как часть любой стандартной реализации MUMPS. FileMan — это пример СУБД, созданной с помощью MUMPS. Реализация InterSystems Caché позволяет двойное представление выбранных структур данных — как глобальных переменных MUMPS или как данных SQL — и имеет встроенный SQL (называемый M/SQL).
Поскольку глобальные переменные MUMPS хранятся на диске, они сразу же становятся видимыми и могут быть изменены любой другой запущенной программой после их создания. Переменные в оперативной памяти, называемые локальными, видны только внутри текущего процесса, и их значение теряется при выходе из процесса. Область действия локальных переменных определяется с помощью ' new
' команда для объявления переменной. Объявление не является обязательным — необъявленная переменная находится в области действия всех подпрограмм, выполняющихся в одном процессе. Объявленная переменная доступна на том уровне стека, на котором она была объявлена, и остается доступной, пока этот уровень стека существует. Это означает, что вызываемая подпрограмма имеет доступ к переменным, доступным в вызывающей подпрограмме. Используя ' new
', подпрограмма может переопределить переменные, которые могла создать вызывающая сторона, и таким образом предотвратить их изменение. Он не может запретить подпрограммам, которые он вызывает, изменять свои собственные переменные, поэтому хорошая практика программирования MUMPS заключается в том, чтобы каждая подпрограмма «новая» использовала переменные, которые она использует.
Многопользовательский, многозадачный, многопроцессорный
[ редактировать ]MUMPS допускал многопользовательскую работу в то время, когда память измерялась килобайтами, время процессора было ограничено, а сами процессоры были значительно медленнее, чем сегодня. Многие реализации MUMPS включали полную поддержку многозадачного, многопользовательского и многомашинного программирования, даже если сама хостовая операционная система этого не делала. Например, один ПК, работающий под управлением MUMPS под MS-DOS и оснащенный несколькими портами RS232, вел себя как большой мини-компьютер, обслуживающий несколько терминалов ASCII, с надлежащим обменом данными и их защитой.
Следующий код демонстрирует, как изменить данные на других компьютерах в сети:
SET ^|"DENVER"|A("first_name")="Bob"
SET ^|"DENVER"|A("last_name")="Dobbs"
что дает A значение, как и раньше, но на этот раз на удаленной машине «ДЕНВЕР».
Еще одним применением MUMPS в последнее время стало создание объектных баз данных . функции . Например, реализация InterSystems Caché изначально включает такие
MUMPS также может генерировать текст в формате HTML или XML и может вызываться через интерфейс CGI для обслуживания веб-страниц непосредственно из базы данных. Его также можно использовать в качестве серверной части для веб-приложений, использующих фоновую связь AJAX .