Особливості та відмінності мови програмування MSH від MUMPS

Основою для мови MSH послужив мова MUMPS. MUMPS розроблений десь у 80-х роках минулого століття, як втім і багато інші сучасні мови. Він з самого початку розроблявся як мова для створення великих інформаційних систем, роботи з великими розподіленими даними. У зв'язку з чим має деяку специфіку. Програмування на цій мові дещо відрізняється від програмування на інших мовах. Незважаючи на його малу поширеність у нього існує досить стійке співтовариство в різних частинах світу програмістів, що розробляють на ньому інформаційні системи. За час свого існування MUMPS мало змінився. Деякі елементи мови втратили актуальність. І мова на даний момент дещо архаїчна. Хотілося б мати більш сучасний мову подібний MUMPS. З цією метою створювався мова MSH. Деякі концепції мови MSH відрізняються або відсутні в мові MUMPS. В основному для аудиторії MUMS програмістів і написаний даний матеріал, але може й іншим буде цікаво. Константи.MUMPS константи відсутні. У MSH вони введені. Але із-за специфіки мови існувати у вигляді фіксованих змінних часу виконання програми вони не можуть. Тому в MSH вони введені як об'єкти часу компіляції. Що то типу define мови Сі в самому спрощеному вигляді. У момент трансляції мови MSH в Pi код віртуальної машини всі константи у вихідному тексті замінюються їх значеннями. Тобто Pi коді їх вже немає. Константи можуть використовуватися як значення змінних, в якості індексу або імені змінної. Формат команди:Constant nameConst=valConst <,nameConst=valConst>; Праворуч від знака рівності може перебувати тільки константа, вираз не допускається. Ім'я константи повинно бути унікальним і з іменами змінних не перетинатися. Змінні.MUMPS змінні зберігаються в дерев'яною структурою, будь то глобалізації або локалі. Правда у глобалей в MUMPS є невелика відмінність — скорочений синтаксис. У MSH немає скороченого синтаксису. Зберігання даних у вигляді тільки дерева дозволяє уніфікувати звернення до даних. Можна писати програми обробки будь-якого дерева даних. Але в програмах часто доводиться працювати з різними проміжними значеннями і зберігати їх в дереві не ефективно. Доступ до дерева завжди тягне додаткові витрати, як би ми цей доступ не оптимізували. У MSH дані можуть зберігатися як в дерев'яною структурою, так і в одновимірному масиві. В одновимірному масиві краще зберігати проміжні дані, хоча можна зберігати будь-які дані. Доступ до масиву значно швидше, ніж до дерева. Дерево зберігати так звані розряджені дані. Тобто в дереві зберігаються тільки існуючі вершини. Наприклад маємо дерево [1] [5] [78]. Тільки ці вершини і будуть зберігається в дереві. Масив зберігає всі проміжні значення. Наприклад, ми створили 78 елемент в масиві $78. Будуть створені всі елементи в масиві аж до 78. Якщо ми створюємо дерево, то створюється порожній масив і навпаки, якщо створюється масив, то створюється і порожнє дерево. Але це, звичайно, відноситься до поточної реалізації MSH.Видимість змінних в MUMPS має свої особливості. Те що в MUMPS називають глобалями в інших мовах це звернення до баз даних. А ось локалі є аналогом змінних в інших мовах. Ну з глобалями все ясно. Це зовнішні дані і вони доступні з будь-якого завдання даної програми, так і з інших додатків. Зберігаються вони у вигляді файлів і як правило кілька глобалей в одному файлі. У MSH в загальному то все так само за винятком одного моменту. Кожна глобаль зберігається в окремому файлі. А якщо точніше то в декількох файлах одного каталогу. Цей момент важливий з технологічної точки зору побудови інформаційної системи. І ще одне зауваження. Глобалізації в MSH синхронізовані по зверненню. Це означає, що до них можна звертатися одночасно з різних завдань без додаткової синхронізації. Тепер детальніше розберемося з локалями. У загальному випадку локаль у MUMPS є глобальною змінною верхнього рівня в сенсі мови Сі. Аналога змінним з купи в мові Сі, в MUMPS немає. А ось аналог автоматичним змінним мови Сі є. Це локалі перераховані (або не перераховані), в залежності від форми команди, в команді New. Область видимості таких локалей від команди до команди New завершення блок Quit. Оригінальне звичайно рішення обумовлене природою MUMPS і відсутністю в ньому декларацій змінних. На мою думку глобальна область видимості локалей за замовчуванням спірне рішення, хоча й не фатальна. У MUMPS де я в основному працюю безпосередньо з глобалями, локальних змінних не так вже багато і конфлікти імен не часті, хоча і трапляються. Але все ж це не зручно при програмуванні. У MSH прийнятий інший підхід. Команди New тут немає. А локалізація змінних виконана з префіксом. Змінні мають префікс % локалізовані всередині завдання. Змінні мають префікс ^tmp локалізовані всередині додатка. Змінні не мають цих префіксів локалізовані всередині блоку Do. Це стосується однаково як дерев, так і масивів. Об'єкти.MUMPS об'єктів немає. Але ООП отримало повсюдне поширення. Основна маса сучасних мов програмування так чи інакше підтримує ООП. MSH не виняток. Для того щоб було ООП мова повинна мати для початку об'єкти. У загальному випадку опис об'єкт складається з декларативної частини і частини реалізації. MSH не підтримує декларації змінних, значить декларативної частини опису об'єктів не буде. Існує опис об'єкта в MSH у вигляді частині реалізації. У MUMPS код програми представлений у вигляді програмних модулів. Точки входу в модулі є подпрограммами і функціями. Програмний модуль у MSH і взятий в якості опису об'єкта (класу). Мітки модуля є точками входу цього модуля. Точки входу в цьому випадку є публічними властивостями get цього класу. Публічними властивостями set цього класу буде та ж точка входу як і get модифікована певним символом. В якості такого MSH обраний символ крапка «.». У властивості MSH крім доступу get і set є ще операція Kill -видалення властивості. В цьому випадку ім'я властивостей модифікується префіксом «..». Успадкування класів в MSH є множинним і реалізовано за допомогою команди Extend. Класи перераховані в цій команді у порядку слідування є предками даного класу. Під час виконання програми при зверненні до властивості об'єкта його опис спочатку шукається в початковому модулі потім в модулях перерахованих в команді Extent в порядку їх слідування. Більш раннє положення модуля в команді дає йому більший пріоритет. Захищені властивості реалізуються з допомогою системного властивості %this. Об'єкти в MSH можуть знаходитися тільки в дереві. В масиві можуть зберігатися тільки примітивні типи даних.Методи класу так само є точками входу в модулі класу. Створюються об'єкти за допомогою стандартного властивості %new.Наприклад маємо клас Person з властивістю Age. В модулі класу є точки входу «Age» і «.Age».У змінної [1,2] створимо об'єкт.Set [1,2].%new= Person; Звернення до властивості Age об'єкта Person по запису.Set [1,2].Age=50; Звернення до властивості Age об'єкта Person з читання.Set $1=[1,2].Age; Ці команди транслятор перетворює в обігу до подрограммам. Але це не єдиний спосіб звернення до властивостям. По запису до свойсту Age можна звернутися і через метод.Do [1,2].Age(50); В MSH модуль виконує двояку роль. Крім модуля класу він може трактуватися і як модуль програм. У цьому випадку до точок входу звертаються як до подпрограммам. Припустимо в модулі Person є мітка ABC. Тоді до неї можна звернутися до програми. Правда в цьому випадку змінна %this буде порожній.Do Person.ABC(125,D,25.6); Так можна організувати класові методи. Події.Ще однією ефективною парадигмою програмування є події. Як правило мови програмування не містять засобів обробки подій. Вони зазвичай винесені в стандартні бібліотеки. У MUMPS обробка подій в зародковому стані і зводиться до обробки помилок. У MSH події включені в мову. Події можуть бути системними, породженими системою. Так і користувацькими, породженими користувачем за допомогою команди EventTrap. Аргументи цієї команди передаються обробників цієї події.Команда EventCall призначає події програму обробник. У момент виникнення події поточне завдання буде перервано і буде виконана програма обробник в новому блоці Do. Як ніби в цьому місці зустрілася команда Do з викликом цього обробника. Це означає, що локальні змінні виконувалася програми в оброблювачі події будуть недоступні.Команда EventWait зупиняє виконання поточної програми і очікує виникнення події. При виникненні події поточна програма продовжує роботу і з цього моменту в програмі стають доступними передані аргументи. Новий блок Do не створюється і тому всі локальні змінні цього блоку Do доступні після каоманды EventWait.Якщо подія виникла до появи команд EventCall і EventWait. Подія буде оброблено першому командою EventCall або EventWait. Після обробки подія видаляється. Команда EventDelete видаляє подію разом з обробниками.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.