Syntaxe MUMPS - MUMPS syntax

Syntaxe MUMPS umožňuje, aby se na řádku zobrazilo více příkazů seskupených do procedur (podprogramů) podobným způsobem jako většina strukturovaných programovacích systémů. Ukládání proměnných v databázi (a na dalších počítačích v síti) je navrženo tak, aby bylo jednoduché, nevyžadovaly žádné knihovny a používaly stejné příkazy a operátory, jaké se používají pro práci s proměnnými v RAM jako s daty v trvalém úložišti.

Přehled

V letech 1975 až 1999 došlo k několika revizím jazykového standardu MUMPS. Základní jazyková struktura zůstala konstantní. Jazykový standard si můžete prohlédnout v Annotated MUMPS Language Standard s příklady použití v online knize The Annotated MUMPS Standards . MUMPS byl dříve používán pro víceuživatelské a víceúčelové práce. Dnes se počítač se systémem MUMPS může chovat stejně jako velký minipočítač minulých let. Dřívější verze MUMPS nevyžadovaly velkou paměť ani kapacitu disku, a proto byly na menších strojích praktické, než vyžadovaly některé jiné systémy.

Mezery

V syntaxi MUMPS jsou některé mezery významné; nejsou pouze mezerami . Mezery se používají jako explicitní oddělovače mezi různými prvky syntaxe. Například mezera (nazývaná ls ve formálním standardu MUMPS) odděluje značku na řádku od příkazů, které tvoří tento řádek. Dalším příkladem je jediný prostor, který odděluje příkaz od argumentů tohoto příkazu. Pokud je argument prázdný, příkaz se považuje za „bez argumentů“. To znamená, že jde o kontext, ve kterém má dvojice prostorů jiný syntaktický význam než jeden prostor. Jedna mezera odděluje příkaz od jeho argumentu a druhá mezera odděluje tento příkaz od dalšího příkazu. Pro lepší přehlednost však mohou být mezi příkazy vždy přidány další mezery, protože v tomto kontextu druhý a více mezer není syntakticky významné, až do limitu délky řádku v implementaci. Znaky konce řádku jsou syntakticky významné, protože označují rozsah konce řádku pro příkazy IF, ELSE a FOR. Na rozdíl od jiných jazyků nejsou návraty vozíku a řádkování stejné jako prázdné znaky; jsou to zakončení řádku. Pokud mají některé jazyky požadavek na konec příkazů umístit středníky, použije MUMPS k ukončení příkazu mezeru nebo zakončení řádku. Všimněte si také, že jiné jazyky mají větší způsoby seskupování příkazů, například příkazů. MUMPS je nemá, pouze rozsah řádků. Na rozdíl od FORTRANu a některých dalších jazyků, které mají řádky s pevnou délkou, neexistuje žádný explicitní způsob prodloužení nebo pokračování řádku. Řádky mají proměnnou délku až do limitu implementace.

Procedury - rutiny MUMPS

Typický postup M („rutina“ v terminologii MUMPS) je analogický se zdrojovým souborem v jazyce C (například v tom, že podprogramy a funkce relevantní pro konkrétní úkol / kategorii jsou seskupeny) a skládá se z řádků kódu MUMPS. Štítky řádků lze použít k vytvoření podprogramů rezidentních v paměti v rámci rutiny spuštěním řádku se štítkem místo mezer. Stejný podprogram lze použít mimo rozsah nadřazené rutiny odkazem na popisek a název rutiny oddělené znakem stříšky (jako v SUBRTN^ABC).

Soubor rutiny může vypadat takto (pro rutinu nazvanou '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

V tomto případě byly štítky připojeny k prvnímu, čtvrtému a osmému řádku a vytvářely tak podprogramy v nadřazené rutině. Pátý řádek provede volání podprogramu ve stejné rutině do podprogramu s názvem 'subproc'. Bylo by také možné, aby jakýkoli jiný program zavolal tento podprogram úplným uvedením jako do subproc^sampleproc(argument). I když se zdá, že čtvrtý řádek je v jiném podprogramu, lze jej stále volat z jiných rutin pomocí do dosets^sampleproca provádění bude pokračovat s ignorovanou první částí sampleproc ().

Přestože je sampleproc definován jako argument, který potřebuje argument, dávky nejsou, takže byste dávkám žádný argument nepředávali. MUMPS také umožňuje programátorovi přeskočit na libovolný řádek v podprogramu. do sampleproc+3^sampleprocje ekvivalentní k do dosets^sampleproc.

Proměnné a datové typy

MUMPS nevyžaduje deklaraci proměnných a je bez typu: všechny proměnné, včetně čísel, jsou efektivně řetězce. Použití proměnných v číselném kontextu (např. Sčítání, odčítání) vyvolá dobře definovaný převod v případě, že řetězec není kanonickým číslem, například „123 Main Street“.

MUMPS má velkou sadu operátorů manipulace s řetězci a jeho systém správy hierarchických proměnných se rozšiřuje na proměnné založené na paměti RAM i na disku. Rezidentní proměnné disku (tj. Databáze) se automaticky ukládají do hierarchických struktur. Většina implementací používá ukládání do mezipaměti, indexy uzlů a kompresi názvů ke snížení časových / prostorových nákladů na odkazy na disk.

Všechny proměnné se považují za „řídká“ pole. V kontextu MUMPS to znamená, že neexistuje žádný požadavek na existenci sekvenčních uzlů - A(1), A(99)a A(100)lze je použít bez definování, přidělení prostoru nebo použití jakéhokoli prostoru pro uzly 2 až 98. Ve skutečnosti lze dokonce použít čísla s plovoucí desetinnou čárkou a řetězce ( A(1.2), A(3.3), A("foo")atd.), kde názvy dolního indexu mají nějaký význam mimo program. Funkce přístupu $ORDER ( A(1.2) )vrací další definovanou hodnotu klíče nebo dolní index, v tomto příkladu 3,3, takže program může snadno spravovat data. Dolní indexy jsou vždy vráceny (a obvykle uloženy) v seřazeném pořadí.

Vzhledem k jejich funkcím řazení a pojmenování není neobvyklé, že se názvy dolních indexů / proměnných používají jako samotné datové sklady, nezávisle na jakýchkoli datech uložených na jejich místech. Tato funkce se často používá pro databázové indexy. Např SET ^INDEX(lastname,firstname,SSNumber)=RecordNum.

Globální proměnné - databáze

Termín příušnice globals netýká striktně unscoped proměnných, jako je tomu v C tradici. MUMPS Globals jsou proměnné, které se automaticky a transparentně ukládají na disk a přetrvávají i po dokončení programu, rutiny nebo procesu. Globály se používají přesně jako běžné proměnné, ale se znakem stříšky před názvem proměnné. Úpravy předchozího příkladu následujícím způsobem

SET ^A("first_name")="Bob"
SET ^A("last_name")="Dobbs"

má za následek vytvoření nového záznamu na disku, který je okamžitě vložen do struktury souborů na disku. Je trvalý, stejně jako soubor přetrvává ve většině operačních systémů. Globály jsou ukládány do souborů strukturovaných dat pomocí MUMPS a jsou přístupné pouze jako globály MUMPS. MUMPS má dlouhou historii mezipaměti, žurnálovaného a vyváženého úložiště klíčů / hodnot B-stromu, včetně kontroly transakcí pro více transakcí se soubory „commit“ a „roll-back“ na úrovni jazyka / operačního systému. Skutečné databáze mohou často nepředvídatelně růst (například mít 20 pacientů s příjmením „Anderson“, než získáte příjmení začínající písmenem „B“), ale moderní implementace MUMPS jsou navrženy tak, aby efektivně strukturovaly databázi, jak roste.

Ze všech těchto důvodů je jednou z nejběžnějších aplikací MUMPS správa databází. MUMPS poskytuje klasické vlastnosti KYSELIN jako součást jakékoli standardní implementace MUMPS. FileMan je příkladem systému DBMS vytvořeného pomocí MUMPS. Implementace Caché společnosti Intersystems umožňuje duální pohledy na vybrané datové struktury - jako globály MUMPS nebo jako data SQL - a má zabudovaný SQL (nazývaný M / SQL).

Variabilní rozsah

Vzhledem k tomu, že globální proměnné MUMPS jsou uloženy na disku, jsou ihned po vytvoření viditelné a upravitelné jakýmkoli jiným spuštěným programem. Proměnné založené na paměti RAM, zvané místní, jsou viditelné pouze uvnitř aktuálně spuštěného procesu a jejich hodnota se při ukončení procesu ztratí. Rozsah místních proměnných se určuje pomocí příkazu ' new' k deklaraci proměnné. Deklarace je volitelná - nedeklarovaná proměnná je v rozsahu pro všechny rutiny běžící ve stejném procesu. Deklarovaná proměnná je přístupná na úrovni zásobníku, která byla deklarována, a zůstane přístupná, pokud tato úroveň zásobníku existuje. To znamená, že volaná rutina má přístup k proměnným dostupným ve své volací rutině. Pomocí příkazu ' new' může rutina znovu deklarovat proměnné, které mohl vytvořit volající, a zabránit tak jejich úpravám. Nemůže zabránit rutinám, které volá, v úpravě vlastních proměnných, takže dobrou praxí programování MUMPS je mít každou rutinu „novou“ proměnnou, kterou používá.

Více uživatelů, více úkolů, více procesorů

MUMPS umožňoval provoz více uživatelů v době, kdy byla paměť měřena v kilobajtech, čas procesoru byl omezený a samotné procesory byly podstatně pomalejší než dnes. Mnoho implementací MUMPS zahrnovalo plnou podporu pro multi-tasking, multi-user, multi-stroj programování, i když hostitelský operační systém sám ne. Například jeden počítač se systémem MUMPS v systému MS-DOS a vybavený několika porty RS232 se choval jako velký minipočítač obsluhující více terminálů ASCII se správným sdílením a ochranou dat.

Následující kód ukazuje, jak změnit data v jiných počítačích v síti:

SET ^|"DENVER"|A("first_name")="Bob"
SET ^|"DENVER"|A("last_name")="Dobbs"

což dává A hodnotu jako předtím, ale tentokrát na vzdáleném stroji „DENVER“.

Dalším využitím MUMPS v poslední době bylo vytváření databází objektů . Například implementace Caché společnosti Intersystems obsahuje tyto funkce nativně.

MUMPS může také generovat text ve formátu HTML nebo XML a lze jej vyvolat prostřednictvím rozhraní CGI a obsluhovat webové stránky přímo z databáze. Může být také použit jako backend pro webové aplikace využívající komunikaci na pozadí AJAX .