Синтаксис MUMPS - MUMPS syntax

МАМПЫ синтаксис позволяет размещать несколько команд в строке, сгруппированных в процедуры (подпрограммы) аналогично большинству структурное программирование системы. Хранение переменных в базе данных (и на других машинах в сети) спроектировано так, чтобы быть простым, не требовать библиотек и использовать те же команды и операторы, которые используются для работы с переменными в ОЗУ, что и с данными в постоянном хранилище.

Обзор

В период с 1975 по 1999 год языковой стандарт MUMPS претерпел несколько изменений. Базовая структура языка осталась неизменной. Стандарт языка можно посмотреть на Аннотированные стандарты M (UMPS), с примерами использования в онлайн-книге M (UMPS) на примере. MUMPS раньше использовался для многопользовательской и многозадачной работы. Сегодня ПК с MUMPS может вести себя так же, как большой мини-компьютер прошлых лет. Ранние версии MUMPS не требовали большой памяти или дискового пространства и поэтому были практичны на машинах меньшего размера, чем требовалось для некоторых других систем.

Пробел

В синтаксисе MUMPS некоторые пробелы значимы; они не просто пробел. Пробелы используются как явные разделители между различными элементами синтаксиса. Например, пробел (называемый ls в формальном стандарте MUMPS) отделяет тег в строке от команд, составляющих эту строку. Другой пример - один пробел, отделяющий команду от аргументов этой команды. Если аргумент пуст, команда считается "без аргументов". Это означает, что это контекст, в котором пара пробелов имеет другое синтаксическое значение, чем одно пробел. Один пробел отделяет команду от ее аргумента, а второй пробел отделяет эту команду от следующей команды. Однако для ясности между командами всегда могут быть добавлены дополнительные пробелы, потому что в этом контексте второй и более пробелы не имеют синтаксического значения, вплоть до ограничения длины строки в реализации. Символы конца строки имеют синтаксическое значение, поскольку они обозначают конец области видимости строки для команд IF, ELSE и FOR. В отличие от других языков, возврат каретки и перевод строки - это не то же самое, что пробел; они являются ограничителями линии. Если в некоторых языках есть требование ставить точки с запятой в конце команд, MUMPS использует пробел или знак конца строки для завершения команды. В то время как в других языках есть более широкие способы группировки команд, такие как заявления и блоки, MUMPS не имеет их, только область видимости строки. В отличие от Фортран и в некоторых других языках, в которых были строки фиксированной длины, строки имеют переменную длину до предела реализации. Нет явного способа продлить или продолжить строку.

Процедуры - процедуры MUMPS

Типичная процедура M («подпрограмма» в терминологии MUMPS) аналогична исходному файлу на C (например, в том, что подпрограммы и функции, относящиеся к конкретной задаче или категории, сгруппированы вместе) и состоит из строк кода MUMPS. Метки строк можно использовать для создания внутри подпрограмм, находящихся в памяти, начав строку с метки вместо пробела. Эту же подпрограмму можно использовать вне области видимости родительской подпрограммы, указав метку и имя подпрограммы, разделенные символом вставки (как в SUBRTN ^ ABC).

Файл подпрограммы может выглядеть следующим образом (для подпрограммы с именем 'sampleproc'):

sampleproc (z); образец подпрограммы напишите "Это образец процедуры" ,! new a, b, cdosets set a = 10, b = 20, c = 30 do subproc (b) if z set c = a + c + z quit csubproc (y) set a = (a + y) * 2 quit

В этом случае метки были прикреплены к первой, четвертой и восьмой строкам, создавая подпрограммы внутри родительской подпрограммы. Пятая строка вызывает подпрограмму внутри той же подпрограммы, подпрограмму, называемую 'subproc'. Любая другая программа также может вызвать эту подпрограмму, полностью указав ее, как сделать subproc ^ sampleproc (аргумент). Несмотря на то, что четвертая строка кажется продолжением подпрограммы sampleproc (), ее все еще можно вызывать из других подпрограмм с помощью делать дозы ^ sampleproc, и выполнение будет продолжено с игнорированием первой части sampleproc ().

Несмотря на то, что sampleproc определен как требующий аргумента, доза - нет, поэтому вы не должны передавать аргументы в дозицию. MUMPS также позволяет программисту переходить к произвольной строке внутри подпрограммы. сделать sampleproc + 3 ^ sampleproc эквивалентно делать дозы ^ sampleproc.

Переменные и типы данных

MUMPS не требует объявления переменных и не типизирован: все переменные, включая числа, фактически являются строками. Использование переменных в числовом контексте (например, сложение, вычитание) вызывает четко определенное преобразование в случае, если строка не является каноническим числом, например «123 Main Street».

MUMPS имеет большой набор операторов манипуляции строками, а его иерархическая система управления переменными распространяется как на переменные на основе RAM, так и на диск. Резидентные переменные диска (т. Е. Базы данных) автоматически сохраняются в иерархических структурах. Большинство реализаций используют кэширование, индексы узлов и сжатие имен для уменьшения затрат времени и места на дисковые ссылки.

Все переменные считаются разреженные массивы. В контексте MUMPS это означает, что нет необходимости в существовании последовательных узлов - А (1), А (99) и А (100) может использоваться без определения, выделения пространства или использования пространства для узлов 2–98. Действительно, можно даже использовать числа и строки с плавающей запятой (А (1,2), А (3,3), А ("фу")и т. д.), где имена нижних индексов имеют какое-то значение вне программы. Функция доступа ЗАКАЗ $ (A (1.2)) возвращает следующий определенный ключ или значение нижнего индекса, 3.3 в этом примере, так что программа может легко управлять данными. Индексы всегда возвращаются (и обычно сохраняются) в отсортированном порядке.

Учитывая их функции сортировки и именования, нередко индексы и имена переменных используются в качестве самих хранилищ данных, независимо от каких-либо данных, хранящихся в их местах. Эта функция часто используется для индексов базы данных. Например., SET ^ ИНДЕКС (фамилия, имя, SSNumber) = RecordNum.

Глобальные переменные - база данных

Термин MUMPS глобалы не относится строго к переменным без области видимости, как в традиции C. Глобальные переменные MUMPS - это переменные, которые автоматически и прозрачно сохраняются на диске и сохраняются после завершения программы, процедуры или процесса. Глобальные переменные используются точно так же, как обычные переменные, но с префиксом символа вставки перед именем переменной. Измените предыдущий пример следующим образом:

SET ^ A ("first_name") = "Боб" SET ^ A ("last_name") = "Доббс"

приводит к созданию новой дисковой записи, которая сразу же вставляется в файловую структуру диска. Он постоянен, как и файл в большинстве операционных систем. Глобальные объекты хранятся в файлах структурированных данных с помощью MUMPS и доступны только как глобальные объекты MUMPS. MUMPS имеет долгую историю кэшированного, журналируемого и сбалансированного дискового хранилища ключей / значений B-дерева, включая управление транзакциями для «фиксации» и «отката» нескольких файловых транзакций на уровне языка / операционной системы. Реальные базы данных часто могут расти непредсказуемо (например, иметь 20 пациентов с фамилией «Андерсон» до того, как вы получите кого-либо с фамилией, начинающейся с «B»), но современные реализации MUMPS предназначены для эффективной структурирования базы данных по мере ее роста.

По всем этим причинам одним из наиболее распространенных приложений MUMPS является управление базами данных. MUMPS представляет собой классический КИСЛОТА properties как часть любой стандартной реализации MUMPS. FileMan это пример СУБД, построенной с помощью MUMPS. В InterSystems Caché реализация позволяет двойное представление выбранных структур данных - как глобальные объекты MUMPS или как SQL data - и имеет встроенный SQL (называемый M / SQL).

Переменная область видимости

Поскольку глобальные переменные MUMPS хранятся на диске, они сразу же видны и могут быть изменены любой другой запущенной программой после их создания. Переменные на основе RAM, называемые местные жители видны только внутри текущего запущенного процесса, и их значение теряется при выходе из процесса. Объем локальных переменных определяется с помощью символа 'новый'команда объявить переменная. Объявление не является обязательным - необъявленная переменная входит в область видимости всех подпрограмм, выполняемых в одном процессе. Объявленная переменная доступна в уровень стека он был объявлен и остается доступным, пока существует этот уровень стека. Это означает, что вызываемая процедура имеет доступ к переменным, доступным в ее вызывающей подпрограмме. С использованием 'новый', подпрограмма может повторно объявить переменные, которые, возможно, были созданы ее вызывающей стороной, и тем самым предотвратить их изменение. Он не может помешать вызываемым подпрограммам изменять свои собственные переменные, поэтому хорошая практика программирования MUMPS состоит в том, чтобы каждая подпрограмма «создавала новые» переменные, которые она использует.

Многопользовательский, многозадачный, многопроцессорный

MUMPS позволял многопользовательскую работу в то время, когда память измерялась в килобайтах, время процессора было ограниченным, а сами процессоры были значительно медленнее, чем те, которые используются сегодня. Многие реализации MUMPS включали полную поддержку многозадачного, многопользовательского и многомашинного программирования, даже если хост Операционная система сам не сделал. Например, один ПК, работающий под управлением MUMPS под MS-DOS и оснащенный несколькими портами RS232, ведет себя как большой мини-компьютер, обслуживающий несколько терминалов ASCII, с надлежащим совместным использованием данных и защитой.

Следующий код демонстрирует, как изменять данные на других компьютерах в сети:

SET ^ | "DENVER" | A ("first_name") = "Боб" SET ^ | "DENVER" | A ("last_name") = "Dobbs"

что дает A значение, как и раньше, но на этот раз на удаленной машине "DENVER".

Еще одно использование MUMPS в последнее время заключалось в создании объектные базы данных. В InterSystems Caché реализация, например, изначально включает такие функции.

MUMPS также может генерировать текст в формате HTML или XML и может вызываться через интерфейс CGI для обслуживания веб-страниц непосредственно из базы данных. Его также можно использовать как серверную часть для веб-приложений, использующих AJAX фоновое общение.