Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Описывать преимущества языка программирования задача неблагодарная и наврятли выполнимая. В свое время я написал на эту тему несколько статей. Все они были приняты общественностью очень прохладно. Те кто никогда не программировал на MUMPS ничего не поняли, мои доводы о преимуществе этого языка вызвали только недоумение. Те кто выучился на традиционных языках с трудом осваивают другие принципы. А для тех кто программировал на MUMPS мои рассуждения показались тривиальными и абсолютно очевидными. Оценить преимущества и недостатки языка невозможно основываясь только на наборе слов, какими бы правильными они не были. Любое познание это работа и не выполнив ее оценить язык нельзя. Все языки разные и как бы они не были похожи, чтобы начать на них программировать, надо погрузиться в их среду. А если языки разные то и затраты труда значительно возрастают. Доморощенные языки программирования возникают постоянно. Я себя так же отношу к их числу. И всегда на форумах авторам этих языков задают вопрос об их преимуществе перед другими языками. И не разу я не встречал вразумительного ответа на этот вопрос. Ответы обычно бывают скорее эмоциональные, чем вразумительные. Мол мне так нравится.
Но я все таки попытаюсь в очередной раз ответить на этот вопрос. Я ведь тоже себе его задаю. Изложение не будет коротким и потому прошу терпения.
Мое мнение это не истина в последней инстанции, но именно его я и попытаюсь изложить.
Далее я поведу речь о языке MUMPS хотя статья о языке MSH. MSH это логическое продолжение языка MUMPS и почти все что говорится о MUMPS в равной степени относится и к MSH. Такое изложение принято по причине того что MUMPS это реально работающая система, а MSH это еще только проект. Все что будет сказано о MUMPS легко проверить. Особенности MSH будут рассмотрены отдельно.
Чтобы что нибудь понять в настоящем, нужно заглянуть в прошлое. Появление первых трансляторов открыло новую эру в программировании. Свойства ЭВМ того времени наложили глубокий отпечаток на свойства трансляторов. Яркий представитель это Фортран. Трансляторы строились с учетом возможностей тех ЭВМ и несмотря на то что возможности изменились свойства в языках сохранились. Процесс создания языков программирования мне напоминает хаотичный процесс, когда языки создавались под конкретный проект, затем получали широкое распространение, по случайным причинам. А затем уже на их основе возникало великое множество других языков. Эти новые языки сохраняли рудименты тех первых языков программирования. Я конечно имею ввиду язык Си. А под рудиментами я подразумеваю систему типов. В ЯваСкрипте, PHP и других языках попытались ослабить систему типов, но попытка явно не доведена до своего логического конца.
Конечно к счастью все было не так однообразно. Были и языки которые разработаны на основе какой то идеи. Это такие языки как Кабол, Лисп и MUMPS. Идеи Кабола и Лиспа я не считаю перспективными и поэтому перейдем к MUMPS. Этот язык так же создавался под конкретный проект. Информационную систему и это свойство в нем заложено генетически. Я снимаю шляпу перед неизвестными мне создателями этого языка. Они полностью проигнорировали возможности современных для них ЭВМ и разработали язык исходя только из потребности создания информационных систем. Простота и надежность языка в большой степени определяется количеством сущностей, имеющихся в этом языке. Чем их меньше, тем проще и надежней язык. Но это требование вступает в противоречие с другим требованием к широкой функциональности и гибкости языка. Найти приемлемый баланс между этих ними и есть основная задача языка программирования. В MUMPS с моей точки зрения такой баланс найден идеально для разработки информационной системы. В основу языка положены данные. Это тот стержень вокруг которого построен весь язык. Данные в MUMPS представлены в виде только одной сущности. В виде Дерева. Это позволило полностью абстрагироваться от содержательной части данных. В дереве хранятся любые данные независимо от того что они из себя представляют. Да это и не важно до тех пор, пока мы не станем выполнять над ними операции. Но на этот случай разработчики придумали другое решение. Любое значение имеет три формы: строковую, числовую и логическую и в зависимости от операции операнды операции и результат приводится к необходимой форме. Структура данных в виде дерева позволяет легко моделировать на ней любые другие структуры. Структура дерева выбрана не случайно. Универсальность дерева и имеющиеся способы хранения позволяют осуществлять оптимальное обращение к данным. Разработчики пошли дальше они и внешние данные представили таком же виде. То есть все данные представлены в виде только одной сущности — дерева.
Выбор такой организации данных имеет более глубокие последствия, чем может показаться на первый взгляд.
Управление данными в современных языках программирования является очень серьезной проблемой. Если управление данными на стеке еще можно признать удовлетворительной. То управление данными в куче уже нельзя. Попытка решить проблему с помощью сборщика мусора очень сомнительна. Запускается сборщик в случайное или заданное неизвестными алгоритмами моменты времени, с такими же случайными результатами их деятельности. В системах реального времени вообще неизвестно как их использовать. Применение сборщика никак не решает проблему фрагментации кучи и утечку памяти. В общем с моей точки зрения сборщик мусора плохое решение. Несмотря на это оно стало применяться в современных языках программирования все чаще. Я думаю от безисходности. Ручное управление данными это вообще катастрофа. Именно оно создает основную проблему во многих языках программирования. Основная масса ошибок порождена ручным управлением данными и как следствие сумасшедшим временем отладки и сопровождения. Проблема утечки памяти и фрагментации кучи представлена в этом случае во всей своей полноте. Именно из за нее мы имеем горы неотлаженных систем начиная с операционных систем. И эти системы в принципе не могут быть отлажены. Нам и в будущем предстоит жить в этом хаосе.
Только MUMPS благодаря своей организации данных не имеет этой проблемы. Данными полностью управляет язык. Никакого доступа к адресам значений программист не имеет. Более того значение может храниться в разные моменты времени в разных местах. Система не гарантирует место нахождения значения, но гарантирует надежный доступ к нему. Это фундаментальное свойство MUMPS является его главным достоинством и вытекает из организации его данных. Ни одна система ни со статической типизацией, ни с динамической этими свойствами обладать не может.
Организация данных в MUMPS имеет для самого языка фундаментальное значение. Для программирования на нем надо перестроить свое мышление. Первичны в этом языке данные и они требуют первоочередного внимания. Как будут спроектированы деревья от этого зависит все свойства будущей системы. Разговор о проектировании деревьев отдельная и очень важная тема, но для другого разговора. Если деревья спроектированы, дальше остается только написать программы их обслуживания. Работа с деревьями в языке ведется напрямую и поэтому промежуточных переменных минимум или почти нет. Проблемы типов в этом языке нет по определению. В MUMPS сообществе не подозревают о существовании проблемы типизации. Все входные данные всегда необходимо проверять, а для промежуточных данных спутать в программе число со строкой это еще надо умудриться. Хотя и это не приводит к фатальным последствиям из за наличия разных форм у значения. Для MUMPS Дерево это все. Это и структура хранения и управления данными и метод проектирования информационной системы. Перестрой ка мышления серьезная проблема, которая многим программистам закрыла дорогу в мир MUMPS. Но преодоление этой проблемы откроет дорогу в прекрасный и эффективный мир MUMPS.
Но деревья не единственное достоинство языка MUMPS. Сам язык спроектирован с учетом баланса простоты и функциональности очень удачно. При минимальном количестве сущностей язык имеет широкие функциональные возможности. По гибкости язык превосходит все известные мне языки. Здесь почти нет ограничения на применение переменной вместо константы. Конструкция языка допускает применение переменных в любых командах. Язык очень компактный, простой и предельно ясный. Его полное описание с примерами и объяснениями помещалось в тоненькой книжечке на 20 листов. И оно было исчерпывающим. Язык не имеет подводных камней и различных трактовок в зависимости от способа описания. В нем минимизировано количество недопустимых конструкций. Нет особого поведения в различных ситуациях. Достаточно разобраться с командами и можно начинать писать надежные программы.
В MUMPS уникальный набор команд. Еще в прошлом веке на заре создания первых языков в MUMPS на уровне языка была разработана лучшая до сих пор система асинхронного выполнения заданий. Очень простая и эффективная. Это команда Job, запускающая отдельное параллельное задание. Эта команда по синтаксису соответствует команде вызова подпрограмм с возможностью передавать параметры в задание обыкновенным списком параметров. Сами вызываемые задания по синтаксису ничем не отличаются от подпрограмм. Это также обычные метки в программном модуле. Эти подпрограммы могут быть вызваны как вызовом подпрограммы, так и вызовом задания. Другим средством обеспечивающим асинхронное выполнение являются команды чтения записи со временем ожидания. Команда блокировки Lock.
В MUMPS имеется распределенная система данных. Из MUMPS программы можно обращаться к дереву находящемуся на другом конце света как к своему дереву. Уникальную гибкость языку придает наличие в языке команды XECUTE и такие конструкции языка как косвенный синтаксис. Команда XECUTE позволяет выполнить любые конструкции языка MUMPS переданные команде в виде строки. Команда транслирует строку и затем исполняет ее. Подобная команда мне встретилась только в JavaScript но там она является инородным телом и навряд ли может быть использована из за свойств самого языка. Подобные попытки насколько мне известно предпринимались и в некоторых реализациях языка Паскаль. Насколько эти попытки были удачными я не знаю, готовых реализаций я не встречал. Но понятно что такая необходимость имеется. Косвенный синтаксис так же предает языку гибкость. Имя переменной следующая за знаком косвенного синтаксиса трактуется как переменная значение которой и используется в конструкции языка вместо имени переменной. Язык не имеет ссылок это ограничивает его возможности при передачи фактических параметров в программы. Эта проблема в MUMPS была успешно решена путем передачи не только значений переменных, но их имен. Среди фактических параметров может быть передано имя переменной, над которой и будут производиться манипуляции в вызванной программе. Само понятие ссылки стало не нужным. Наличие ссылок в языках программирования колосальная проблема и это один из основных факторов порождения ошибок и как следствие ненадежности языков программирования. Системы основанные на использовании ссылочных данных не могут быть надежными по определению. В MUMPS есть и менее значительные, но тем не менее приятные конструкции. В MUMPS все конструкции языка соответствуют своим командам, в нем нет отдельного выражения присвоения значения переменной. Такое выражение присутствует в команде Set. Почти на любую команду, в том числе команду Set может быть наложено условие ее выполнения и тогда она будет выполняться только при истинности такого условия. Это придает языку большую гибкость. Те кто программируют на MUMPS широко пользуются этой возможностью. Эта возможность расширяет гибкость управления ходом выполнения программы.
Про систему обработки ошибок в MUMPS можно сказать только то что она существует. Система команд простая и ясная, логически очень понятная и очевидная.
Совокупностью подобными свойствами не обладает ни один язык программирования. Все эти свойства языка делают его эффективным и надежным средством. Разработка, сопровождение и внедрение систем на MUMPS требует на порядки меньше затрат труда по сравнению с системами написанными на других языках программирования.
Теперь о грустном. Мы покидаем наш почти идеальный мир и спускаемся в нашу грустную реальность.
Языка программирования MUMPS как самостоятельной сущности не существует. Сейчас мы имеем коммерческие реализации базы данных с привязанным к ним MUMPS. Это CACHE и miniM. Широкого распространения они не получили по понятным причинам связанным с необходимостью оплачивать как лицензии на фиксированный набор ресурсов так и техническую поддержку. Существует и довольно надежная и бесплатная база данных с MUMPS. Это GTM но она локализована только в Linux. Сегодня существующее положение поставлено с ног на голову. Положение языка MUMPS аховое. Область его использования стремительно сокращается по вине разработчиков систем MUMPS.
Язык MUMPS должен быть создан как полнофункциональный язык программирования. Все необходимые свойства у него имеются. Хотя в таком виде каком он существует сейчас это навряд ли целесообразно.
Последний стандарт MUMPS был выпущен в 1995 году и он принципиально мало чем отличался от предыдущей редакции. Стандартизация это хорошая вещь она позволила долгое время сохранять приемственность программного обеспечения. Затруднила размытие принципов языка при реализации языка. Но стандартизация имеет и обратную сторону. Она замораживает развитие языка. В языке накапливаются устаревшие конструкции, новые идеи не получают поддержки и это приводит к деградации и постепенному отмиранию языка. Период эволюционного развития заканчивается и для сохранения языка необходим качественный скачек.
В состоянии застоя и находится MUMPS. Архаичность языка бросается в глаза с первым же знакомством с MUMPS. Но достоинства MUMPS никуда не делись. Необходимо только доработать синтаксис языка, доведя его до современных требований. И разработать реализацию именно языка, а не базы данных.
Такую доработку я выполнил, создав язык MSH. Потратил на это я десятилетия. В язык было добавлено объектное программирование, обработка событий, передача в подпрограммы переменного числа параметров, команды наследования и константы, команда Case и операция выбора, итераторы по обходу данных и понятие блочных команд. Доработана команда Lock, расширена ее функциональность за счет блокировки по чтению и записи. Изменен косвенный синтаксис и система локализации переменных. Изменен синтаксис связанный с применением пробелов в командах. В таком виде это вполне современный язык. Осталось только реализовать его. Работу по реализации этого проекта я уже начал. Работоспособность языка уже проверил.
Более детально с изменениями языка MSH по сравнению с языком MUMPS можно познакомиться в статье на Хабре или тут.